From 84b422a120e769f39cbd665d7583967db274ba1e Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Fri, 8 Jan 2021 11:42:04 -0500 Subject: [PATCH 01/38] ui: Refactor AdvancedMultiSelect as a class AdvancedMultiSelect can be broken up and composed of smaller, more focused components. This commit refactors AdvancedMultiSelect from a functional component to a class component. --- .../ui-components/AdvancedMultiSelect.js | 162 ++++++++++-------- 1 file changed, 87 insertions(+), 75 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 9c1468d8d..38e52271e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,5 +1,4 @@ -import React, {useState} from 'react'; - +import React from "react"; import {Card, Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; @@ -22,14 +21,6 @@ function getSelectValuesAfterClick(valueArray, clickedValue) { } } -function onMasterCheckboxClick(checkboxValue, defaultArray, onChangeFnc) { - if (checkboxValue) { - onChangeFnc([]); - } else { - onChangeFnc(defaultArray); - } -} - // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function function getFullDefinitionsFromRegistry(refString, registry) { @@ -46,76 +37,97 @@ function getFullDefinitionByKey(refString, registry, itemKey) { return fullArray.filter(e => (e.enum[0] === itemKey))[0]; } -function setPaneInfo(refString, registry, itemKey, setPaneInfoFnc) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); - setPaneInfoFnc({title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}); -} - function getDefaultPaneParams(refString, registry) { let configSection = getObjectFromRegistryByRef(refString, registry); return ({title: configSection.title, content: configSection.description}); } -function AdvancedMultiSelect(props) { - const [masterCheckbox, setMasterCheckbox] = useState(true); - const { - schema, - id, - options, - value, - required, - disabled, - readonly, - multiple, - autofocus, - onChange, - registry - } = props; - const {enumOptions} = options; - const [infoPaneParams, setInfoPaneParams] = useState(getDefaultPaneParams(schema.items.$ref, registry)); - getDefaultPaneParams(schema.items.$ref, registry); - const selectValue = cloneDeep(value); - return ( - <div className={'advanced-multi-select'}> - <Card.Header> - <Button key={`${props.schema.title}-button`} value={value} - variant={'link'} disabled={disabled} - onClick={() => { - onMasterCheckboxClick(masterCheckbox, schema.default, onChange); - setMasterCheckbox(!masterCheckbox); - }} - > - <FontAwesomeIcon icon={masterCheckbox ? faCheckSquare : faSquare}/> - </Button> - <span className={'header-title'}>{props.schema.title}</span> - </Card.Header> - <Form.Group - style={{height: `${getComponentHeight(enumOptions.length)}px`}} - id={id} - multiple={multiple} - className='choice-block form-control' - required={required} - disabled={disabled || readonly} - autoFocus={autofocus}> - {enumOptions.map(({value, label}, i) => { - return ( - <Form.Group - key={i} - onClick={() => setPaneInfo(schema.items.$ref, registry, value, setInfoPaneParams)}> - <Button value={value} variant={'link'} disabled={disabled} - onClick={() => onChange(getSelectValuesAfterClick(selectValue, value))}> - <FontAwesomeIcon icon={selectValue.includes(value) ? faCheckSquare : faSquare}/> - </Button> - <span className={'option-text'}> - {label} - </span> - </Form.Group> - ); - })} - </Form.Group> - <InfoPane title={infoPaneParams.title} body={infoPaneParams.content} link={infoPaneParams.link}/> - </div> - ); +class AdvancedMultiSelect extends React.Component { + constructor(props) { + super(props) + this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; + this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + } + + onMasterCheckboxClick() { + if (this.state.masterCheckbox) { + this.props.onChange([]); + } else { + this.props.onChange(this.props.schema.default); + } + + this.toggleMasterCheckbox(); + } + + toggleMasterCheckbox() { + this.setState((state) => ({ + masterCheckbox: !state.masterCheckbox + })); + } + + setPaneInfo(refString, registry, itemKey) { + let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + } + render() { + const { + schema, + id, + options, + value, + required, + disabled, + readonly, + multiple, + autofocus, + onChange, + registry + } = this.props; + const {enumOptions} = options; + getDefaultPaneParams(schema.items.$ref, registry); + const selectValue = cloneDeep(value); + return ( + <div className={'advanced-multi-select'}> + <Card.Header> + <Button key={`${schema.title}-button`} value={value} + variant={'link'} disabled={disabled} + onClick={this.onMasterCheckboxClick}> + <FontAwesomeIcon icon={this.state.masterCheckbox ? faCheckSquare : faSquare}/> + </Button> + <span className={'header-title'}>{schema.title}</span> + </Card.Header> + <Form.Group + style={{height: `${getComponentHeight(enumOptions.length)}px`}} + id={id} + multiple={multiple} + className='choice-block form-control' + required={required} + disabled={disabled || readonly} + autoFocus={autofocus}> + { + enumOptions.map(({value, label}, i) => { + return ( + <Form.Group + key={i} + onClick={() => this.setPaneInfo(schema.items.$ref, registry, value)}> + + <Button value={value} variant={'link'} disabled={disabled} + onClick={() => onChange(getSelectValuesAfterClick(selectValue, value))}> + + <FontAwesomeIcon icon={selectValue.includes(value) ? faCheckSquare : faSquare}/> + </Button> + <span className={'option-text'}> + {label} + </span> + </Form.Group> + ); + } + )} + </Form.Group> + <InfoPane title={this.state.infoPaneParams.title} body={this.state.infoPaneParams.content} link={this.state.infoPaneParams.link}/> + </div> + ); + } } export default AdvancedMultiSelect; From af329d56d826a5092cb3a2535bf0de65bd14600f Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Fri, 8 Jan 2021 16:18:24 -0500 Subject: [PATCH 02/38] ui: Factor MasterCheckbox() out of AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 38e52271e..b875a6426 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -42,6 +42,27 @@ function getDefaultPaneParams(refString, registry) { return ({title: configSection.title, content: configSection.description}); } +function MasterCheckbox(props) { + const { + title, + value, + disabled, + onClick, + checkboxState + } = props; + + return ( + <Card.Header> + <Button key={`${title}-button`} value={value} + variant={'link'} disabled={disabled} + onClick={onClick}> + <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare} /> + </Button> + <span className={'header-title'}>{title}</span> + </Card.Header> + ); +} + class AdvancedMultiSelect extends React.Component { constructor(props) { super(props) @@ -69,6 +90,7 @@ class AdvancedMultiSelect extends React.Component { let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); } + render() { const { schema, @@ -88,14 +110,9 @@ class AdvancedMultiSelect extends React.Component { const selectValue = cloneDeep(value); return ( <div className={'advanced-multi-select'}> - <Card.Header> - <Button key={`${schema.title}-button`} value={value} - variant={'link'} disabled={disabled} - onClick={this.onMasterCheckboxClick}> - <FontAwesomeIcon icon={this.state.masterCheckbox ? faCheckSquare : faSquare}/> - </Button> - <span className={'header-title'}>{schema.title}</span> - </Card.Header> + <MasterCheckbox title={schema.title} value={value} + disabled={disabled} onClick={this.onMasterCheckboxClick} + checkboxState={this.state.masterCheckbox} /> <Form.Group style={{height: `${getComponentHeight(enumOptions.length)}px`}} id={id} From 878f959a8f697b05fa35e48221692278f1b8250d Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Mon, 11 Jan 2021 19:11:27 -0500 Subject: [PATCH 03/38] ui: Factor ChildCheckbox out of AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 191 ++++++++++-------- 1 file changed, 107 insertions(+), 84 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index b875a6426..7507f234f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -10,17 +10,6 @@ import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; -function getSelectValuesAfterClick(valueArray, clickedValue) { - if (valueArray.includes(clickedValue)) { - return valueArray.filter((e) => { - return e !== clickedValue; - }); - } else { - valueArray.push(clickedValue); - return valueArray; - } -} - // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function function getFullDefinitionsFromRegistry(refString, registry) { @@ -56,95 +45,129 @@ function MasterCheckbox(props) { <Button key={`${title}-button`} value={value} variant={'link'} disabled={disabled} onClick={onClick}> - <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare} /> + <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> </Button> <span className={'header-title'}>{title}</span> </Card.Header> ); } +function ChildCheckbox(props) { + const { + onPaneClick, + onClick, + value, + disabled, + label, + checkboxState + } = props; + + return ( + <Form.Group onClick={() => onPaneClick(value)}> + <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> + <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> + </Button> + <span className={'option-text'}> + {label} + </span> + </Form.Group> + ); +} + class AdvancedMultiSelect extends React.Component { - constructor(props) { - super(props) - this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; - this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + constructor(props) { + super(props) + this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; + this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); + this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); + } + + onMasterCheckboxClick() { + if (this.state.masterCheckbox) { + this.props.onChange([]); + } else { + this.props.onChange(this.props.schema.default); } - onMasterCheckboxClick() { - if (this.state.masterCheckbox) { - this.props.onChange([]); - } else { - this.props.onChange(this.props.schema.default); - } + this.toggleMasterCheckbox(); + } - this.toggleMasterCheckbox(); + onChildCheckboxClick(value) { + this.props.onChange(this.getSelectValuesAfterClick(value)); + } + + getSelectValuesAfterClick(clickedValue) { + const valueArray = cloneDeep(this.props.value); + + if (valueArray.includes(clickedValue)) { + return valueArray.filter((e) => { + return e !== clickedValue; + }); + } else { + valueArray.push(clickedValue); + return valueArray; } + } - toggleMasterCheckbox() { - this.setState((state) => ({ - masterCheckbox: !state.masterCheckbox - })); - } + toggleMasterCheckbox() { + this.setState((state) => ({ + masterCheckbox: !state.masterCheckbox + })); + } - setPaneInfo(refString, registry, itemKey) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); - this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); - } + setPaneInfo(refString, registry, itemKey) { + let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + } - render() { - const { - schema, - id, - options, - value, - required, - disabled, - readonly, - multiple, - autofocus, - onChange, - registry - } = this.props; - const {enumOptions} = options; - getDefaultPaneParams(schema.items.$ref, registry); - const selectValue = cloneDeep(value); - return ( - <div className={'advanced-multi-select'}> - <MasterCheckbox title={schema.title} value={value} - disabled={disabled} onClick={this.onMasterCheckboxClick} - checkboxState={this.state.masterCheckbox} /> - <Form.Group - style={{height: `${getComponentHeight(enumOptions.length)}px`}} - id={id} - multiple={multiple} - className='choice-block form-control' - required={required} - disabled={disabled || readonly} - autoFocus={autofocus}> - { - enumOptions.map(({value, label}, i) => { - return ( - <Form.Group - key={i} - onClick={() => this.setPaneInfo(schema.items.$ref, registry, value)}> + render() { + const { + schema, + id, + options, + value, + required, + disabled, + readonly, + multiple, + autofocus, + onChange, + registry + } = this.props; - <Button value={value} variant={'link'} disabled={disabled} - onClick={() => onChange(getSelectValuesAfterClick(selectValue, value))}> + const {enumOptions} = options; + getDefaultPaneParams(schema.items.$ref, registry); - <FontAwesomeIcon icon={selectValue.includes(value) ? faCheckSquare : faSquare}/> - </Button> - <span className={'option-text'}> - {label} - </span> - </Form.Group> - ); - } - )} - </Form.Group> - <InfoPane title={this.state.infoPaneParams.title} body={this.state.infoPaneParams.content} link={this.state.infoPaneParams.link}/> - </div> - ); - } + return ( + <div className={'advanced-multi-select'}> + <MasterCheckbox title={schema.title} value={value} + disabled={disabled} onClick={this.onMasterCheckboxClick} + checkboxState={this.state.masterCheckbox}/> + <Form.Group + style={{height: `${getComponentHeight(enumOptions.length)}px`}} + id={id} + multiple={multiple} + className='choice-block form-control' + required={required} + disabled={disabled || readonly} + autoFocus={autofocus}> + { + enumOptions.map(({value, label}, i) => { + return ( + <ChildCheckbox key={i} onPaneClick={this.setPaneInfo} + onClick={this.onChildCheckboxClick} value={value} + disabled={disabled} label={label} checkboxState={this.props.value.includes(value)}/> + ); + } + )} + </Form.Group> + <InfoPane title={this.state.infoPaneParams.title} + body={this.state.infoPaneParams.content} + link={this.state.infoPaneParams.link}/> + </div> + ); + } } export default AdvancedMultiSelect; From 19bc09196f22e6c1f65e3fd9190c894c4d621a20 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Mon, 11 Jan 2021 20:24:50 -0500 Subject: [PATCH 04/38] ui: Enable mixed-state behavior for master checkbox in AdavncedMultiSelect The AdvancedMultiSelect should adhere to some set of human interface guidelines. In the absence of a formal, agreed upon set of guidelines for Infection Monkey, this commit uses KDE's guidelines for checkboxes: https://hig.kde.org/components/editing/checkbox.html When child checkboxes are not all checked, the master checkbox displays a mixed-state icon, instead of a checked icon. Clicking the mixed-state icon checks all child checkboxes. Clicking an unchecked master checkbox also enables all child checkboxes. In the past, clicking an unchecked master checkbox checked only the *default* child checkboxes. While this may seem desirable so that unsafe exploits do not accidentally get selected by the user, it will confuse and frustrate users, as master/child checkboxes do not normally function this way. If there is concern that users may unknowingly select unsafe exploits/options, we should pop up a warning to inform the user when the config is saved/submitted. Issue #891 --- .../ui-components/AdvancedMultiSelect.js | 60 ++++++++++++++----- 1 file changed, 44 insertions(+), 16 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 7507f234f..db759b013 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -2,6 +2,7 @@ import React from "react"; import {Card, Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faMinusSquare} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; import {cloneDeep} from 'lodash'; @@ -9,6 +10,12 @@ import {getComponentHeight} from './utils/HeightCalculator'; import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; +const MasterCheckboxState = { + NONE: 0, + MIXED: 1, + ALL: 2 +} + // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function @@ -40,12 +47,19 @@ function MasterCheckbox(props) { checkboxState } = props; + var newCheckboxIcon = faCheckSquare; + + if (checkboxState == MasterCheckboxState.NONE) + newCheckboxIcon = faSquare; + else if (checkboxState == MasterCheckboxState.MIXED) + newCheckboxIcon = faMinusSquare; + return ( <Card.Header> <Button key={`${title}-button`} value={value} variant={'link'} disabled={disabled} onClick={onClick}> - <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> + <FontAwesomeIcon icon={newCheckboxIcon}/> </Button> <span className={'header-title'}>{title}</span> </Card.Header> @@ -77,42 +91,57 @@ function ChildCheckbox(props) { class AdvancedMultiSelect extends React.Component { constructor(props) { super(props) - this.state = {masterCheckbox: true, infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry)}; + this.state = { + masterCheckboxState: this.getMasterCheckboxState(props.value), + infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) + }; this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); } onMasterCheckboxClick() { - if (this.state.masterCheckbox) { - this.props.onChange([]); - } else { - this.props.onChange(this.props.schema.default); + var newValues = this.props.options.enumOptions.map(({value}) => value); + + if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { + newValues = []; } - this.toggleMasterCheckbox(); + this.props.onChange(newValues); + this.setMasterCheckboxState(newValues); } onChildCheckboxClick(value) { - this.props.onChange(this.getSelectValuesAfterClick(value)); + var selectValues = this.getSelectValuesAfterClick(value) + this.props.onChange(selectValues); + + this.setMasterCheckboxState(selectValues); } getSelectValuesAfterClick(clickedValue) { const valueArray = cloneDeep(this.props.value); if (valueArray.includes(clickedValue)) { - return valueArray.filter((e) => { - return e !== clickedValue; - }); + return valueArray.filter(e => e !== clickedValue); } else { valueArray.push(clickedValue); return valueArray; } } - toggleMasterCheckbox() { - this.setState((state) => ({ - masterCheckbox: !state.masterCheckbox + getMasterCheckboxState(selectValues) { + if (selectValues.length == 0) + return MasterCheckboxState.NONE; + + if (selectValues.length != this.props.options.enumOptions.length) + return MasterCheckboxState.MIXED; + + return MasterCheckboxState.ALL; + } + + setMasterCheckboxState(selectValues) { + this.setState(() => ({ + masterCheckboxState: this.getMasterCheckboxState(selectValues) })); } @@ -132,7 +161,6 @@ class AdvancedMultiSelect extends React.Component { readonly, multiple, autofocus, - onChange, registry } = this.props; @@ -143,7 +171,7 @@ class AdvancedMultiSelect extends React.Component { <div className={'advanced-multi-select'}> <MasterCheckbox title={schema.title} value={value} disabled={disabled} onClick={this.onMasterCheckboxClick} - checkboxState={this.state.masterCheckbox}/> + checkboxState={this.state.masterCheckboxState}/> <Form.Group style={{height: `${getComponentHeight(enumOptions.length)}px`}} id={id} From 701d9383308f4e9d74fad68b19fa57529ebb81f4 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Tue, 12 Jan 2021 15:14:29 -0500 Subject: [PATCH 05/38] ui: refactor AdvancedMultiSelect.js for readability and flow --- .../ui-components/AdvancedMultiSelect.js | 236 +++++++++--------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index db759b013..c418a20c6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -16,6 +16,10 @@ const MasterCheckboxState = { ALL: 2 } +function getFullDefinitionByKey(refString, registry, itemKey) { + let fullArray = getFullDefinitionsFromRegistry(refString, registry); + return fullArray.filter(e => (e.enum[0] === itemKey))[0]; +} // Definitions passed to components only contains value and label, // custom fields like "info" or "links" must be pulled from registry object using this function @@ -28,16 +32,121 @@ function getObjectFromRegistryByRef(refString, registry) { return resolveObjectPath(refArray, registry); } -function getFullDefinitionByKey(refString, registry, itemKey) { - let fullArray = getFullDefinitionsFromRegistry(refString, registry); - return fullArray.filter(e => (e.enum[0] === itemKey))[0]; -} - function getDefaultPaneParams(refString, registry) { let configSection = getObjectFromRegistryByRef(refString, registry); return ({title: configSection.title, content: configSection.description}); } +class AdvancedMultiSelect extends React.Component { + constructor(props) { + super(props) + + this.state = { + masterCheckboxState: this.getMasterCheckboxState(props.value), + infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) + }; + + this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); + this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); + this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); + } + + onMasterCheckboxClick() { + let newValues = this.props.options.enumOptions.map(({value}) => value); + + if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { + newValues = []; + } + + this.props.onChange(newValues); + this.setMasterCheckboxState(newValues); + } + + onChildCheckboxClick(value) { + let selectValues = this.getSelectValuesAfterClick(value) + this.props.onChange(selectValues); + + this.setMasterCheckboxState(selectValues); + } + + getSelectValuesAfterClick(clickedValue) { + const valueArray = cloneDeep(this.props.value); + + if (valueArray.includes(clickedValue)) { + return valueArray.filter(e => e !== clickedValue); + } else { + valueArray.push(clickedValue); + return valueArray; + } + } + + setMasterCheckboxState(selectValues) { + this.setState(() => ({ + masterCheckboxState: this.getMasterCheckboxState(selectValues) + })); + } + + getMasterCheckboxState(selectValues) { + if (selectValues.length == 0) { + return MasterCheckboxState.NONE; + } + + if (selectValues.length != this.props.options.enumOptions.length) { + return MasterCheckboxState.MIXED; + } + + return MasterCheckboxState.ALL; + } + + setPaneInfo(refString, registry, itemKey) { + let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + } + + render() { + const { + schema, + id, + options, + value, + required, + disabled, + readonly, + multiple, + autofocus, + registry + } = this.props; + + const {enumOptions} = options; + getDefaultPaneParams(schema.items.$ref, registry); + + return ( + <div className={'advanced-multi-select'}> + <MasterCheckbox title={schema.title} value={value} + disabled={disabled} onClick={this.onMasterCheckboxClick} + checkboxState={this.state.masterCheckboxState}/> + <Form.Group + style={{height: `${getComponentHeight(enumOptions.length)}px`}} + id={id} multiple={multiple} className='choice-block form-control' + required={required} disabled={disabled || readonly} autoFocus={autofocus}> + { + enumOptions.map(({value, label}, i) => { + return ( + <ChildCheckbox key={i} onPaneClick={this.setPaneInfo} + onClick={this.onChildCheckboxClick} value={value} + disabled={disabled} label={label} checkboxState={this.props.value.includes(value)}/> + ); + } + )} + </Form.Group> + <InfoPane title={this.state.infoPaneParams.title} + body={this.state.infoPaneParams.content} + link={this.state.infoPaneParams.link}/> + </div> + ); + } +} + function MasterCheckbox(props) { const { title, @@ -47,12 +156,13 @@ function MasterCheckbox(props) { checkboxState } = props; - var newCheckboxIcon = faCheckSquare; + let newCheckboxIcon = faCheckSquare; - if (checkboxState == MasterCheckboxState.NONE) + if (checkboxState == MasterCheckboxState.NONE) { newCheckboxIcon = faSquare; - else if (checkboxState == MasterCheckboxState.MIXED) + } else if (checkboxState == MasterCheckboxState.MIXED) { newCheckboxIcon = faMinusSquare; + } return ( <Card.Header> @@ -88,114 +198,4 @@ function ChildCheckbox(props) { ); } -class AdvancedMultiSelect extends React.Component { - constructor(props) { - super(props) - this.state = { - masterCheckboxState: this.getMasterCheckboxState(props.value), - infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) - }; - this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); - this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); - this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); - } - - onMasterCheckboxClick() { - var newValues = this.props.options.enumOptions.map(({value}) => value); - - if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { - newValues = []; - } - - this.props.onChange(newValues); - this.setMasterCheckboxState(newValues); - } - - onChildCheckboxClick(value) { - var selectValues = this.getSelectValuesAfterClick(value) - this.props.onChange(selectValues); - - this.setMasterCheckboxState(selectValues); - } - - getSelectValuesAfterClick(clickedValue) { - const valueArray = cloneDeep(this.props.value); - - if (valueArray.includes(clickedValue)) { - return valueArray.filter(e => e !== clickedValue); - } else { - valueArray.push(clickedValue); - return valueArray; - } - } - - getMasterCheckboxState(selectValues) { - if (selectValues.length == 0) - return MasterCheckboxState.NONE; - - if (selectValues.length != this.props.options.enumOptions.length) - return MasterCheckboxState.MIXED; - - return MasterCheckboxState.ALL; - } - - setMasterCheckboxState(selectValues) { - this.setState(() => ({ - masterCheckboxState: this.getMasterCheckboxState(selectValues) - })); - } - - setPaneInfo(refString, registry, itemKey) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); - this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); - } - - render() { - const { - schema, - id, - options, - value, - required, - disabled, - readonly, - multiple, - autofocus, - registry - } = this.props; - - const {enumOptions} = options; - getDefaultPaneParams(schema.items.$ref, registry); - - return ( - <div className={'advanced-multi-select'}> - <MasterCheckbox title={schema.title} value={value} - disabled={disabled} onClick={this.onMasterCheckboxClick} - checkboxState={this.state.masterCheckboxState}/> - <Form.Group - style={{height: `${getComponentHeight(enumOptions.length)}px`}} - id={id} - multiple={multiple} - className='choice-block form-control' - required={required} - disabled={disabled || readonly} - autoFocus={autofocus}> - { - enumOptions.map(({value, label}, i) => { - return ( - <ChildCheckbox key={i} onPaneClick={this.setPaneInfo} - onClick={this.onChildCheckboxClick} value={value} - disabled={disabled} label={label} checkboxState={this.props.value.includes(value)}/> - ); - } - )} - </Form.Group> - <InfoPane title={this.state.infoPaneParams.title} - body={this.state.infoPaneParams.content} - link={this.state.infoPaneParams.link}/> - </div> - ); - } -} - export default AdvancedMultiSelect; From 819e1778c854c36171f25bf862cdcccbc29e4e70 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Tue, 12 Jan 2021 15:25:23 -0500 Subject: [PATCH 06/38] docs: Update network-breach.PNG with mixed-state Exploiters checkbox --- .../images/usage/use-cases/network-breach.PNG | Bin 88525 -> 103676 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/static/images/usage/use-cases/network-breach.PNG b/docs/static/images/usage/use-cases/network-breach.PNG index 5dfd38ffbbf2471af19e874cd63e75664e4ec8cb..871a36bb67f258057fa58868052b4c0ed443e780 100644 GIT binary patch literal 103676 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	EGgda<CfsF)Ki7_OzK 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%0DaZs4rvhCV$4q((<!&I&w)9L{ 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ν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 U(2hfm9=@WYsG*Q2_t5jd092aGr~m)} literal 88525 zcmc$FcQ~8h-+w<{s?{M>t5%H|wP~w%2V&IhP-;}|+I!PhRqZ0gRzY<bwKt_INJv8~ z)JTmCHG&`_lKi6mJkQg9pXdMIeO)fseRH4tocB7f_xt@iaVAEf<44aO-M4SwaXnov zvwiyxo9^3p;P8>d%qI^mpk>To|M;1KuJ5ZH;$2|g9CW^Bcx~Ul>Xc)<c88evtlqj7 ze*5;F__X))56tV0!@hltQa!C}w}Wk#XeYt9H}i?Knw5~1Nk1obKhM#865>-HX<pgR zF^^?P1^>9Q(5{sDU{&r@){(g3UiKFYsi(e{fOv0T2M9U6!alR{IDB0AENix0-Qk1z znWr+cPh30uC7A~5F)O-Oa@^y9<<pm*Y-?dr7+Tqmd23|ryFdo<9oY?Ad;QLGyBoUl zg8Nok6jjN{=A78GQ)VYZ@cBUpnX}%z;<e+hACbs4f&RYTr~4ETbIR;;k=8%IAG|yW zJSte?em!pg@B8zt`kdEw$DaZAmd(7b0>I+WUe>Sz_k_p19*c;Z9uaip(C7SpzfaEu zdg}UsC|La8`?ObDg3rK);!FYmx<s!1|C)eKbAoH?EkhyD<@h#%NtQPT>bTl!gZa(S zRB*;z1<sE{>cFoV${qZ7Nnn(yv~QiwJeFHXdai=}sG~2eOGw-c(xPRCBRz;n@w3-Z zl|{$5jc}Cz7O!0Jf4}+q+petTE0;&nFw@bY6@|i-RYm#!-H@Wb_m^-C$qJ<YSrWHO z!HK&)eFS#ph9LpLjl1UF0>8d*FYvDl6!fiE0Ll*S=F7*s4v62+-tYLdFBMElJV=g} zDb=1XKjX@(p;&=Kq8#PglJ9Ot#M-u)&6{`8evOjo^Gi|vA0XnPX-avmGn<D~)0vBB z+0OkA3kY-K@yhYw!;Cf3zD@~wvA`3xw^;A#gEfd{yGVqfUwDnq143USw~%ZuS=~{C zMeM%zP{shZ91%2!ec(UL1B<3Uv{FbBP=H}Ck#^*tBEm-bBQHn$%bojWCno292_k() z+LTx9^zufTcvCr~)7Kpi&k!nmitQC@)e70X>g~+E_+4;)U1X6atx)Q%_r5Wcr3$vo zsEVc@wc{K(vdFH?n~f&8ub%oX7v5iTQ4oTVe(EK(-B}zfd^az~9d)O$HUDzH$%Gp0 zo@SgoMEtFSjH$oFXGz6!a&TH-5f-<-v<^~m^*=Z~6B7Zc8R#ij!d2aK)_~8HPT9y; zowkR?fGI1ZS!Cp{`ezZw-nSkDuK%*qL_(f8j0?9if_esN4Ot%OyS!uClXw>_F0>%( zR)S*lyJ@K{b10?R$|!-iTGKq}jHa)Boyx=)a%ftl=C4Wbd%o}Ytf4^tGW&}IMSNY+ z+TJz;aQE8VW55B_e$oRl^cc&|G-mW%>PQ#u(B_Mhr@j>d_THGYfwL<e$ZO8t0y;xL z5@o=A{+ExM9R4j^c4<=;9F@8jACR_P8Y4txNjU?s8CW!_xP;b^OV*NTWIqB)Asd!V z7dDF+9rk;{`~CE!{PXd`1Nz`pY*L~^A^dte^_Rt)%>MU?ZRwvx%T78F(bYm?`;8BY zji)r4LBTmslDk<!${F2`U(C9Ez9hZ|VB3W{%Sxec_Lw|XtGmbdmTH3gbChcfc1RC1 z1mOwXZViA4S$p)sGs*z$uRlM3qSkm*lxMJTa4Uh2onx4lWPB;k|B5I><FxyIu^VVT zVuI-#EoJA1;%ZrG&S`T5>xyCp{n=8BZI#js{~Y^M`P7}7<{OPc@=X;R0nd?s1LYjU zaNZd51l3=@scI~aj!}Y%hfm2$6ES(Bc5!A){hkr|#4NI!8b1g@Erkg$IOb|xS&2$E z(kURPH7|RF<@e>XYTOSkKN$-XLW)qf!T>s&30^tmrhB1m{`tZ?d~(X3^zebU0`IWU z@Z=m?lycTQ1Dj<)48a^A@dt8U+1d#wX4~(+wrI$jD}rqql9UIP8@eJFgSM`F+ve5c zf`hA!JLhmnr*BU;+6^o)+J?gl2Au~&Z$>)OJMR^5Dzfeg@G&zoK9`nN-wN|xY}3q) zk3TBA<J^v{mlC{@nks1;s%3+UID(U7l^w*E>dfaw1(mOgP-b3zAP~J4gD$<OGbG$s zlAP1FxlBDBHa*hz+<sB(#GSahXOIGg5a5{Dw`Nr5uJLG~p(O-A?)g#1G#SLzAjT6^ zI>i)>ZLM2j8)1I=uKarPcog3En&sdc>o_$x{YQjMZ>k%0l;>xvhzdIm)k@VlJMWOz zdD7?5mqUK#HcCXtFcYa~%ItahXpV27CHS`(c^KmkNjYv}C9JhZ^A^pp1NmgxkVNm{ zkIri2;=I^-!l+lk#zo`gXplr`zohzT%jA0;b;{D!10L>a^|{Q`{MbopkEMvk4+D=I z5p!GimBfxrcCT#WTT+<kO4w9eauazbuj3>tVD@2#6)_hXvl6yJJRF9ZOB_Xt><Mxo zmp-S0RLFb>BTK><>UxjFG8AxxdnwT>Zuqp-Q%SYv=|^<u<@?hHp_?ywM>*0(XY_7S z4@SxZ;|tz|ORHIUHH_R9p7sh`WS!1SM>{p!9uhlW%lks=jFvHfp>Z5<yrlEfx*T)? zQ3+3K7xnrYtNa`m-K?pA;wbm&9QPXSZ*!`hv?GNE)IBL!@@OP~Yoo6MEJGExw^eGZ zQtgL5nejxXl3fgsXsKc$O}SW}iO&<Cov((KyG5Po=IFdJ(?&tm$5g?2Q*Pky{dE5E z^3LotS4DE`^!pD8xW2c-RLAZut66<$<7QTFgl|Q<NQ}NXji2|#vEwA}FZQpBOWW3k zc6M<Q;qY*qX?bF42XZEisCHOXEE;yB`m^nJ&{eI;_35B4x>T$WSl+UrhwJ%WvulE! zrND<M;tjbAMtn+9DNUIY8$ly3^qaqsz=I+!!5jR19<vvWm)h385>?PZ2RTJwpuS1Y zSf>Qz`DX4&>_eH;C6QC}vc<*cyD>Qp$6^Wn6TIp|Z-4aoz^|uP`g?a`2VIm?oqb8Q zt-EM|%mmkx0lZ$QDi`e|Dt=~K9`2ZNS`;MIS>Yx5`fQEy#l~+qflKK}ldB5C)deO! zR3DudK%uUlIpNUR>&<yR4-uKYEYf__WHinXrnlDhu(RL>k6%hGy@CEd6*HgG8lI8t zA3Q=Iq)QG`dHLN)I{`!dRaOcU;Um1%^7JvBqOZzWGCYK2f#f9%C4)xSMMK1{Hg>S= zPy&}@3;a(uo^EVkRm}=m*SO+J^zG+OFt31<>vQlgiYGL@I+U`Pb2g2#X^~T=7YL=8 zB~#99B2t7Dj`J(U+>nlx`AIz`eGY*+K+z~GTb?@=BG5*@YriG=Q<_Rl-A}~aqx>sZ z6X;7pq_r*G;k8sY?F_@PAd*0CClr375~+*ESN@gqz&}v}O90@amSaJB&P<#hRg12- z=-^lsBB#&^w2|<=(1Zl;@Jwwvwm_GZtv8f*ZaG<?Cl5hVa?$P{iWqF>(F}2XMS5kZ zMQu1_hBd{w10|as;`CGt^n_QDsJDG@vVX#)$-SrsI1nk2&|H4MvqbyEq0VKmGd{{o zY1iyW<M_DkZOW`|>axfy6<J6-|7Y4oNH?5Wz#*gV*d>Dr?8KG?>H8<_deZKN9d&uw z`C6+d5%rz-KU?`C3P^-El|11v|H^_74sn_CD)I9##~a?u-9{0ErcI5v$fLX|;h0PJ zM}vMLEShrfm@{C{jZL=1P5WNr{q9;kv~4k9@J@HSOba+y+~_lL=+OtSmROIL+9xN} zSy1t6)e{_uQUJv;i2BT>gX8gxIG5p-LVYQ9J6DKsh!NXF45$MI{P}E?XI6T%EB^#V zA6z#cL_D~#-L3uEana$?G`u8x&gqOAYHpjJ+yPrMID<XXIFf>KX|(lA3%Q-vmv}-B zwo(x;Hk4$0Upqr|>se>S62h&I+VTnM{j$kGFXpfrv?qB$f%?N5U<{GGeOJ2!QZ2T; z3@!Q?<{V{9%19TaUUH>`bkliRU>#Wsq6SZpVO(M3B83L6TK%=t_o%<^VSpcalzZLf z8Xyz6Y0C)4MbZ?R4~7!&#Q}`&@wd}EA^=kXz9wR!qp<HnodKQ<(SQy!LB*Vh;hyp{ zX_r)bMLZw6gmoUHaW%GAQH*wbGsLsuvDxTVoeNEhDTuyYwa>9O-|_7qvRKndDoY#{ zAx2xzVNw|2_$*sU9JF)I%cC=k{m_;cxw@EDNUZ!=2A`gW>;VbWhnjOZRe;Pbgiiy= z^7D#UYRr=w1MoxKj}NxDhR733NJ(5+MBR&Jt?>!IYJekKr06fS;+O)6aaezkj|6r2 z!NlfAL!y?n8Rg{WOhZ7cRP)X|iRr*gJNQ+4SC$ohm&DNFSDZjabcW4{IpWDtm{#WQ zCxP5se1TR{K{>poJaMka_8!x2!^Rdr7l7-HFW_41k_XjNtfhK9!kYBKwW?1k$9i*N z#}b3r#>8C2vd{{jdOCPb3Yv}zhjAKCR<9a0omu1Al(7KnR})S5Z&l0s>(!Xt+m7+! z;@EPAuQex~TLYA4rBk`WqUPeY!g6DDV%SQw;vx)bCL4jv<i;0s8Kyn*+zEwxdp3G? zyjV-nX3Kr|-rcu$AiS(k#Vz-`zATNwc8{c?B!w?E!k!GgwWg~{{CTr;+|__m`;N|& z%3_O4>2y&GN4;RPFFx156omcwmX%&(LE;d(!v3hxB}tXt@~a;1am4UNOlhLRMB8v- zE7rfsrutC4T_^6YAL7=gcCQ-5ZH1HS>!K2L<96`Ehc=SRyqy3nJUyKZQSSuFixJhg z@Vz}DPnCDwAH|DDEupi6WKI-gfchQSW%TWyNktSAnqEIB0@R=GCmy(A1I;3S)y)vM zU;B+l#KXYiJ(Ao|Y&4&=*mUsEp!`LyT+j+NWyr&ALmsX2S%)lLxo?<|CsnzrOL5$D z$Y=SBJ*DbTnj^+5+aPflW*thcZA6rr3$l`WttH`~hMrCd7c*3xxX6gQY$kI$tma!} z<#n-!gkk%^(wQqo{6otoE;d<Lwsg-7J}5-gW6Ge$_a?-O4UZOlkeRK`m?tSPCp&)$ zn=c95S<;p*hLpY_KIoG%jpyE!%K{E)lfu2SX{rv%DN64QZV|>TVUj5Fn-}&9T$<^7 zs(M@lio0GT(^!h4=t0R-WOSi-<$d>Aonk_SPqB$j=n^@;1p!&fZC9TP3ghP*yb2n5 zIo$UmLwrWh6y4wAJ<TCI8n@%k|9GyFqXTxVaGp02fPFcx1Q8KCZ~Toco$Iw9kGMR@ zV8VuSnt*^Guh8LkEqR6X2e}SOLPv}nWI01Ln<U>79OL6P-ddG(U9nqMTVXZ6=Zrfm zadCh5*)+iCz6<3zm~1Yk?QTxQp!p+<m}`?RA51z8z>$eYEe>0he9_vZbE%`O5y**0 z8fDq6BogAxeDyR2bq~r${-2<!dw0eg4bjYQwmp`(8p*d{S2a@Dq*FZ469e_j<y6%F z%pda*BC})JP0em9aM5|K#cJFD%b#Da7L`+46HU`tu@$|r<>1UN##XEULP*AoqsG{` z*U+-CL`!1ppl_X)>5Su-wt3|>zJbs|I5jA)LY$grQ<-`_mShDje_3u&>59<6t2gJz zX8ME<PZl_LM;6BCM+q&~o(@ue|4ghrol`j5@mN0LBxkz^NnOo-FlFRnW)wUeDRbzg z?PbiT#%|<0i<RIal=f(t`5QJuP@GxM+R=O^%s0p~C2FJgLGp}`A4A*vqZ$!DV;?iE zxJX;}iZi?UkLq2GKUA&H$@iIkx=Q$3H#Oi{Y`am^LoeCHX^7YOLw#`5^0@GAanl!0 z4ot(Hw<$;u*m7Y}|7SaJbz-$zjIcZl#67bcJpwt{=|SsF?AV-@k-cOEjPDpS|AaZK z<a%kschDM8b1daru6@ta4P2THIzI2j%2s6h6f*-~rVs4uguiTq<O~S&y4szwg}Ie` z<l39xe#^-fobwMjxFIq_T-)6oIKJiR=YFf}NL3RPPfp%JgvrJ0gW))Jc%p)Q6;dWv zp`2X)Kt9dE;yydfLF&(tYTaT03UFaBB9#zImS$+@&@D0ReL-|N68@n9XL}oD$R3&^ zCT-dsHy_Ztb>ws_uMjpjRl>BJBOydb$02`LKz0}^wrn^ZFCl*$C-PuYoP*j^tT*{4 zO={*1w_$-P`%t&=^N9V*7+~{kLr52|CN-dk_PiCQk?n5w)lKH9weN!7>MCtO)mbOC zn_b$@a?lSe8J|~99@OZyfE<&oS*?aQjsaw6^tKSr^)K|M6yc)MrtxPz0tA8U18h;8 z1B;7VHkYG3ze!!3kca)ue>jl-^3GYdaco=scBBL~Eu@OAH!O3NHuxb~&noUOA3ka% zCD2>%+3~DY?}|i3HE<wkg}`&o3}Gd@wKWT^Le<MiR3+-hrAg=>&EqtRDdu}xH;QLS zFC&gTR}+@$4!P4dX}vwaOI6*;MCLGrp`FZ_Xevo*aP_(YFD(w)l3u)YCIrxOs&#&t zqYlQk6SYEolllg|1eeQhdsHCXU)rZ2hAJ+M(S6Gq_H+u+ahVTwiW;y$WL*@BPmP3# zAIe0hlU1r)lATlpCY8?Lwfpj@A>SC6l_PS&G`@|kkVbnEmLgk*h&&7zkuU{Vb5*?n zIR2^KU{p=_9gQ)c3W%&qSzP5AF5qXdc;J)SP_=V>^$%r<N7Dz=<%G?k&%~PQIs5VE zqh9H5N0Xp^;1i-gkf~5iM+ro48k40op?gS-w5jFSK@s1%56xp+@$0wJk#fr2TKuLg zY1GSk_Dp&AjS<U{AXXWOfs<<4I#_|<&s_mxocp6NQJ`-ZXd0^g8X^qLq4!3}i&fR? z{JbI)01lv(NDlhI6<hkJ?_R**t2&t|A^)WkQQJx6_M~I3kj-%jQW5%UWXJRLxl3jj zYxBKxePEm6a_hj_JiWR+HR3&4Qck>-X^l?Ml@84of!HNIoNy_ULI~=YF-5q+Rl7O{ zRYWPtq^zCanCNQU^>P<Gd14D=R!Zn%%+cejff5{*&bF7OZeC$;%M=WfUCKS8k=Sm? zhXU}K);Q0>d`DS}tAPC)>BGoXh`9Q&QW?mDo*n?XUy(lJ#D|~n|3`hHK)K&Fjo8?n zGDN&@1oCNXfy>)I9Y-p4V-XCzv<{+XOKaPU>q^%nBxP+6JPl}s@YfFJL5s}h@7<)N zUh>se>}p#%?AIAW_ro<$D>4|bn<K7-58e@Sei|_M%rE&Fcez1Kj7-*Yy*5ZV8?Sa+ zy~|@kp-PaHjl%M2TMzl<+S!DeufEcj4LB`Bt{M02K>j?`n)hD5F`8;!qk#_5F??IT zAF*U$rF^yqWKIYYT^Tm9C}bfuheX7NbPoFPed+gWb@`Ho4(#DQGqoZ?Qn5J+GA68D zCOdDDEK}!jYw1n`C$eEsvEAY-3EQqy11i1eYON!Z#0E(n=fZn8)zx`5Jd-{21x}Jj z)+k6$WzkSd?Hmh&EV{kId#SMYMk?)YAp2yC41GJf^xxe2Fz{%9+|Z5L3qXH|I5&z* z-O>lVFiPkK$B^Gc5G3r!q5#rTBT=2ZEmNT-F;jZWFQ(WUD&Zt^+ANZL6o4JX3VDor zMY&lzy-;HLG-KU$o!xHcR9MI>nN&3K@<g@q)x)g#z&?osp@_g`1FP)1tcj{hlJQE1 z=dyE=DNpC4Qz0Q{TMae}jVE(G>d*-rhv9F@w}d3ZHeU3qAq8t0%cGG$FQ3$waX#HR zND${R%pJ!U;{w_Qq&Nn4JjiMifkJELA#R8@cu?LBJa=0y6mioMv8L>vtbHMI96#FU zY`~#poA~|}YHq7VdCO9?{SkdBsS@R}<PCNgtc?P>`DsQ;lV~1VvNIdW<Aqy<ppU$* zpPa_a(^s8ZVT1VUOFPY%7efmd&%-J>mYoOvv^ABceH37#p-(ZFhQ(@)R@+f??+S(a zGB&QUe~uZDSQJ7btH>yY3Du=gx~|<@OblVICgq6@PTHs=0)>p>I<+;ak)1{JwdO}Q zyPvH!1|i6*QkVQMqH}Te&kKv>cDPmDlRaYXsm1i)(Cw;#KId#Amtdu-gv$D-`tY-8 z$1W(x*E2kPrRxa-ky5w7S_$lUzw8JnItKtU!z?Y;fZVh=l;Q>3q>$_|JrMHAq=%zp z2qtduO?qYe*J~Rhvx|lyMz`PXuadCbb&!F~4NP^F<_xD@+7CQup6wq9!t{T;iEEV& z+o%jNR4z3>rQW~uT6u^P*{YsUUlnQ=B;M{ejW<7|VpAquaR+x#DGQk#)Sywobuk;o zo=jj}YUC~c$K66ZP1pkR?!u}?J;?a<ch4*Y_6LFt+YCNyp3P}=foM6M0qx-EWmSJ7 zV2x2jn!a~1aURrgOyZI+><n6}dHpfyTDn((&}K4)*C7HHO*`V6?O;1<0Dn0~i9vL< zuZVBd`6Ir26`N#pDnVT?M*YrEJ}@)zF#;jgMX#t>4_bWfqNP<&(oyb2M6y~Hef&~Q z3_K_`oN2ni{6L0ISW2@dE)Pm5fva2>QF$lysr(J(E6TvE*@%AT))4|Wctb(MF3oC` z5S@iCfr{l~SR0ltr)@6xU%mlpK@@!#_jQQX^gX{7e0U=($g-;0Wafv%=$esl%9)V& zUpP)c{cxM(MDw%i4Yctj1E<oU6Za+_C27)4A%ng<;|cfG7HJCbg@(DzM##5iuGW(U z2PcwST#}tZasyD{>j$;P#kEHVsp$bX2O~d6dJfV<3vbkxyZKVJVCPTLjPezz?2XOd zwwU9dct2D)x|=v8L2^c8POJR9*%|8-C5sKy{OYp%KLwu<Ka8!j@kS*o6{upSEr3oH zs%*Y_Sk>|i!EeDYwAg{S_`bjGa)g*j4tw@J{!+m_;x#;<M1y}fA>DHw<VGmX?M}y8 z*5td^%Lt$5t}adA{Z(&%T*GWat?PioZx&{%+V;C7tQ5OFV-pM%H~pe%otCY&drzh5 zq`gsabK7MSBPRaCt*)9J!aQ*g!|!`l&Q#Y^6zjD0=g%(j>a6O5K1EvBI(hR2!k=fd z_%%O3^dlxxfB3pr9gYfWQ|s~j@$0q6rb&Pp&O{@^$^{vnThR0&j@hHYqkvkm!Q}i^ zf#Un`H_2D;%qSbFEp)_9b4UDY=UlZY){-b9V9PD}sqKhxU^M#_?wffM9UiivaRP^J z^M{73XI8@c#*Q;bVwGi-xK=oF4rDn(#1#?LbCdbT_X^r4Kk{DrH36`)J{a(#V3je% zH_q`fYDJcwyEINP?wQ88NEC6jOib_%q9XWQQlYS$Db`Jf($4(bJ1~~|SAxQ4^f@_! z`2f8;7KQn1LSpf42RU^FNz;4{q6z4SB6+tpe%4rQ4PxoOmU-4kR#<+0%`pMsm<Tdn zLAFMk-OYYb)~OxOrATQ|wJfGiVp6XdYi>}7JRbSCa!S~1g2nsZyXBMogx?<M+JClo zXr(XG`2IVs<SeSnEg^hzLY})qBk?lXZT#W7{((ck+kUGi(8RS#GJ0It1iFB9tgL%> z_84R}K4B$nSV%j?v<Pj**i2DH1MS6_qgR3EPrLOz4N{0W1M$0Xx-95L-FKqbMO-z+ zO}i!Q!0*Q5Mv)fxr?`S`^mT1w)Iv1|u0n|-cN^o%c_7s`ub$~ymJsA?&}jQN<OyJg zr(z2~_kE_`ubnXyszT>peBtk>&^}MVwiqq1W9DvWB?&PbRx*d-zl5>xp15hRcb&)w z<K0DIQ#XuD8>b+FtFb9Hd-Y7BK^J9jUsVQ^3BQ^0mX_7d&mHz>FLdB+O2kuJ{Kglm z|Fd{?<rW<;d}}$xE#FL6zDm`ScYIL`uNPNo+<W)W{-#1N2cM7c`({4#=PnkjV>z1M zp3YK6LbmQ3_02Z5{0U8|N}+6<_r8;-HnFp^2|7B?|M7M{qa@4a?P`L+4um`mzoQL* zYL?j1yXxz_^F2LNXQa%qACZ2&*YnS}%=V)~G&e*#7w0v(gEz)Rvr7sRr~mBomOg`W zlxX^5qBa0@3)yRzS`Xq?xR(g>!}g8>t*gjNd&6F*zXlXVU4M+a(2TN&!g>P`x(hLX zwtyWu^En)*0~ntzM8WnO_nwhTUalYcvnM<tg)d|%CF;tf>|epU0}^!?p8xg!*?j7! zJ5nNX$+K@5J231*Y^3d82CjfIu$Rsu!-fLllel<Wj!$K_dql`Y40UDAX{S6{9D6x@ z;;*mB9gt97VHQd`BUq)R)zcC~QNCJe9}mfMQ?XCL*FxE>CV-`UfA*%q!F#ogQY_QL z2ELgCJM$pPYADqCN_^j$c8APlaUYM7WSNmdxZ8rprn5sle>A}dWseO#VW#q@S?IIs zB*YLW*H|f&=dHH%ix0&whNNkMvYHwygzqqmL0NwJ4~wzz2ZmWy*m(X{I;W1qM(m&K z2XeOeWN_`P^nKNd^6kEKU8``h`cl*nbxhl$SP1r0g-S|)5Zxql?M9FUK-#SCY8(%( z=ySZMLF3zrQT!MDFy7zV$XzZ0EVq-FXe3ebm!h?xVpOVMc4asU?$CS`{QOds$!c@m zu6G7si)T}!8=b=%gsyKqoutv2DS-+Iuw}6yX2Li`oW>dM+`ktovSMa&z;Hw1zNH!G zg)2)g<1-iZ{d-=xJq)tGtjAtL1xSZH|9OufewG^2H^%m-VtRw0KRg)Ud&hTj6Kkvj zkp>fh)&3pq=!nXIW7w6LLd5rErw_7=r*%Lmt-^%FzZT%g1_Ie}-hbsH0rh*?#P0`G zIjZf|nkgx&($&6L^T2MS`pM0wnlB^1*{7BG`&dI06Z8LEzatwyl}axrX+@otHd<mA z(9<a&L#CIM#~IMjng#WSsykV3OzlveAQyL>(Y}?0mYGn?4$cd=HvkW3)*Y7qvUB^3 zG4V-+(y}zpV<>|VZ0pz2h$tE>(I+YMln+O1tISC*(aNST9t)R0Eid{tXO0l&KD&>c zZheg6yif*(2np{6z~4b=ACm~dUEHtqq$P773R~~sExoAkPir#kx|8VA^~3TmhxO$| zH;bhA<zMjr(mc{hX^Eb3Tyi<#q|SMsJ2!NK{`5@+9S)@nH$V@XG6i(w0OsON1Lq7U zCnYP*L_9nFIraT546TZaVZ~WkE1wK;6&2u0z!+qou)X9bX3B^>L#v&=+}O-FDc3aU z;mM-J=INI^(RDm}ViFhV{prV_e@a9}wjMNvCZc+h`d&z0UQe=$b9x2Tp9HpBIci(Q zK{*CNkZ(O1!YwJErSS3mJYiFE6d3`WWkDj{1nQkTF*)?taR29*j!wy31B=^VtmL4c zGdC^LGrOP#Pi+by+GJT<xkPSG60bnMX+e(9S>7$4h?lwVUX(uXYl8~-G_UGZiR~wx zgpmGasxX-=180*Kdpblthe_cvS1;;`W=74cMiJD@Z0JAFXzpeqS|ii^nw#K>uCt;~ z&`hNTOziOPSXE*#qSnPdHLc<#P5sTn(Cg>W>;K`d_7{Cf0fe|H^tzrtXA;+$nHCC; zMdC6=)E*f$Uj7hD<(jfZ`})|4=u`e;%Gh7j!)yI&Kw{?r()MYUULd?~wL!AWMs-uj z?f5umv9Vo*)af#d(~4{L&+4sL<EH)Tf&*s_Cke;%Uryb*H{U7(k!;kFStyN@^gIgm zEZ|brBg@|07`D$5fvgWVZ5hilC4aX##@IhZ;qssS9k4vpiUOKs^1l_P38|dZ77I<u z?G%wgnF>+T{Ob}{4C>_cnJzYW!F2t!JVnM(=Rb_?ITKW;v2@Va%Aa0iELqCf&g#^2 zDt5+m@otHbRj%zm5nxcumt8hABBa_X7CCQyZIZeFni{%!ryuVb=XnD()0BD4zEeh_ z;qOW1T^CmJzZk>Csq$0{LPXB5wj4K4g=#<L;to}=@Ydj<)!H~osq8qQCK-~o?OstH z*O|=_zu-<8`>NuJFCH<FQzQ5<%K971*1+d0_QUXC*NrT~PRk$+;m38s&R+nEH0(9{ z%WHbmH`Xm_dRD1sH@9d6Mt*I(y)i>o7DWxPKwmyu+IdKS*kxuIGj~-7^!Izk#W!~p zyG2~<O2nO>ZoA|(&JTSarXUz_gN;b*(fXutRKzemS-bHPCyH{{ihA|$?=rV$1JmQ6 zRA@7^t)U2Ek-S_VM8_j`c*>h^ZXjo9Es5<$MFcmQi$VPlp6@Tc_?MUfahXRy`M6fe zsqD<D28CbWa$m~j)UfrR*F&#Nu4@xVU{G=^6j_Q?wh}hJXlZnsdXDK7e}-axaTVKG zqc#nzVzX|wRVFMWJIfVg;})A^6;!I#{a%6p!Y*b{Q5=lpZuF~M$LFw>b@ONAyRS9A zg`DzJ$D3$@NQ7#G(0+ygurGx;qmTSXY?@&&WnxQXq9a)4+YzG=Y<3<oTR57F!`3J~ zkFI}RvIZ#FYQxtBg%>MjV%mSBB9kr#wma<hOrIH?SCTkUaGP=R;xnS1-AEy!1*JFl z$-r&F?>m{yL`+slLw(gh!>Pn4ErS%g4&Iivk+N~4vrzF&Lb4EwVivjfsk``=KezQ| z71uV;TaA1&Wk^@eX$(RBLt!EKFWs6sq2PC|BfkB(spbU{KgTDL=JhZv!iLZ8p_r$w zKTk^qK}|CH4wOLhWvyC2_NQ0}#6z>o3A!myv}7x=q5RSsJF3;~mBouX@N~K80A<-E zE{OxpOK1Ovllt6R$5`8MXTH}xs~ewht|gX>W*0eU4KoUks^%D8RH=;M*6r|%)x^Xv zQgmJa+KGT^w(4Znbtam83F;ulX1ge#%6}ChS6pmqMO6TEBT_G-_TpO*qI<6Fb2|Sm z^@hp_L3`Q1<n@Hmvq;OvYk>lK25rsUpVvP4qI}beYQhAjL#->FR|F(E!+gUO0&o1m z{sYVN=Z|~}7}m61*;yB>9Y~?lcQ}Ty@o_`84~a+<okDp1$<JE0_Dy^d%S;`?vByYd ziL}2q<V0A96(qUtOB{L*cN}GU)<^qlR06X|J?f1RgCbFdsLSVCuT~es9tI+?U3Cs9 zd)Jh&DEsB_C%9Gr4u&Zav$nE9r>6zl-7}^e&<Q#Q@pPM?`eM(6JpAN}ku#wy*HP%( zZ|3`h%At@`wP@kL*Uvpy4bmS2>Tmeo*|PUp@JfXWYsHU8Mio!2AjQECk8&Drq`8DH zb;HC>^(Frl9QPc`z$iv+yOY_%Y)hx7XyZ<x9IX~xhA~2pZ)6rrC%$^L7AV@rOPh3$ z!Ay%`CMnpdW7GlhuxCgAhE&XS!YIu%MJG-Nzw6Dc?$V^qaC^<c1Wqqa#ARz_hOFK( zu$&L6_*uwK5hkb-^q-L=&L;UnVx}am9g&%N3T5#0G>5eM4mB^(pNA%4;$KL;KTq&U zlq{JQEfcf<YY7smOXJ(sHy4Vu9~W#0Br4o!<dEh(s*RT&r_ksr-@h2RZaSX;cZsWP zWQ}7}lONd~)L-~(D=T@h<L4@yG~@_%)Rz~&!St>MO;VvtR@F1kzsR32pT-%rOcxSL zoB1h20->lHEsp6Gq+=^|kB>u`47$Gbr)|V=BB0EcuoN>X_ZP6H8ol@ntiNodeDmv^ zlajv3Trm1-8c{jG*1GD+OSwOlBN*cM-kvjF{Yfj=nNW#}aata{B#Y3%GrD{2wFruG z%Zg)qvEw;a`^8`K5Ud`rU9(r#*6x5iwKMrFp^mTzR&;~LqKRRTmI8yh3!eUk)^Gsy zPXj#aqXU2OzA7i}mRZ}z7*QD#q<!qvRI<@c%?QhthHip=OQK9})x|g+GO$H@$~m4B z@K>CBSxzXeS+Uvf&-1<R$866nSe0cF0<DEX{>dB>h<YRWIG#;tmECz}%EJ9;e0+H` zFp@#W`i0;w>nR-le7arD+&?$8keQGd7aKt**ov#PZPVS<%?kdS>lzd?;(MAs@UTkF zrvOUD6E4L{51nETOzS8R``5HidGQ0xDW{U$rbM{o0on=qgv-`?3h1K}Q%ptaz9SFE zt`B9C=Ld&mlq1(U1s%Yk&i6a{--t4M5uEL?K4;n`rX5MMg7OHw;(_e!*0Qe8p<1Z1 ziDP&V6#4<O3tA=L!Y|ReH`;aM?w@+&egaltOyq{Cx9nro&3^~e-YYCT?qZhuYX$(V z?k_U=w^V5T-eB>qttDSwu~&^~LF}GX^ax(Hi~aZZ*{4JXZK|^E&EWvEn$)Izqr1j# zdNW-?*mQ|nW}KT=YctF&P!#sL%OV~i%=ZvlLC4_;>1c|Y!xA$Uy9x-kIIr_+pMCmY z<M`^l2;ZyCOsWu5YFBs&*bjRU)WJg*@y*<@AAFf+SeJ*2K%*aEl+Fs<^o=oh+Q%Xr zzE}74%5;3%o6O+@z@uxk=YW9T0<qH0{zh7txXThs9OW$`3t(ozR{?pC5A|ODpa1Re zDY(%ibN*L@9e##KTG_ux&ws*hL*AO%;i^VO<ONMd^^Z4XDpg|jLjKPI;xoC!E=S%x zH@e&Pn7Q|CiF5MFLnlVZib01}&H)o`8VvB7sO6J&S%SZ|T|MvpTxTb?PwZ9V&a#2U z9s2BzS1YkP!JX>sF$SKgGt4ypvB;HwjwO18$L>)$_EfAeUoBhfm~w?l0{gV*q5sDq zwnNPCgfPqh<cG*~g?kW^kccf4MTvB=-h1Fa_e)a`<o3u;DMN-2kx_sojow|L!xbjj zInQeJalbte#%@o3(N6#|YzBKIsC@1C>9UmOQ9*|f%>C$p|I_^z29_a_dp8LZ=B6?8 zn^XdH5dXgh{7rCwc~I=Zlj<a*9P=~3EbTWBUiT@-hmT{uL1&qdKR)<xw)%fg{9jUg z+K+=$at&*IdnX0t&i-P&?uEbq6v%Ii{Qr{UZzlc!GJ@ZP`@JP**6=T=G#LcCPXH^N zpSGI#ZlAFKvgxlkA<N@Pm7SQsY3wcVcm_Rw{?6RHk|M>X<NE~ZksnVn_412jKk%{3 zlAE~mq<>P=bFxY8ZCa<TIkpL7RKa`XvRGQ?fdG=@aBzE6+s&LtBTLOA{LFTxW9(O% zEcSBybx?-c=C{!CfUi+)i}IvhrOUdID8*vfQW$odGQ8^K&GP)X*n`+{F9iALOsnI} z)0k$;ql%>~DleR+2K_EYkn~B`ZFfiOfnzHy664#YYwOiKgFza6ld+}=#MM56Iwi4u zy#Dse_>}lta<u9V0qeA(Od@>U`eff$@_xn)Z_>0^dcCUCKo4Jv?){DWe;j8&>NA|j zxizowPo_)K=C3pGQyCGO>L)K4rR|UY@%U>F(RI1&htu01L>4yoe@`ite%;g^QG&rU zZdHQal(gxl<XnEevXShio!1o5lv0r66nbQYjQ3Xo^57HG-wBkIQ+JH&_%Z$!iPYN_ z7Z<!fkp25BOU(ziRS{devBIGxn_=jIZJ&&q)gr#(o!6c1mFS!jJFJT9(IG))1F#a0 z1ASYc6fNDkq5`<`k18T^1gP4fGOf9gmd<TfSh6Hu!t5@8-?b-2Wzi^|5QAH*j)n~1 zVkrhrNBQH6Ow-ss*+k5-XOp&XX1n+<lBxzM@U8<ti%*JdCdA;Xa~%d}f}&LuyeS73 zf@l7*Xm&2lTR6VL!wMFEYz{?ims7?A_1o(XlN}e+p7X%q^@aJ@;`S##Iv{TP{U>&y zXeaU{XO!lH7yorC11QsO@Mt5p6!yq*7m);DwEA>;eZkU-j2UZ6M(_9&l8>z|>{w_I zA|a}vRB=8%Uu;viwysg!>}l~iN4h=5hV?msX$BUrwce&BRk8W_j9~zu3Cey}$w4uT zCD@NYxfMJgCN0ehJSskcnMt*Sh;s;Z-a5C$E=H3!)wpsYw;)F%z0eapl+YC+`~+}l z)c{PaNXO1qfp;2y7)_v(e3!SeH7iW=(MQ5415jE&w99K4_f+A=zo$mPmx(q191A2! z7`{!Sf~+6B0>&!=u)WV;y;(?oT{`EutCWi<gbvr(cQs|fY8*4f1+vhq5=X(Qy{uz) zci(8qrzolWH%eLgH<nL0M<^kAUnXI!#E(I~8r*VD@n60#78DiG>^?bqzW!L9I4V_& zqvYrGVb|mElq|sK)}?7E_qta!yPWxu;)L?pH!_WO9;kYERCiE`M`UxzXZ((mZRJKL zpRA(iMe2t)I*$r9WYk@2C&`Z-dKo{xK!uF&sy`h;Jm`HqM&Yp_oxnJSTcS!Dg4z7Q zO0DLN$~wN_t1Dyj@cYi+Z$(Mw+C&<J%H}S&w;Nwx-ZlHso;#me1{vTpMi2b7CJ(5$ z@~5_Y*{(OPp@0i6^p43|zvgmUsRdb>u`=D5>#$sjtx@Cs>|11TVuf1h3vcii=oBF@ zxu%_X&#COU4Wa{KCzjKn7fOTsTPBS&;X_I}e)^nKotv8XWrCJ=I+h~+*leI|y5hUa zmd4QJpk1{JO)*;w^iO)o#4fqoZlOK`(nFh^8eYwzVZs^CtKTDBU8imfqv@#(42rcd zNeX{OFLbw>qCme@@B4Ab*kdQ-a5L2}-Jxx~cbgGfF-g03VcV;Pp}3QQf%6&6(efDM zyPYo&fuBzTv^yK`;4rUXQFkRtjQ5(?!*`?dWjArE3#y(S#T-uyy*}N;Xj4@+BGar| zzwRR38D*xjwG|B9CCyt(QrR;RN;INfDkj1)a?6(d?ZR8O%(adQ9G=Lg&-p*00?Y?V zD&!M8R=5$>G!pf7L34VRtxhYo;O<-6*DG&#aXRC{pwdK!08YTYk|e5b=-Wu?T3MM& z71-t7(dQ&ZFF<+?O2<39-R#7D_6KI2mIsvLGY(s9vyy1cLp3$;N2H2B542}E<)`%T z3e<%{zN&V36p>FV5CsCF{3{T)a<=bY)9y0@uR!98we%Ri`L`o(qN!PkCZ7(eJZJhp z1P|xuUsq1hWpo?$X*c~aVC?Wl??2;BJ-Y{n?u*`YzLxY=V-u=Y|5esY6!DeHHL#n# zlQPI{7WGA?Hd+uC6zuQ}IFL7$RO4D^8$Vgicw_sBNsyeD8K+vAq`6byO|EU2J7$`D zBGSTaf(?fJFAfa!%2Kp-?m?G!E5p6e`@OQU(p_Z5vlX)*poH9G^r?L5D9NaYE3J-& z<FU3u{VUF1M+@AFCLc8fz&YqDQR{UU_`FIVJ(XMt3lfh<7Pj458QT<gT}1H54Nue? zk7~SyPl`xZ%pMkZ%q}e6^wpRfj5=9MPxqj!Dt~4;zRoLbRMgZYrp+zzFHp`)!=f4{ zcZ2H89z}6`_At122P874qtLBw*p`w_7LsEd%_=p$WJvkoAbp_$!dPnB*zJ`feLwLQ zWoz~w$H+(3Qawo+5&_u18+EIP&a+QkVg=xsXTz_$Td?&EGvelGF9#{}WrTeXXM7?y z(I@UjQFIv<yQO@%T)r;=N8D6RcvpSRZa<ikT=u#1Q6STx0&tHnss(<W&?FgVRubr@ z&_5#UO<5kfN}a$MyjVWt&7$HDfcEh4j!8yPn*StzefM<^`G6JOR9>)C%R=n9<mR(g zHVd-l>OLK|-{DlA@i=D=a?<Y6-IXJe2^Ao-+%p3Qt)2Q$D6f{#i(T^)Z9mA9?t5kf z9GyHcYCshv3ZmiEpsu$<&!*Ub48R3*HTJ0*WRbTa>%p%--V`WTifYXAh-jFWwOs;y z&gIZEKt|<8C|7w;gR{F-p74`WwAACGXFf5_gh_#m3NcklQ5sO!%$DGYs=3|J8PcCS zAz}&5i=we-yJZ&UNysBECu<4@5kgfvWIc%4sx3JV&C?As_y8Q1Wga;gS{v9Yjvowq z-&lOjlU4s@d*av@2aXa+s^p!lDD8(hEV~KxQP59K6^u26JZ7$D9rNlRDjbxDGp#Rj z9N2CF9LTR(xa8Jz6X$D#fkeY>!J9U&ilEF+@2@<U4uGRO3XALI;&y9Z(%JZ}?keq& z0(Tb9kubdhX-7R{%}yeZ=%h<BgHXpr(Se%DUGf#b8nlMqJIF^`F{MU+vGLnT&Ek8U zb4;J?oe*L4r`ZzNZo5Kc_*Q9RThuKnFdxG2dCe(v=zM0vaTVJ)n_l+l&a!r5u>X{z zszVVom`I!UCP8w_YCC7NqsaNYv}4E2n6c#af58s_`beTacjMO%hs-&FfXpWu;&k2A zwZiuqucPU0Ky+kPJ+Zl6;QQ0-Vy<xyBd?aX6?e&+Y21;lSeb&!%^X~ktJMeRjm2mo zea7p11Quqnouhrp#SyldAGEUVIv`t`-7N(j6Fe3Q_M89cF|}Q3?Mv3GmFBzSR8<1( z-!E<Z6eZ8(h~YZ;Y&T{7ys=L$$E%4=Ass*D*(5tY34f9?9kOi^;bX}Rjp->=n-b^4 z3jqf}5RrP~d)(Gd3MoHD_Y+;rf%-(OWQM{re^=VDTcO7k8cbdQHW%!smP|9Qs%&9g zGYf%!JTz13Al`6;P)vmB=uh2rG5(j)&ImvCD&!@Dm0-cJuYDBrPGVAI_STYyvi+8_ zlxg=<QDG_5$Ql#RZ;Yt$<jGpbw<X8N0A~j8vh~h@%0kG4QcClcEG0RnQkRgJX}xdQ zSxvw$TZi(Fq<(68`;6W&8bK@c9aJaCc81$}E0zF}O_UnpZFWqnNOr*Z6k+in{rflL ze7!cpa;Qwzk;mIB8N~IQT{96FV&E>*F)$HjeZRaFY!v6a?uF2FFI3R{hq&gq1rp*z zXESso5$$S%*i$r{v5hd(UJR=~*bK{fkf~hsNDL=%t(x%y{zBH&w=$jg<~{)~2^(&J zhL^W;RbJFb<>19Z)`rEwIE7?`&?Gsdk0)w{WbmhdDxb3&b(`$WpyYNh=2E)>rH^i5 zUH~%aj_n9Jvaw~0K}%?j0q4~8F5^K1x%9BIXBAlD{)Kk8i)ZdY&#GIqILw&`+|FJp z?q{@{{EUXjJ=k95<L9;j#wQPL|9Epztpc){10?ghr$-0It>>P6nkr<e+q8bi^$Pzj z=tdh*wH+QaC2`!V?ZWXS+?q#}r0U5_p~d$^iSFR9Zkp>l%{QqQ>3Pj(H6S4?H%1A7 zV)CHa{M`r*FKPsEpn{44<m&*LN-L*LY&>5KEx5Wcu%rB)zj-EUiJ<C}O(Qi>ymlc= z6Pe{41wNY5AfuAdMZ`-t&G(v0S8(i0-vvpZ7>DsaD$O~ULTOFz7a2)N+VPNAx0yDo zj2U6_Z-1y3kRnLw7HCP+M}vx>)08Q59DeC}#xciU#wuQQAmjwoy;7@fp#;{MgpkP3 z=Eg#;qr#<-ubin$ukpAqVw3P#6!N8;dXgKZ8hi`G+Hr)7c~;Jy`x&70;^uC6b7CR1 zQ@tRwF25n5`qLWK7P<{NoV6C+r}?#8$T6UOQr)pliV+gbHHtBsjl<sY=EF~7%0GGU z`J!Zl7RAu=L^$y~LNjZ_?0z;pkUJZIomuh)deAGs=>4d=h=KW+Xr(Fz=_X|=6y6uB z*rJ%!8n<TNRDj>vA!Tz~K%WhRHU&av=1JxQzU|<%&yO>~aOy26fyqlsn-vQhSkJ$f zS_B-xo-C>87f|+HEQm<^8GK0<hDlSj%wcZR2=Pn{U)Tyun?Z=H#W00_zsA~thh*he zP^(k0+pC7=m-fbO3>E_j%d2oMX&aTW1PN1IUxg|W?7EY)F>F&74SS++N*dH%nBA_d zQ=?Nl2FFq;6PEy`U*c{PMHYgy8PVVp|LY-P8V6J6dfumNvc#L`@lJ^==5-351i$N& zGMybwI_nZQ-27>`m8$=CeDWNk6e_f6#@zDQ%C(yPyD<Z~jZFdq$$2!EC;^#H*<qjd zsOyue*^%|SWJ^YaTf13u$CjD+zBDZiDSZ931U`ygYF=*i7>juvv<m%ORh<8(YZ!RP zqxVP#$TV2*pZhZctFw_W6c?x6Mh9E`vyi!8%#6V@1N<~7`Z=Gi7I)e$=vkOjF7<U* z)a`YHN?~RK|EatW0Bo1dDx3F%J5CK;pkz@<i5Z5&rxVwY7=T%Ar|gn0=oz?~v;_;B zLm{M{^T0)1mIpnSGW@{ymbLMuks>)3$mAKX$DJFuGj`%hr8hIk(dIwo&N+_l`CTP* z3q9t@$nR1U&goEQ(yB3xUFCLgW{`R12d!$+MDunKZT%C*$s{?vgxQ!f2#X=JKn^Mn z)zOWsw)<LcLSzJ%CMMNAoC*`fP5mEIYKi(2{0uXP+5(TXp<PBci@weV-o>jR6*;QE zY!2)17NbTU9kLj@Wczd`hoiI!094caZeJi7Dq+PqQ&^cqpG}We8kpR5$LvINYtv>q zOjHgxYOQt5ZJp+^I(!f6?~zNqhv`%}1U&lu`$v877u|f9QI0u5=@VA)#7&oL0qaI& z`^plA#Fg{Uxo%c6OS(IBe0miD9t$WfxgKZsv@Px@v@>KB#sFEbob+X$|EZH|_O&Yg zsy2GTdio7yZg|I`{WcAC<*n5RlS)2K8=SK>yxt&i%8qWQ6#0Cz{jHvvb(e0o(*4qf z{sY+&ei`Dp!T|cNr0rD39mIoRZzf=N)CcR;cyH>AH#J{7r!X#9v4cHgkd$(#zxOh! zV*5Oh=L|t5qFAjP@Ofg09N72dGRb<vzcEOn%7+2F?)rst3kr<i=v#w5YGYm0+-k-S ze`vj9d2%If=Mb}-DO+&{EPw)NgWgGfa}@3Cj?FFkre^L&(u8BAoA3WrA}S#B({4}v z<JyFl^{&AgcfXudRa3|V#)mTQjL#ePR4z!G&Mzg@=-{P8!ZRn=t)iDAH}ANHQMg^l zNROp3v_xB@HZ%_DvA%8Y7-5iGlH76O?JbB_x3aN+uBL@d>!yaVUx-Z7P&VM^y(;AC zWRYfjq~h?FPVSQWswPcHG;eo0=bnaF+<HfI#8AiWaa4K8-N$AbBtL&<rVz}S8sz_+ zN+mTgju~ZOCV{XK^<mOA%VdUov*!8^WG0>_VakRs^^P{3x|EARPIT#R?iD6xst=57 znzJwpz8FMrCW*2PTw@q;5;2w8wigsI&O{rMUrppm;+QzgG#h<zA|vfJ?A#8HmzSW+ z>188K3hG6UO#5y5*Xw`cQ*_u3W=7!lYHR42*pPKf%H{@sbG-P%z=A_a5dc_ea-psu z)2wo{S6|$;hG{UNv-)XlL;>w)j@FYUTBbX>tH(64#=I3`#*$v;sR5c~$hS1d=UfsN zXr~o<hOU(ulU`govBNAnm3B%9NX^KYvU&B@jN4q{7Wh?XVip)!JA^H=1vh02URoOj z6r`p&4o1%ormTaUvL8I9+>Bd~B0O6ipSV{^N+aki1LIL6Ktl`()G)TVpm|U+{X2+x z4r1{^yA`!_Lt1lAm2v*P#zc@R;#tV1@8hbq53@{lGmlEl?eZL-c5JNC=bQ@%6-%9j zpOT!$)^AAuOp>u!vDJXXc`e=!{wxi0B-Z-1QC}~I>Zp9`o$EGrJ#sWx*-)iLqzQ8+ zYI4)cHlyCd`Wh>f<RKqwtTAWojocL%=V;ahk#$FgC*f$7sA>9n;BkYh486I{&ZIfV zVf;$wbMqzr;zD5jQJJbR@=8ZLA;g1OjeD~Zsn<>QS}S{3;&f}{%(-2ffYNlp!!zQJ zG+EO+&MC(Z_;k=>3fDm8svwCEQ|()H`zI1NZNKAXL#p-PF6D8Fd)QI+7PgY<7QJk| z{q_1=OquXdRf$&DOP&d!{uS4)s)?yRg_dbmiva}s;pNAJpd4>N)}bTq1@9d`ByDy- z0RZ>9CCp;y(yBpccG_3TN?u5%qN{RcROE8-5U_eUpY985-O&fXGpz94tv^t+Sbf+v z*bMZ<u~0!zz$4>8=fy>>p^z>A()o`gPWiCF{wL^`8soa%*Pxc<pBh=ziU@)-M|o|9 zp5<nuSIRiLp#$%!es284^Fx>!c4o~&C0QUNSq4<JiUKNQLT;Pk))Z$5FHMlG!)uo5 zOKPjn+%?BUSX5i)+af|_t;r6#OA$q;fej6M_^_@w>9t;ZpxBU(k<o5}Y=IDC3UY)} z*`E5b^kfNXGh*6r**)xz3I=KOnrvNbXiau^n8JjgcQ(qxtDu1GqnLl%t-Cbx6sodO z;vdg)Sn)Rv1%y1<w=X<Vi+fOF6Rngbar?PAx=nnmkME2=IE_gp-7EB}Uf#?Q?|Q=l zmS$G>A3xP_No$4SldV|xebk9l$hi?`79KBQY9;J<G>)fB;qLXgG-mR!S2qrHhiYAW z!K_N3H%g(uT<!81-yGD(2^`$Vc`;O<Q<}}})?~_OM>+k&eEF|98VfNakXlVZ2&rn4 z*)E8XZb@3{T%4$+H_xe%*DKk~<A%57Nme7YxmQ)z<V|xjg<80w9%r!4yTho2v7E~% ziChS^^|#@qZoh*QTMbyk@|y^Y!*h^G{dwr7q*OMU7D^5ctea=ml-$uE&|^{-wl-@y zA`3P`HYiJ*))Ea`DB_b2%uYvab)n|DDFJI6@?6d4oKq9A(o{2WBlub2CBqIhbmIS! z_uf%WZQZ-@DK^xDO0fef9VtpZbd?^Op$Y_0sz?(;hrqD_QlupWLW@#F1VKUx0TK=( zH4vl-LMT!~=n(=$2<6*=p7OrGF}^YGAK!QHxcP&TF~Z(^?YZXKd(HVg^O=}Bt!mH4 zi-x;sJCI8MTpGo8@bWI~ffXNE;?Fd`x1WPXk&gUy`_HdHjh!R>JscgxW@Z>MD43C) zmCzxV5}DO|BBiYVlj<Cc8S|+JVXK?k53gFE7J8cN80}$h_-!hOnM%uD%44s8jI^^! zSC)7tUczLv7C5gAE-sPcQ3l(zS0WbetBSHV`|RCl*lxy~k2-6)EULD$TNekib3oY# zpLjHwDtw-+%0{=|YQD{>5Z6Uzjn5-!b=jW<RqJz#fqh{8+s$~b4X!vcj}-yd^Ik-x z_-qs*{tcRb2@F75z~;l=xDz$8y(#4U`gR-FcNpW|H(d^EGsEc93M?1=Z^<YGT|!rF zd1oHzgJY`W)23N$#D0O0qXeq0hvPg9wQfxB%t1eoN3)tou~CBDyV$3OU7;x~Ih}JN z!9J=zJBXT+jq2s+dLN(q$io&xe1g{vwgsOr`Xi7(f&H$ZwAPBZT{-(EggIlWf(~i! zs(5?9bvk<vSDEkSZfuLi>kSEU2ctrWQ#q7aS82Gb;s!28{0!EO(CL@83(Nfr0Xe(P z)~F&}#Bf<Une}-sbV5bwTKU~)9u3L2U$SrBTX|Y+?ek%wM%?)fOL*vnt*w@}t=iE2 z^TWkiqO6qQ%#E~L#m&}Tu=a}$Ev?>)Yby6$CKS5fMrA$i^v_Tmdwpp5g!0eDbJL+N z^IejSAs*5C<tyNzu<`^95hpZkXg+h2k+#54imLjhb#<t*#atU#=@KSB-<jGWbF?v( zmh_Pp;<E$E(M90(&h`hp*2S~@7vQsN`aHqP2?IT{;DZT+c`{3*duLo$ONHUrGi9(~ zb&a99-i3(9SVCnL@zQ{>Q_UKSNB@KuOS~^6$_~BRpTxU(AmpsF!M$@Yn<YE~(~;6% z&6kygvq~m)(u82FcvXey%NOfkln8@p{>iMxoye^$t(m!QY8Tay^Cyrl4!}=4t&6HU z>s-^<yiTZIl^ymBzHlBUVZ8!<Nt~lkyT&2SUQWwSRGxux1!Y(tg*n;(kN2QlkU=}} z+WO*$%(Ip3B2E@HRYFed*Tx9VTTOMaY(lD?K<w$?su!v-^(v=}n<v;7OSZ#St}`dY z?nra62iv~CawRQcj<1%B`GGLEw9O|Hve0$vgo4N|T72A_BPn}BkKW3PEWhy(zq0`u zo4#ZP(6Q!l$pphOm8v$Lyv}=`S7Tk%$6PB$dlDA&=cKqpU%Bm4Jeu%v)6^l;Ycthr zlEpB+W!!UsDe!MltD&VmYCLGjpv8AtA?@}{$A#rf#Rs0nWNrRt_*jc!i@hLX!p-*_ z_RGL(0OY+rSC%N2J?o3OA730-%~Nk>Zjlw6r_2|Sc!nT&%+>#Sz(-~dzxFr6AoFxI zftn_yoaN=1+T<%-G)-+>9V&kRB6ayPFj7lCUkEkJv$2AUDa9Rq)#^RP8Yq%0>EBig z&qiD9F5|u{|7GcyAs~*L1Z^Yk@@>ULwVi?a9h<P>X&oD8_nmcvY=)p3IQuE((Ol`R z(qk<BORSth67%d6#m(?06@$ynRSm=Gx#g}aSB9MXl?1ywi(I9(ucPOtp%FQD02PFP zG6?;i(SMq;S?t~vb@gZKW_2y_j8}ktHQIK#|4b%Tu+}Y0Y{L>lHU%u%Z#hj*-sOw_ z8)Iw(UeksGbDnKH+xCh5C2aD3Pg<;O={%}<8$P_+<P+Ex;OV4^{v67D6kHROJwgb( zmR%w|8KfjWRvMR8-uF~+IVO+?!h#d$;RG$)RB;=gXZ{{O-_OnEJAR%s$<qqpH!G~$ zPRqE?_j8G?RLv<LAGNg_V$KXYWx)MeLoS4?V;Agrbo>23+Nj?9FGv?*8?{WfW$ujH z)-7<l?2LM2=M)B%KYkWmv5s%%SL!Q<9d$W%5>}Kt8O)>BNI28B8qoc@S=hlABc>n$ z@<BX>WkAT?;4@<r=Yx0DyizJL6PBIa_{pH5RqhDdqmI?k`w()wpn}3HRdS19^+HHV zqs+MAh7BLUH~u%i8nJv8tg`WZXXg#oH}OQ)nLrv#Vo#XFav|px&tdWI>sphms+@t8 zc=f?;d~oo+_Y2hqekY{YSYUgLzrq#$Ue}6~u2Plcxpljg7VfQ_C0(4zzqXB=(kLAu zR)Y}JUOr;RfSn-FKR(BkcW3uR1EYT`NL9Mn{WROKS-1Q2^r>O3=W)MuugX|D4Uj)o zjnupo@=~5U|8w%C|DIT=0m6LyGhQ#u4m~aABz-ICGjo1#+WL0lgNsz_x=KnUCKX0r z-lB!Wj7E0tMn0yY>Rb$z->q#AHY;%`$E|rCY3vYW)9i1R`$cmih--aB&1#6zR-up2 zO+T%x(A^-TvqkY)lZ7;^r*yf`+25N7i1n`JQQU$s(V%m(c|<L2;{Px*z~!`fkAKAu zl-YUqucoj48bx@OFt=3ow0Y3?7Zs&~V!=0Xq{^CODP%6<DE`b^6ktOgdrt|Dtqd0z zj%FJJcFwF`>_l22@93N#=Pzsg&C<pF*E#s3@f}rQg)Sl<Hw`>H{8kkEw*04XYu|vk zEdw8u&fv2Qnep!OW&batgW5VmDDA6y<@RY9f&I^}`++CrW-0|j+;w7Dh8NSrD4}{% zduN~4*$nCG&uiA7nLgMrxo0`MQNVIlN28~y?cCQLpj^Bu(~@3f<|o(y`e$IcQD4}& zOu?_e9$_ccRaVhVuakW^^|}&eiWhRxZ8n-YCDyd~?qB#8YsP|hAaKTshbkOEz0ZGo zo(On;w7Q?2+{nQll&vUwB3lsI@VW8n+y~6nHOJWTw&TGyyN_sY*M63O=gM+grR?pI zf`h9L0g#_L&o8nynu@41ZpLH9o#TT(l8d|4#Je1&i>bf4yhO&knrL1Rk8E14^%^a- zt8|IKh8Y+=u~p{!;Tgez%PX6b7`oO#1DOzL__=lKM)({aboRdp2^7=p`}4otH2jI0 zZhzBoFhVeVwfojO=uB`;_|fyhHS3{jqvGIYcZsyGcWMm&boH@XgPaXwQ}SR2g@{)k zJa*nI#i9GDrhQZrpLp>^j$=~c9U;C&nDDEwAFFIUhlHNnRTh+V@NZaGsK)DXoWE(8 zlD_^S+5dldHT$FpHO3|#;g@&uIKvInJ+Y;~5jXdtrWUz9z^(H_u#KK9b}u`HUxCRR zX630z8}(a&_W@iggVc~bP(YEj;FpGJ`XJO`I&=m)?MPhteVU-D_3MY{sVwZfR+N$7 zxB=qm=Uee2$8a~_D!=_Km=-OpBt7=}QaaMRiz40V(c`NlHte)QpW*z2C7O2_sJVTR z`c>+JR(z=|{wYA9`Zr1BTD2~Mk0_w*Vl&_RB}5Q!-8G({3ZD&9I?5@vQR_u+V+1wW zFDO`eXkmH85RjGMIiVqH;m8VVjrIlsH!hg~JY%M*WSi^F;P`tljoy8Jug2gPDNeZR zmtO6GKpGc!65@_{aq*^ydcYx}g&$vMRq4*~|M!y(z!QS5m>RdY8Y#Cz<}pFz=7wLU zYJ5ymAMzaKWb^9Uii&gi2*(9=SJnxRuYM>a92%Bjet1|lY)8G^HQnlHEf|t{Z`pcK zNU1MeGwx|u|G8rJ#geQ8{lDngM$V~MUmYWG8ncEIS>N-g)iQ1~dPp}aFAQgevc||C z+Q`@#nN`>r1bC&**woe4s)5eJC??@44HYW8ynuF1_d=@<zw$7|TD3cy*p{eZ38b%E zy}mK)aW&Z`H_`nv-2$!t0)`Pe>Rs%zPXR@Z0S4*dsM}BWiJ_6!qwcqkTz-1;R?C-s z#BW6aizT5x?(}t8u{8*Bl{fZZqLdCR>RLIU>4${5xF#$sdHzLqyX^2S$5Cem;~5nA zZpFCXRv)=-^QIFZg#av_-OrvVWrQjauKR=<E>6P}YzB!Hp{oDnxpLfU`I>(=#ehTZ za@ga4Q4~)~)&@?@eknmKg$}E{PFXtopNBQ2GbhpN;&nWmG7eqKlfC{!bHCmCCxiU| zHpR`e{!8N;z+8I&t0e6I5Sh?@kNN5UN1f8d;swl?XdTIWV}9~nLo#<gX~|kV!@^n; zhp>B^N<aPabM_wLtL=??V1a?aeI4*6MjeN!>JT6}BQMb@zGU0;c)|HGbN^QUc(hLs zYs09c6m*?B3!*!6-0PPc+>dBxX8^_WsNZp*zKYdDj1~FXd$08FNEu0--apcwb5Fa{ z2+7}eUyL<k+}ozq2(vf~4iVk|{n`WYcd^%;mWN280)5F~X`W;Izr|X97m5Wb(Twgm ztw%8yl80jMo%8feISB7qD=vT|+dnM0d)KLGy(7(RrB9M@=7D6?!$uC&#(Jao4hfM_ zGcS>ucRR{^J+|Df1Ws1v@$gL2BTSvf(Yx^8E0A}3>csP5xOOE8yzoG+PnI5QU%Y^; zN-9*?1yXj$$yQ2+{_R8I8;9-g3d}11)SZ3X37P*Gmx{u5CPx{G14nnJK4JcnqUbnx zOYF3h4y-SP_huC4A>7T{il6<-xI^P$1!mmURMJ%U4E@_=qawwjT)Wjg8{!7v=$s>b z(`Z^?yiML<7Cp9~wQ~tkywe8&6dA7Y4kz2$6cW9^#;c%rZsAgA))C~fW7$_<wY6Iz z+qO2o&E`p}iau=LZeEeyH<{4BWGf3l=;t%G2~6L`gjQY30OK(;7H;K9uatqRiBt)4 z02`rJY-`^;#F0!Xa!pfMNc~#N{kYF;lvwGJsTBERveY;``QdVq(`-<GQ8Kb60hPhV zZ}R0%dC@0ox-f&sC$@fO0g>aW*gUm=*%!z6$zhHb*^@E$9NHxohPu&Fx_-<Y2_J;! zJ2%pOwnB9r%-LZDG=1mE&<i32f0OmFf8aPkg4qn$47+F}*R!6n1r$#mh%3gLWI0yt z$yxsN)0KTeP>d+}6)9-|`ew+2K)%kSQ&L`pa_q~za;%b;+##3d4yZIVQ_6NJH38-i z&ExDbfpOwc-8ESNC2Y8``PiXxL@7tr=)z=Awa1;60~?BL6o)5axDwRpXYoj3K)ZSO zvnx*sFd(Zk%oD})9jqUo6R*>oInMp;s4hamg=Nu8{@viHnHg?O6ue?&Q|*@QrgD0S z(p_V2HeC%UJSuyJ>2hS!DFdGOy>jOalP@4WlA6pF^7>^itL&e@4M_6su{4cpfw^D- zg?kdSV(K&HqpyN9D4Kdv<A!(9o(?hIs-A#Y)1Nr|V1Q`o)au|#7BKcqWcp8$i2GG) ze=PryKjzS(-bA_eWhynMqbGX`ZBH^9D>m9<e+`U|7}v^vN{1h(Ya?Ed7`V9H;g{1} z#me;*HTN#>kA@QUU9?&FJ%w~vx<%9?ML}Y0Q)p2h^q!4ha#RQT&;Zdgo%E<Z%Dd>M z(_HlvX+cm?%+zXNip<s9v->A`;qYVehI0+i8)8D$KA(T8@qUt=d!5Q=buUU%$73{5 zrAp#T#Z9MKNpsJHhI;F)R5lG87J=uswNizbO1W&PXT-Xwv0~uCz98NQ0!5*ht8xOy z96P)#_dVbb48Z5!W7$sjlPmiqlumo3!22k;ppMFw?I^6{C{S}_iE&dtHN>UBxOFYb zK3X(jR_~$nrDF9Z@fn#$TW5M{2JwF8NKM;lvuhtncd{Pv^A&>~TyZh{*HU`T?~p}A zhek)&cjFoXOmN_G2*)T%Uu1ihF=x6~LmWSJ<_-B`%G7K!vI0QgPrK2MFB;#Bl5~Bm zbRM$iIy;o-y)#(hz0(~iX-YM{9^bjyw5Yvq_W>ysF_5y+>6$31BVZ$AxCp_U&Gr{3 zkxNjs!*ch4mF@#k5v^2j<&dgg6vMoqx80h}!;CwJmiA!QL}+)0LeVPmXlBaD6)C(t z_*KiiZ~OPEn%l*Ht&5`{BrXO?LD3E=e8>^m0tN^f*tdCUOdFx#`Iynelxxj|mMjAg z!SFWf8RC|ru{TL(CWOGIVXYz&>EGA7fIfkh(-E+R#tf}b+sL1XW|n+oYpe><WG%9~ z$iZt#GHHz#*zvwgwRw=hX<OK)G^IhzFZtBk2UMos-}i#sK=l{!VuoWxz!4gLKk9xE z=f4wM9Nz&s&b`lz@*nQ<<oS<E<~%@DVUJsV&JBoe_dY`I-yg4ScXPgP-)^`75_x;{ z<U<#JR8WC{Z<ifRa;f-~$p$Pkc!w4gat+AM?4M*$biCzRK6UuXGTD4vA~B^2wS$&+ z&;VB9{(tPtj`OBv`7>IzB2{KMh3<t0e*;l5zXHM8-~R%-et0f7JKG@5I{uVobT`y5 zK4fJ%j3jbf2z+R2exMB4dG2jLfj`GxK?ARa!QGMA)@XT7Bk<^ah*DTuUh(@P*SuvZ zsAFpbGnZcLx_-GW%H3!}Iqa=;9#_082}|6tsMdS#rZ^U`djq$cZUm9$k@15&@SGd# zJ8dOBkr{KxrT^Z^e)zpVs_9<Gx`)e1mG-Mni_2FZh#WG>?p<6&E*gg_SXSx`4}l6G zLqeG(--t^#QAT2)K5=4lOUd~5dWC`_St3B8XVV@1@U_lI#Ur1w(m9#4rrIKQ+o)%< zpQ->{OY`rI=k;-ZQ1$vv3m=-SP9|QcWA)do;8|A9#W44n_P2NV$Z;BrJZ}Q{L2rw~ zaxFy`T@Z^Ij@=kf-#imljLidKur`avF^<fWBUf*+T90)=$1M$df;U{&UoY&yjbA`Q zx6ZGx9=0a=9{NXN&Dr%tA+z0GNS)z>1tvbJ0c@kLdl(PEEDCYbI>X~Aqk@#_G+E;Z zN3FR<heCC8M7@*^2j@G>`MW=lkHnMkbB?VUGfuYc^p4kU_=_m)mcl^)u&5QmRIJAr z7d>NyZ<BZ_Nu(fzT%c}+x!$FL`eSP(|29HoiuR}DVHZqw`-lY6mr~@aWQ`q4sfTNb zbz&hbuXj=3dDO5?r4Hu%!0hsJ7m<e{-p^@WjAiPqzg``67AwSsIK)9}ABsD#*Z)Id zpb2Ln9cL2Z#20O921s>@I1%R$R&@L1T6NEq`|!9V4FaAroIo{FLoN90PAKDuemg!W z)mx3FJeh`l+LZG11Kr)i!_FP_%=;-~F}x|f^gb!3jNl#8ytx9zV^u{blBi*0*v#%k zhPE&0b#;q%iuSmBCa#gnA$tBGI`1bZ)Zx5=bRs{$6(KcP2eUF_Sr+f4*dX6|{2Y4} zQYbBca9eIhc{tVL6(jTQmA7^2Wka5Eq1Rol)c#RIgm8;WT3jK9i<IH@a0&0!Ek^Cc z?7NrX8Y4%NKg*jHEd+<Rp22F1(5q~VdS&ytm}7>rb$0#^Pn!n>Ebh@Fv03(n<gMZ@ zhG%{Ux^Su&Wc+)ZdQUO0K2m!^c#d%QJ=0Nj6+7H@n=A0`c3z8<>d*+5_43WoOcl{O z*s7uT(WH3G9rGC&RZ!r!D`ItU`Zv$G;n|^)+y5wV<TuR@NU3jgs1#-D)c8;#tc9Q1 z@(k8AG$B4JU}K-CaoY_Mqd)WtlVJ+oywyBjOy5%D%1<UO+2{kjmbH|N(Ap0RJJ-uL zkCzR%ERW26Ym=RMw@BB@H_@i3)i0^$rSKIZ#k3wb=afVyXotcU^>LenJ1xSXTuRvW zot>Q)+)jhsP7^Nk<v(N$_GkZ)<@ePoAeffxVdm&$q9NersG-M_h~we|N3os5z2sFC zY3M&a96xn9uiGM9Jx(Wks{}dwKn(sSck%Apk(8-Ok&dl<0~|V2-<)leM2AhTa+dY! z)>Lra@?Ne#hudtTLXX1ltAx1Xg10XJm-`)}d)ojd(QPgj-42FT+{U*84%WX&5fX4x z+`f24p;>zc1L^bjqCA80flB#7$-oRc*us)c)Z^6Z`%isH|F!X|L3elgn_E*J2J$Jq zeCIQ%A563Et0)E5K{I!&eSSPHoAjcR)&!K|W9;n$#l+uS&7D2v%6g*YX$$_M8MC1* z@|F71)VTu0VC1YrCGyl5rQW;kWSB})2F@S@n$2OAeE{3(-%>e!U{yg7RDRdHvF2$% z1n_^pinToa5#cKeqdMg`a4T!0@+n-!e+SrhdI+K6&Z302Xi(rgdFD3ZcMu0VK!vW% z+6)t`mEcdGGSU7tD=;%{pu6FQ^_eeDp0!Xj$xba-%_hgijz1L5&$%a(|EUFuG?-CI zM=r8&fB0rW(Fz0V^a1_Vw?+@Lj%bz#(9x;x5&^f<Y@|B#Q*J1Jy1ek*Y7(Ul&OX>P zH2a{SXoL-=7M}2a{cA_f#!-Z^>O*m<jK4Dsdk^hI5F{#T#8$B9>Kliiv3VwQTpTRv z_{duQVzB0eGwldaSx93!%E)+>kE_HTt^te@5&}GEpT~_q6IN4Tl%()OUj^ssHpYrr zEPqv*x%lUYZ)@AGFHIcJfT)U&qfL%RTd2FC98l3I@dEg(=}P=oNkW>SLK#gkw*{iG z`fSBdl@j7s^>^|i%Bz_D`BMjPhZqxc(ZnX>xaK40?EfA#(8!}Ty?5$CK~+AunhSXU z_5JJpnv_m=(Mk8IbW2QgF~tyuOOIc+|94#_&L#9CTFObYqIX+5BQ`6c6p$6$_m%&R zntZfO4~icvPUT|<ww68h*1xW;*#xe1WqPmJJ-o0#SbIQGd2j138Ef+f&H_l8v}{Qn zB%Z+DlmL^6WxAXF<#(B=FW)!%vA#d{FV}$Bp`grRE#u8+rNPrca2;`%uWcsZ10Dr0 zbg;Jad}xSnxZu?GREBreZa=jAX#3A&yDTprZ=}@P<v9$0%K3I@e=wI$|1}sP@J6m| z>wMRbVESatkIj@O3qacW|1f5DR!JpNDPIkk^7OhxJL~OBA1^qCohY&rmCD~BXH{*4 z6DH1j_>+nVFjPo#JHfG_*V7Z;Q#`R-LI`|-8p!YVWs6tuiW<ldXspjvRpc2uQ#B-P zb!N78$HE9LGpc<%TXcxes^6^j!wa7~rG9UVzF8*ged=yhQVCo#kUuAObU9h*3^{k3 zUM&H47&kTbX2M+awh4`r%(Q}S*R<+8=SNwQ6_W@d>Yzgzur<%4Z?1YkL{@_oTgn6< zQxJjApT}%17y=TVL%2cFvY>*Yhskw3#r<DYN8K^2?$8hqdi-#2CllH+^iG%}k=slP z78QErQ{y@}NwRuBVQ)hW-u}MXZP^bbZf76Q*@lqj#*cZ|k+>uS3zS?lKda(aWj(E= z<PJ36(7c^}Utm<gYQgB%U$MAUedeRRVEj<{hsPZ_-WvvTZ<A2fBQmae{E`j=`RXj3 zN~iJN7(cVG8O<22afph<;l62m_~apaYDXAB#Nr`Y6!mRgVW5Xo>8`8Q-17(P<;s%$ zJ~(p&?zwjSev6o&&i(CaF;7CgVt<*DnRC&(?$zqCRGgLv<S3CH=k)E8g|M{PSQ{2D z*Mti`s6x4xu`l9=0LYy+T7&2t&)lXfevjS7!6Rg0EH#)kg2&wAK|=(^`mP^AOIRul zkha_kuzI9v?)|yu2>;7T?|EJGMfwK{J0od+?ONSe#YS3UgfVxSHUl9!$OA#GZ@!F) z-ixy1_J98V>qU46)CXmS!JabCzBuyb4ByqYsdMPW!As~q--c|#kE3k-q6*%cM28F( zacAU~LIah#Qaycyix~Any?Tm_k<m!p4-FDH{&KdX&j~G5Z&2UCl(A(Zg7oFl>v!rb z0_O2vcPr}N7I`;VWKZYS`V5FfLFBJmIXScp7Eu9_V7Ak8;Znx)1VE|(@DoM5jLiY; zmTm${kKk3HR4v6Xh>JM0cc(YNdvOsv2yst3fvxd(+$!?L@82rtac756IaO?p79JlE zLdB<ea6_GBVDu1LL>>%IYHrMmRaskykhtK=bEk>z1=|Yj#i=6n{&_@$SO53^LVra5 zWkY~h>BEg^bsBCp9v9SLtR$a1>^-GBW4x)2pfAs}S^EWOWdnJesCjs&Rnlv9mKld- z37MAY3;7#NAN|bo4@i^!Y57sL8UY5HtPnHn?<ZJb#C>hvuY-r6h^PD@2LfDlEJG-< zi~m;?JLS%k_CDXkE(VAm!{I4qmFr`rv*uArr%1|DI!;vg*!@$s?M7(3ji4lBH!QL* z4l8w9(IUQn*lv`?*;2JoA?ean5WB0QV1d>JMSD%JT-k5*N8b}eb|8*G{#5DEB~sDj z4}Jlew&m(*smk8_fHS{Fz1s-?68DVZ*S4_nZPGMQ+#2b6mp^)G%@0-5nO;7<Kg~kC zyZ#M^k4SYY(0BmJzvDTf2qC<?>(+aFASvo%omJTHrb|NySgmdOMP>67&0Gm5J8@?= zf6)}o5BocXkeAXgIp?N=gq|zy2{vD626R}uL@AxMdXO<PquT$;*ZWV4q!kd+GR&mq z1MWgD1^>l^+-Tqu$j_7kO2Om@zQq4w@lM&>ZQmpbySbZloVbu&&}5$1$W9G6Pwei{ zfEtY-dDVN(Y;nJL5j`l7w5y`$UbQ@4$gGEn2!Wm6CTl$*hU#b5m@L}Xm@V2W7`~dV z6`5KBvRGWgwy~et8m}>pb^^n)lA_Ez;ELvRxr>F9Yp#z2)nADtHJd37<GRn^rFQvx zCUPq1Z0=<m%mTe|##vhtwz&Z%6ZAf>YLPo~M%tXF*|p_;qka8mtNOP+vw}mvS_*`Q zsu`TyZ&CG!%C2Qk8QyvE^xT^(;cSj)!}&pvz8$>ryQ)?>U+GGv4&EHoUM2uLp_Sbm z$X<&csnc1^2u=>05iNOkN0dR+YnAWMrLTiHeAjC)j#vm{!&HVw_)sAoV&2r8V9Nb= zU&1o-d`f4_Bi|UuDU&c%l(}hZ^s6D=gv?NvnxUPFH+nx$*0BPiG*(x4(%VTRS%_BA zI>kIqoPYPzvZSdK>3XwMaC!zw>hkvvN<!ex-7QvOzOIHwxCtrnc3MxI<B`j1N%tRR zufN_pkx68gMhN8z)ck;p4v||@goYQo@6@TkaWV<uZ(5Pp&Gqn)3?BF_t($3qU3>x1 zIc5^XK5-iLBqXh@$0RKpC?e10=8_$Iu(P={h>6mdEkKlS9|v6Vt#l)&8kOw0C2IXj zvoiCcl0nPKCes%!x;vUdqb?7{RX+j>HbA;$-$jnUJtYn{!niE@SgbsR=NkCvG73Cq z+y<`5^oTeP7}jtRn;n1Rk2aU?)wa){D1DU6JZE7B1jh?Zg$s_Yu^O0#XTGDin}Xdx z8ChFj);(_@NBt}8zZX|_!)2XoH;y7v4g)JB?=ML`HP=b4?2JylL`7h+iKs`r_@(7t zp{`8n8tw}>sxPEyYm}>>TMQ_9Yu2Y~B*w{*2KkdDT?Vk#MsIj5Bq{(EfIrs1zNOfl zS{{q?{GA6oA$r?#CllCljzL1-0qoufKavX9$~6h<Ub*zBw5JEvJ)*iHwwGlLeYBew z6$;k%@&f3YA+I$1Xtd+V8RQg?7<~52byc&(kHg|*GgD%_%ha}uR9?_0ARDnj4kbxC zZOuSWw;~&cF(skJCQg+z&1CG|UR^T_FM{!!at2Jki~u|C{f?x_&7}o|UQ2pmWGD0k z?h(PvI5rXZ*LBPDj!}htIyCs8i*9adW2tR^8Zd#U9oGt%r9K%kjprm?Z?2b@K+#3E zM*KYuus5DbaUo1~kmS8bY*TyTUPhDrVbB~+$CF_Um{jWDCe4^rpJ)*f(=QZpSmRxY zYaRzS{31>r$k|W&-CiPMGd_FK$eZW~19r9sL>V>>DhtZ^vT1ekX+dY>?f}nZlffMO z?vCXb;!v8b%L#FfKCg%9+{ZYr42|0cQQgANW3G1iVFSq8=!KdLiw?M1BG4nO(G7)v zVU`w`O6hi)Q2~OdsrAAO%k4byK!S%$t)TzFB3hiT^?GtXrM19mU`@TuXZqrGY7efN zWaV6~S7LLSY^jjPbQ@JMEq;*XQ^jR;ItqCuZS-P|va`JNBY+$_qrBxq!l<1B3Y>m~ z5`VmunFS$y=ueC&=VcP*y!hLKTsqHlc3mbDvUyF49=`_)!6>(UhK&`{>??~rJIi8| zvq6Zp-4si>w1#F?u763(h~Mq(BF|Qv;t9c+<@nE~S-@*i!XwdS%B${9fjfx0m?BkQ zdW^{B$<++GDz=f9L<n;zqBdX&nZ|MVLwlCYQI10g+rkn?dTKD0GKjy!m=Dt;U<F@3 zwLJfG;?#-KC}D8ld>OLKr>!#WJ%4oYu%Cr$VTt-zWPxX#Xio}&8GI%p1Bqfu?#++M zK>AFOc_m!Go|rYzNwuyfirB4`x>R5cwMgn~#LSk`m_>VmUsKT$u`?k7-i`)3+3OvN zbv|c=7Itb@G6G4sw=e&Zanv-7@~*U)otoyOE^JkCm;m9ju{Q@$)5BlcUhNcI{B7<K z@%TG+m(bUeuMR}jX1!34G6+QjZ*74@^wzsDRC!#)gM#CXQPb><`$+dyU5CY?yR68f zex9<pGhw4C(w5Ds2z_ziP`P|jFG|kZ4xh5~b|dcje`X|DgGsW)C(wN2P-GfYKBeg{ zQYc&tbzjqtukBADbS}$mb8%9n8e=FiiD2P1Z^83<PJ?b1YjD4r<5K}%@#?6nRyN0Y zPQaNq3CnGH*gC4H!FwPpx+ARY%=o>ZYZiE;;me#m+5XCmCP?ZEUsz|OxYZQd-mbc# z<7_ZhBUuI1-G^zfp4Mq>_s^d3fJkaXvv-5gK1qQ^dGMi^>Rl{!XH(FEny(~zB-8;% z672BH>7>5BAO=ol53hpGn9l+8{gS1dzNkV~X!r+IAL|z7O;D>8D@LG312q*4e0BZ# zX1?%+F{G~MVzQ06-QtSStzVErHutXO-+Hq+e5FI{@s@mI63kE<1oeNXS8c()f*cT7 z5ZrWBuxy_Iaz4JjS{l#Y0>#`bQ`T&C%X_O*k*`dXjc@@m*yk$)KOWCafrlq5WrX;n zb(p+m9hD*ui&G|>-ZnU6e&1k4{FVXweu_H-XoBd{#nw2_JWfAvwY$(PtK+9LWT#S7 zCr0W{Y2+fjXL?Uyjv_|6t8WF3D1U+YRs9`xM<t4ZYuT4LM|5E3?~VBIbq24@O<G?y zB(6%Gn`F~~%JM&7)y;jN`A${pjYAi<QoBa^%BvcS%8)`!Cj)v4O2s+K?U*hi#>Hjy z&V;J0`>Ue<Us}KqAWEacOzy>C?%}2leBZXqp;C3+x53jWE3lZAB-16S3}R_y*bAz_ z8!{E~zW}ev>vPgH_^R%kcIHGKDJ_zr<NW*ka0D!<X1iYEwhc;1nTDT+IQ{<P@$l27 z{Y(P~po)I^L!xaRI>{CtMqdB?@L!UqxnTeX_a7;QEkH8u+>^f-Gmw**0aRgH&i*6I z_I;oIzh7!$|Bb$@+xfrNz*MrW)<lrK_%$5)#c5zKO;M#^>30x&ScjMffcyGZ4_y%= ztBjCmBV@2+5us^1G^HVUPYwAj0P^lB$h2Ln0l*xkYLh8jDN_N+^;U;yy{%0<i>{9X z)D<rfVl&8idAeI+fNt}!<_{xrumR16-(U9PF^}hVYC(1c{Y3^r%M>HOb~_`bsj<49 z54V%|rMO<!tSxey@qO|>8vb>ypkS<MjZ>0dhLxZdg9qM2%S?gNeA~t{(<is{A4~m- z5L(Y15yl$gH7c`?c$~T2#t$M^7f1%K9_zj^goM^mNa19P&qJts)!MxlU4#g3tVwuz z#<$=L;RtNIl|C6Ezgzu@o(?_HH>d5MU`P$2?IvI}m#%v+O6^+v5|I1ck2xTumcDQx z3*b(sOj5px17#LBO$}1$3Rq~V-q|s>M%)QC%WL2G+p2#nbQu41Ve;KXjW6b2mL3Fm zvk#m-c|Mzs^0gX;8?D(5G;+S3m1msWy};i&7J(AC1Vh{FhO%eQ-#nFZTlJw`eo<<0 zvR<z)r#=C6x+wUjftJBZw61%n<x~W-lGqhf{{#sjaxDvElm-CKCg+fkieL9@Fg2DW zw%b0aOg=ZBumxc+NfW$U$uoE1=TluZ{>cMq1(#B^S{RXB6in?T9rk|>fZGNSZ3C8N zKMBN#x+C@awyNwNEV_DUPJY_5#olo;_~h%e^Tt5~zM~Wxwfs0^2q!|{5U}x0FH#I> z3RXhbmaMxE$6F-Hd>g|AD$5xpU3fnS3S<KP%X%bQs=vz21mm1M{Sv1{z@$8fIT+nx z)&Zt(>@YiIidlU=&pTp%GBf2@*EgG;k2q_ty;J=aUSg54wee)jZ7FU-Y&%qZV8PaA zas0Xq1P*iaERjR=cxqT>!GzZErWQ1c32MFKx2bOj<K@>==+!%SL4DTBjo>7oG={^g zqF~CwFkH(-c%544df-kyy}SD^fw$f(HN<{$>tTqvp+}v*fQ|h~812S}-Do7SdZ&vP zIh*|J)%=zZ$$igw4NK;6owYoP@a;&sc4@MWNT+3|aPxTwzW`ew)nmhcft|JSx}K#f z>{B&MWu!0l1_MF50R```VOv$_i{Jwz&I8dEwD9fFuFj3kh{_@wj=N6FR$e0i#9&yR zM*nZ4s!XUO!4UhYH4FPh!){HUc74|$e%fO`0G#WFiRmd3)V2JZafh(>fr7ojs5(oM zlm$t;G{?jd_F%_G8Te#G#8>q^T#5VJ_F6k+(fwHj^h|Ib18*=;=8e>=a(Y{S$C<}a z)i+%)BP87|loE>_!WARj2pw)am6<5^v5oW%AWNClVC~dMtZu(9{}Hilm|fT#(GCq{ z(wht{{5m)+zMANrdYR%A-41>!=&uS})k8fT9U-u1ta*>LT9w%vZ^2fxs6OvX)>tMp z;I+=V;1pDi8Efi<?;@V=z47_jRK>UWAdQAeVaZ^MjeH;}3?`UvhUzzd@lj-420av% zu2<Dnn}72%8-9T{XMzfuz&g4HY(8OlXTvT6yHC&b-gHN&S(Q5H5poRm2`r0$)g4vg ztvQe};*m9aosBZoiF8u=6+g9#4t04lbZuY|iABdaHns(NGjrUh<U71pq7UpG*v_Ys zGv)oL2D!OQcjqU07k52qRh;3lSo8KKD_WMZmX(P7jqYGKDU~TE1h!e$Vw*(#W;qhb zYqEhn#>wDXHhdqpF>8Uj3k4aZPkansioG~eG+JoteF-AIjGLFC&FDefu}%iPXF_>u z>v&Jo=9wb}BWE1K*Egq-YTIj=9fPhbnsv@_fILFTNvMFVFpZ}xiNWp|-<tJ|$#oSC z)%2_?_cKe@^h#$HHMt^KeelQ#G;?_#HbrBHx(V2@Z(6&IH1se#yy|Z0mfdaqvX!pn zn<Yx-t_^dtrom)squhnppx+-`e<gL5YT13pJQ>u9%-dMQUp5Rp@Qn)cZw1o@Tj%u? z;R7l0tvS%$gb7e7%m}N2SpaqGrk#y=OnVUPFxIfSL-3T6`HB|}qaWn0P?g!C>NVic zW}=mmN+sj0r^vh}tZDt{JsK42AJBqtq?8_un2x&R`IKnq5{tS&qPQrZ5;%)^Yb(jb zD!)1)vL<6IOUAiJt1f@IfU;X7D!6bn(`vyweXh?CLfbkteVC)(m+4pY@cAw{0U*!r z99L)5*Z6?H1s-36PDM;R{~5*uT~m$!#+LVt(YI>T6!-Cn1?3rbTV%i<Hni$XTC=Ra z546|yZ&5uYPidmGw47!_3(yC}VlkSmoJ%Sh_Y*E$;a8(=e<LEoI|t5kyK#BhA>F0J z%s&G+QY4F}e8pEV%2LT1ECj=@?wr?bc~!JDEPmSm{e^q%VyT-8t1#@ui0aPPyB*et z|C6OPQiOcHFL`%MGbeo(JwHX(QZ2R~hw-jGeH~`!wQUyWpzBFKgi;QC({5X4Z8;Lh zA&w&QACyxYVR4;1;PKSo;^o8g@T`k#ZS2Zk1Lh;sk|;QSgfNn1ee3nK(DN48=nJq@ zZ3^7yZnm;pW%C7e1icSg2AXuP3u7+*o^{TvM0jIc!^VETb*ROew;B@iD6!^*4OlAh z?M}vs<N$Bvt$crRWGlRIlBC6G>q^aTLptzemyoR(K)Xzbhh!?616?J%I9Ul3UG26u z1Ha5M6o};IyV9&g^+V5h>aF?b89Hozg|0{7cG4`Swp$plQyKNOeNByP&&uxd-FB;= zIrH<_Yj)4YGh0g2RB7YdX-TuLlZ(y}7dE^#Vu%K(OU)1YJ-m1<q(5VHA{F+@F^3<t z$V{n;C&6~*>wfyM&mt58M@0G;WM!~_VD0L@l;G>Vv0~6QI`5zP6UnmJ{jFZC{N*(0 z`*(%<mBqM@^e6VqV!qvH0V4ia$N>G|(^e?vQ!Oh^Zn}d94?B94bE_kG2RptsYSS5e z?U`cW1!e9;ie;aHFeH02<E+^2Y`&llJcfE9D9nNTC};4kK~=91Ch5z1nN5yOR=ZoL zucX|@Aa6;B#oYk(qlcq8ELl>1sxWHYLb6s03Epb1mpGs+OUcanfIFc<z>WmZ3>m^d z!^s1V5&kaKcY7bnMe~+PBzEU~rrn-*=Eo@0WXxKBlbdx-wL`{dluJy(uGOA8D<}Ic z%y4BfnNz_|v{>!BWuG44g4>}%;h;Nav%>&Gaed8MYQu)3dSQIay7Z1ym`bXyfOZ`S zaiz{x!?W`vV94mXnnm}X5Hp}t9bJCcm_L>Nl`ziEyY)DVB9(XZ67z${<bmQw#Z##d z`9P;LKL;-;c`in1dg8xP+lY!k7v)^oOgw<XsK+;C9Fm{yh_qX<8X{=MYdOeMb%JA< zAMOK%xb?2ARKlG~hga>=op71$Kgs6(N8(%7cuTIYIe5H-EGG&Tcm9!=>WDD#+j%|| z=<fz3m5<_6Jc=dN&_r|qp0;e!#gN`sCT+0ti-2DR&|h7YEoopDlWD=F&7T2ySmH(y zqgdqkcq6BCG-j_k@;)v*<vLxn`g5~%HBY#QmhS@MpwrIcP#RliWm8IUYzF!swQ^$g zu+<Wop7I<iw9P+^(ZJ4xu<lynhA6-sYI&_gLpf(MP5|Vhh^TG9Dg&WVvY-4poC$Dt zmy<0j_48R;mplv*(@Mv?<iXzSIqIA2>D$midMMv`{Oc+x)6e4GjzFz>@sNNO_OK)9 zq5pg<d3x!YIJHB<=&k`GgFPo4m<?Mxkd59+6Ar!Uvvd%*GmG-xxmjrab?uYaW(<nG z@%jnP9jZDiNv10xuF9S^-f@tvZXPHQps^Vwwi1rTWIa709#!G@b_lhKYq2h_qTNnn z;}3a`pTb8W^)+fwaPP3$l*#4Svc0Bt+gz_ryr|p3a53$p{DSvxtUY1%M3SF(*Gag% zHiYThnmeH)exawRl`+g>&N}6=f%{RC3G(2eV|d41yWD=Y>mE5*QsPabYNbicu>OfB zKn`ZCCw-7lE+B<Cc<FhGPaBRwO3z5lkyuDpF8Gq`4(5;c(i41{#eX%e-A{ZCL<`Qu zI6E#1{j7|7lLL~i^KP<QgqVY5M`bkxMx3mhoO-a1^lf`@OG6t*RtlUs*IxM+ELHHE zWRFrmCPG$zW`Q0k51T(Yuwh~~B5$+8=ER<FkQ`+pcx?;*s*Gx~s_*x9++gIi2)Gv0 zRGWo!rTiI1fE|m^2R!j5Tcgmov@LcDJFj4|ppCWQ;rDESFP3>Kv<3uh8qOzk_UpBA zSFpjJr^E+BgWDmvekE+6r$ibf*CiRNy6O(|^dPwc-Cc=TcNHfj&aLkl=&YEdfI*hv zs{WKRs|~T$+^=nFxSnOB%D$x8PyegMr+j>XCab6QEGO6DqRu;~`&BrYBSGljcJM>c z_KOmpwu+Rmq(gzSeh17KwGWj%m1H<hO)gD}n-BTFR^^W#<8&LKLF*ZpbNR^`fm5{T zE1Jbo>qYITEAV`SR`I#oL}AmZ;M2H^cXoG}am&C4ke@+Qoxo%9Q#AP7(QBhnIwK7h zTU%Gs?td>Hc?Vxl{WCqMNwoiAyRF=27RM5UctaNv1<w!4d1{b;!kdQs3X?@E7ruio z&~d|~vS_OCR4`Ry4<?=76)-%v^z<Mo^`(druq*~#!c-oij0M*PgGy4b7^~LZ>BA%5 z0qOw&t@Y~EAv&8L0pwBTS#!~^{CxfikAz*`q3UR_g*UVM%w&01@9~TgD?zODl-xC@ zlz)MnN0~v(dA#R5f>|f4D-cZ7OKR;Oy5cXJTLkZA9bxGoV*fa%vsg6R7QgpQE~be4 zw{g#<8USc%FOBDJl-*=-$F^fFvaQU5_wEXtk+Fkaz_Q9vf8`km>nbj~irBM@VbtKz zrBpY(XO^7S^PQ}sq__9FPPf3^@!sFSVKx_FS-yR0z(|u68#+N>Q8i(nUpMRxGtw7i zM3dLYoT<?Tl5|&Jj36xv*1S8BBKVA<99>F8;p261yR6e3bZXwJ1soTUlliJ8dTTAe zr!)inO|iF=O#|<~n4Y1$!AD~zyli|HsN`&tNFMu5s-rTyxnJU{Afyzu_Brx$H9Fjb zI-Q(DHgEl{-rs#$W{Ot)#JLvMqM$jYxL&lr8H8Rhm<ndAO&BqkZT*FYmnng%jUF!l zI4be082GfCJN(zV_jSDO(9z1v{vJHdDh%!-DXepAj^}~>K0=baE0{O!U#P>MCxruU zoqss9qIrb^ImEhk8**=tPowSeK^L*upXShmed9P)ezf5A>x8yW6Cx(UX-0)+qarJ~ z*1ExODmm=dFiL`0VBUZS0Z>CrL@+CH(9=E9q`TitNU%~z|7&%F9=c2$=m~5XdXeQ^ zQ`J$9z?o5Pn&NLjz8XLscID?@sMZo=8$0Pw`1Z5(cVEXsGw)xl%uT1%&uSO}I$=H; zvq%p(3F(fpGYB_P?q0NMPG)~@B=r_Z|366TWeHQ{5_^tu)X&L<5aUhK`iU#&d@&Nn z^FBl=;sXaViz{mT!&NYls`uNe@JG)gdPnpz4iWNkCuDR7D@fY;-$4xP_(aUJ|G+4A zwP|nuqVOn?<`PEAMy-Y1Jp0o=SaMc`*DCu%E|4$Iy;9GzMiO+*9gnfnG{0x0XCTv- z6kRU@_Qt|J-XupyD-6gT)ynaa6W3YchIgS)j9M;oUgpXA7D4w?B>j@NItnE40ZsbD z01<KTdR>FLBk4O%Z-yR@ddRzUqMrQxVh<bo<E5mCE~0k|XH;6{1t^cwGcmL=ej^z* zi9i|aH^`zCSZ1PQHQAB;hCqy&aV)L8xW?mJEXVjH=PVJn$2ZgNU<UxCIo7nT!8)7M zft?k4Su?WnTt#%ybEh&0V?+UUK}kzsH8^i6>nLjBY<N%CZ86SIR=K?1bt$QAl<`C{ zBQE@CD6Gc`wED(9NrB9$A~dB58YKl~o4rvro>}N$nRUeE@egC4Um9K@=la#_74*XV z-H4+S^dS5Mp{1^O5R>oVzXb{7x*AmLlS$f2cd)3^hsAr?3XoZ;DstznSpW%n9>TgD zi6Tvszik<27*vDy7FSLEI}NwTXF5e(FZY>;-G1ZTp1j(@VvrFmICnMA2}+Q^vC?g^ zmmV$mPjk;#%v(=<P>?}?Asw00-woI$@5AD-z`~egJ?kRe<ZD0@n`7&&WdXq%F3r=m zaG<0SczclJmK!c8OS<CAo$+z314izuT72u8*?K)}yj8T2nxg)GY_*O;`TXzcNln3p z?bm0n7Olvbky3?YxCaHfoa%a<74u-w=O$(*L}dTth3U$49>kkyk%Hmj%K)3wJ6|E! z#W&gHb8`>5gx{#9+7jt@Tzud(LNwE`cQQ_$1%%cY%S@7GW-Rs*lVo(5!mj5eMcBnO zr0eAUf=S+h%PiP;2XD+|I7VLiL0tYR=`1IIwEr#Tvx(QBH#4OP$dJjK{&az`-sac` z7L}zsMqTW*g*ivRMmCpnTEEdfvv5(S3)a7enNPfUP}4REA;by2NEXgk$EA)4R`iHS z@k-SKu!+OyLRDKTufCCDe)qh&)|3i$jxH`NYt@HkV)6Z{(BswkQ<BN3{^D?x@b)cm zn`P5v2uK!IdJ8GN(cCjC!Pt}~v1!B`W=$Asda8uXk>x4RrsTN7k}aC7Uu+(pQN~~W zH`_BdnvG(okO7E7gt{eiLPZ=G8@5tUZiQfT{XCN#KlNxx9IVK_oIDWW-@Sd6d?lq} znfOOr<fiwZ)=4Y;I#H7T(A>Kp0aycI*eO|wnA3>!HGt+)@cBHlrNGsj7WZtq3$wE= zXV;wKAxmpv9fTsLxXnsTZkphh<1i6u$l+8V)tP9za-h|6lw5+d;Jx$ycU^=}SrOVw zxW}^u?tWOYwo7PD!NG^x0KW<av2}RHZRXY707}R6sO?aa`){T{z{a2Wu9JMTy*@w# z;O%c;CpJxo@UwK|YRumFJk^K^t69Gs7J9<D)-Koh{F%rw(r}i5PSkkqidiCmTO+{# z4YqtcPZy6#P7<@7zaTadi_O%)<S7f~uzFs{7E0#mZXPJ<T;0%rzvWxk^kO9y=%URa zX_k}&9g{35+Cy_O;?C5Nd}&p%po{_!F;>H<|Fiki#4faM=4gkoE(8FcRdqU1VO}2g zLjRE{=gm?Q9E~xIbYp^S<xd88kANVLPBv{-*?J#;5XIL1Xq;29#61zmS<%fwk{XY; zS6qlU31sieFY3A&Zi8;JaxyhG@JfVjCdI1j+{wN()4T5V%G61-HK8<7*E6isBID`$ zG-by)h_vWctl0aHRXr^V_TkfPlni`TLnHVQ*y@w-hQ_tC1Z1*1TE3M&$ev!)JzSOh zHAARN*E$dyecUgK4f5XA6khI`mG0{z;S3?mlP5dg+Qr{p0{RhgT<r=dDQ%GlJE>ko z&3%v;1OZx7`pt%?IYmQTrippBZ=q*|A_cTNYj7zs7yilUbkIdixf_u`3N2`5L$d+; zrWy>I?W0<DOXR8urGBbq<L1h;A=yt(cUJvfCT|CZq6p3NHprBA2C*wI*$O8g<3_yd zS9n65OIT|XTW(Lhi}EQ`dff@zMNun1b#)7M)K83r>J=u60jt~~KaZ(i<7NTjFY`4> z+y>ZT>3JS$7G_ir`7m&|U;RWffCXDy3s(dm(<|pOHVe=Qx4t-|zA-XKwzDyQSY(jv zFv>n9b0|F7JX^02fh$bUoiG`kH_k8jEMBr<RNBMHeWxTpahe*{)TmW=rcv5U-7Ky7 zIicK$sdr!70Qj%;wRF6DU`K5w-3cb<o+j5C9RZtyt<dIFFov@Ljkfxwr+0{?-~Ssj zWFSL)<tdhgQ`iZYlhev;*Z=8j$2RzTT+`O{gg<}7CdUYQ}=GXWJ`Sv@C{)}#$h z7px{GKpud9WX0jLU)NuCAaJ^~xveU#qx+nBsr+?v+CFTA+=Y#*07ArpcvA_uSjRBN zQ(sk=1MWi<2-`jZTZsS6D-O_vL5wa@wDaV%lq$>>QT?J@v*QB@={^Sjkg{0}p+aNu z$#?@$M3Bz6s_s7ZyM9S=vU?;nCSzsH-Kgf$?~7A+%t{84uy%T~&`4>~Qhb?(KmN4C zE^oSZsJ*mgQ?EkQ^*(a(RtY+GaK&%yiS3J8NpR3ea2Kxq;a_Bi8*CF0!Sk*6wJq1) z7PsRa`c5`WfU81IpR3*6*g|Y>Y?4XM5&vogbnflalr&0g&gx?PZ-7FDw(!4zsT|Rf z0~^j;>lz{{%DlsIjuDawp<Kk@ix$xO1ScD~K#J&(OxoHT({qQj?uVuVwHzP-uh@;< zfY1Lj2=vd27VUw5byV3yctGnLU*4BcGNov3t+u|zC3yaif|QfDv=h7N!a+6~oh1m~ zA40R6(}3ET>PmifXIt<L)O+l`#>~vjZUy!C!!$HI^QQwjmFu#p7Hx0!_RHdgz-`0< z#z+dOxW{{O^Dv3$r+-`oGaYzZc{H19-3EvS?x8P6Dl4j!f+L~L>pa0f&inMF<h$v> z6mMZ5cG)ZBMJ&Hi1Fgzkf$TgI{QL4x*p+vTSX0)1WR}{V*rdaC15W*Qn&a*(n=x6D z!ar!XpqZZ0(2qJK$j-fgp5}t`3FFzEzc_f^3=+zpf?tuRhV`=ib+;{FG&>un*Heu& z_sYHi9*zpvtsuZ8|NUQx4SxKOfp`0FP6A?-AOCTpkLsPx2+1EdUfHd5`eC8tp1a58 zssk*TjooiQ?lnRVz|Bq?U3sZ44BP$o<A8<>z-f*MC+?1B_uKaa62^eSBmhU$26_we z?0)-xK+D$%fDL#H#0PLs;&;D&KfobiH(<QX&jvztYwdpfet=}{?vy650Y#!SyJb~B z4mbxi`vg2D3XnftS;eZa*Hr2+C!@oRJ+`SeY?Q*fs(!2f3jM#%vsaq^eK@uNXRuAM z?h-o>dY}Zd+N)1;k4yGZA!rLgN-bFxxOxA&h%g5Tak=d`xuHv(oSe%gI~ye^X6QQ6 zwr#2-opNFHTSU>F(py<Uv%-N375$h#-lqxM5&PruO6JuWA9V5xw5k*Z$lArvS|2y( z_25RnIR44sHe>DGIjOVkJZHSv{MV!ybpst?vw;K{Qb+>7k~9=F_ZG#>#!bX2POkRb z`g=s4ycPW$V1x^0{B5g+lqj^SMBTHgM%KX5?`LIp65CW!qEM_)70+L;rL7am=J<^5 zG@t55S9~r8)6Jx#w`b68XX?IbcyhFjZZC|sZLZU$h%S9^t*ArD6n3V=R+0#cThwYD zg~K?Q=9K4i5#vl0(jBd~*b354)xH8KO&eC}4x=p1n5PLhPwWmUj*SvWt>a}XgbAYu zz0{^u`ekEu0bWJJGkDeU4oa;7kzEGvK>4}f{%_Of0l$Oiz18Uyi7<;eZsoMHA$q5( zgxqKd)Cs2+$x0E0E~)4A0<Wmq$TU9RY^!QRUtKNT95;&|Az@eCnwFF9@J(0zP3=;$ zUR`A)xfw^4)#-7~98vM(aY<>4Jkz=oEmHQp9I6b6ErbKJ@|$l|_CZipoPiL}h^OaO z3lKnf#Op3rJ^tGZg(LR{^^4=uc;kp8{(Tj)j+zx*>sYs(T+$Lu!>6p?p~7X1mKwz@ z!gUPxYT-DaSY>n6=v#XLf#xSU-NB`RW_B4Pd3Tf&RD^N;$E6*k06D`*!@A35q1D&u zsra`J!Wi|LL4N<~T3$xoSzK+u{CZ=XY6?pj;DLk-L;iOw^im1`4|(q$)ztcSi@NQK z3Q|P{qz54&O{9s^2{oZZ0FfqLdXb_?M_LHIX&@Bo9YPZoA%r4bx*!4R0unl$74WyW z?)!b`-aEz_<J>dupL?rWYrW-p=bX=co>xVW$GO#MbFejiKV;~DDrUOzP$oRzi!av6 zqqv$JzptH!jIHX5mf-DLC^7=$7yy$xO=<kXoCj1ZspW8fwW@wZF1=21=5*Ikyi6(H zAGq|4!-L6s0zN{B?4S$JM$i5XTl=vz*yamd4rxsiCp?z5du`O7&tdpx;<G{0X&UxU z-I2eyT&r3ju#_IhgSxBZeDSf`e36H}68q`{CTA3p%p;~y_X`Dg1V=K}85Fap6L(no zHu(=&n{N}(?eHaCGdU;kfIhKqj=2vbrp<5zyUP5DREy;9oB1(qp{zaEv=OJxUfq}5 znjOyi-ij<2D0mw+L|SFByf9j87}uV-EDjXwE1K^6l=+x%s|;y<qY+Ep9Xz*-0qE!z z2KLN7VzdGZm!9yV;^%wbv(%}^6g>d0WP-#2wZ(P5k1F<ts0Q2GPI;ec+CB72R}$Ft z-jvA`_)LxuO*ZW`Qi&DjWQd=w+txhLt<0~(a)~M&EbiKR<ABb@l!rC#rB#Qw__c9P z5(imuQ4fUDUfVZEfxN|5Zs05z2WO|(cX0~FNmw6@;%E1trn+^k`5ITQ*Vwm_rh7y6 zj68YEmKG7M5_f$!Ubb|sshcgYF+AH{8<nWST6)*nrVh1W`LYib%6x6jMa?DB_e!`9 z+l26Qg->t%y<2FBE+uGbTaY{)XMM27bJ+9DYiYP*C^Gd6n;=yztgOZW)1|*@f!3XG z#|UT0b^=pyw*FFrk)CtaR{Yr8u@UXZfIjP{S-_QB81v~X3~ssN@wk#!!D=0zORODx zDn@NSaeaMQThIfq3=}`{`*w20*dg@5_Ii6GV-f~zvAtHNii+7o@#W6+aGw6&x6@5C zPaF4t=fb!Y2kaf#IPri01g4+l29w^#(XgBc-Tsm6s%j|sqzVCF+=*@4EsDL+tBvDv z?o+rUV%AAY^iUZB<=2IJ$p&#x^cw948d0)o#gM=ha=c`6e(HS%HtxgOQH7<KQ}1uk zA!;OGs3(5jPYpV8BSAj|bvDy|N<Za0#q9kE|IzT{i_+bZ&eU?BCo_(JuUz>a;QDTq z*Y3y!0fMYu#&FJ-EYBz(JPD)iFSRj=$#j(Urqp(SQvNx|D@WK#UlDn67GD`Ul2vt( z<lWiw-g(ayIw2ni`2R%ttfUoVLUk9=W3@|>TDm=7Qa#|`VtH_B(RM49MktMT-i43U zivCD#;MALVph(%#OLvH<X-qgNL%|&*_7M7Xf4)7KRJ2G|PUA__n~ZyLhdMr6vDgSG zBb(ui)!EWYuwx_JhDi+}^eee;lee&$^oU5!d?=Q8J@NEzt$V!0^^b}O@@AeVg`uwk zR~@GuwmHW-E1!xsIgR}=5x#Dq6+;`cR(I2TV)fqNUmwVd1Z98#12fNTEo;TI7_Phl zMYwW2>tzmW0l8Jco9o#p2lV=CCF3EMa4BKqc(hte(*s!*s>I6jiA8kVRrS$AVWuM` z4I6@n-F!<AEeUqJtPpcL$@8ob+H0@KWlU%|lDy7@elonP>xa69{kYb$S8DuzT4v2( zyi5LC(YxUGhX@6`$*W+fiqLqh#Xh~Td!vV)wIM>96>?{??ml&V!_w)NnFE@#Dr2<M zib&!@M;@Q%%;?4`4{o!_sJ}m@^{GF(86_*h(J;b!xiI$j!kTtTfSem737`WqM)`=j z8Hcfkc%U8Z*s`JnE2IawxqgXgLafg2X3*@}f5nxTLoABK1L_LonNb-m9w@?G&p$oF zk~s?WE8RJpC*AEY19=0?)|la{f+4D|(X9fGr@At<o?(h8lCJr&mji;%92A53wIM2e z8IX(dAVcnym<%3q4pN@9Zynof6M4S33ZfMQ{sw@i-+_t(2yn}$hntA$i1s3R6V#n3 zR04&x292sBorJNKn<0G9$yvKUu1$K&Rm!^*tGIn5&&?U{(SGmF3<c!Kkgt`1Q`cYm z=oQPPyT9M$2)IZYZk^oBY7Fq}munUizR)WJMw}D}k1KAzqCRW*f>*a;_wlq(2dE}x z@S|jNa6FSDrKr6ax35`5<hrBrKXC;C><q-HQ<u2m3*e0Nk{N%tB0kHfE1Zr{Hp&Oe z@z#-`@!*IjwB6wF%}b6z<pDP3VlLlEYdy;snK^fqEKrFEiP4<)-z{0prW;4sl>&FK z^`K!^$!p4#sv(l{M5DTWu_E&EHvkL)U5Vh|qrgUqi{OQhmxx3LR=&Ty)E>cI4#T2D zCcCgaS_d^A`N1K0ms(vJ1>l}Ogo5Kj%o(;g(zc}7XCKUVrj)rPJfdxc<92micc7@B z2_`?AGZ+2?2^mdq0T3!MU%yJFVXK*^Ew88{Y5mLJpn|gPjZ~0hoTU#+rE<wGt}n!H z?!K90CSW(TDAef8jhRv6os7R&HYlL52{`2MCtu-?(c}=6P*BiYSy+zpCe_6Kw2YOB z14Y=*a8XQuxtq&7lDeA;E?ueUd?Yb~UY(TTt4BfRugnxKgg?m5jlSLjq6RLuchsv8 zs}^NV#eicX;$(-`l;ny5GazF(fR`H%;(+d8cSCTRs$<im<_;G^{Srd(zN?Srvd#-* z%%FDLQ9C8=HIGa8`oGb6Z+ft{Df7+pWVfZnMgnJ%eat}o@o`l<+Mg~XYY9|}v8^!V z#9O<3#4SnO+3ja5$}&XG(i?%D+P!OHhD0IA&GdLYX3=N>=agH8?#)k6WH}t8!PllI z+Zf_*)|l+aBo6L;jMT=_`2w9Yx)cw{(d*dS=>fb1fw1yq&{B8@G4yHJYI{W+&N<=T z?U2a-H^9E60OWY?0SFmLPs$(sR6W!<n6W>Q)haRs`|eixa<0#Ib%|wlmo`^~M_5>y zVMi0a*Ztdb5Ud;FJ>zt`gfINC1!WN<#@=}GZ^~2SHNN$IURgc0MMutdX^4ok9{~lp zeOvCP;w=9Lql>dZ0qTB%aw*SpDclfi630KXF(Vt2>2%1ZTY1ZCESAq{nLO9}q9Sl* zog{FzC5Ja~Dc8?Z1HHg%2*Rs-O=i%=wygTJOcNFF1=*as!^ib|iE*qW`6#B=?iL!X zbS-=pLg};{ixhM44c|)?THRsUUh#!8bEYfF$Yxh7Qu45;#Rsim6b?)st9>fC4p+l^ z5;b2xxyc%e-7OO1#@Q##H%3U*Xwg^l@VHLeZa44Lnl2lij!YgTu&3w6i4Gi=-2^+T zAUD-(P4P=ke7o5(xI^6y@3jv!PLWstj(dUJfMY9aX2v`>H+MDcjND9nBJ(rCqC=tL zdB)~njDsT=sC#Pv_~Y-r&G?cQDCTPC?-KhKez$vDHICch_QGIMe5$Bh+gxvUDvm-@ z9@zdw)<ztj|1hpgCcpDPrQawZ->cuL7%%ZZ{zK~S{7&kc{r^GKj30pJeE*y2;r|)z z)}wlB!BChmP?Ra|qM=91@b}=JXMA~6d<8XY^ixbJ_dlIQAn6A|`iIOuGh>_hs>XfW zr##2H4ZJf|ROl<xGa8U{jvCP*@9$qe4^}(=Q?-OVN`>p<4C-yfX*C0i{d%%9)ULfa z7H!mSYI7h2Jnv^A|I_&dty+Zr)!AmM8WNq!v9Zqk%RNhE<G&hAr4fJh_gOxA*z>6x z;9vZ{V*bm&-f(arx4T<p6E{NOj-StZMvgY0@E*q;zpqJj9%adT<l$Ci=kC&Pe1B77 z_^^@P9vKqZwWxi6U)AYl!SO$M1ulfKyrKpf!y|+KdGx}HZ@B?p9`WeWu+S(=`q<NZ z)kn7D6M<oQl-*y>K;8g_VgC^&?DOM5G!ggNt*L!=3u_P9w)3$rRa`Mt$%e?nud9XW z;|pVlL+1>UiU2%=9fFKLn>8H3&BdcXtZg>k<*!-Am3~cIX^YhFY2vd>oNdRFqQ!O0 zi+>hLZ>z!d8#%2>XME|7UiKC+ZVo^n7dTG+ZzbchT*#Wxt~NGoj7Je4BV@XKBUmxW z2ee+)sBD!k!o}WY5JfVJL1%0WdpKL?!OzF7UJP$`!xjt{AuUWqUJ@<~;R?)YwL?m0 zJjU#zmW9l^GH}x(>nV{9SGi`siq9h0(adn37}A%lXH^d&$a1k~6CG=V;r8dM!i5f? z4ex@F8=-~H+?GN7v!(5G6e+=Kk|J-s+z%g=OL#gRTxAQ?ej@gRVtaKedHTlT)Dx(u zAyQCioK@nWB`AfpZDRHk-CP`<q8)-~Ps%H7O59?gGO+WJK__R$91c!>bdBxv({MBq zng2({xqL*D<t8K;%X|s3?Ix$7&LL|Xvn(4toT<&9&@V}`E}Q#sm~gY4S4iplf)LiP zU;q>m?8n-co9d|TEP%sT;a8i5umzK@Bfj5lGd?uHhem5nn+ZaE88*l=Y2nSRMX#^i z+wa3?N*3(nc({DzUFj<Z*Ni?GNG#p;_0e}7H;Kq_t0}p&*{0$xZ?GIUqs(b`0Qc2j zU)h(lynjP13zN=Ygb(WR5w?x%g^HNh#O{_6t`aBnIc)mR5d*Giq-OTa<pwLg-xb)t zNZIiKZgu#^YjS7Av}1je_7I*Z$-M8h{b|Du8<D^K&2Le6E>aB(zJHT=MGk&?ofNxQ z!-*f-%I30SfoNywny<z<u9faqYNJNo%e*Gj7$EB-G}ExIpq`CSF^+@bTHTL<<6qpo zk!GA_eQ-HGX7;|og29i?p_|!_5|oB2?c7kW<*Q&zpeQ_Up<z2Sv&Vdlw72Jg6gQ0t zkU$dB9$hVx*5$As7-yYu=c>-v+ag{Md*TFZyJjfMKS~~v)6`3AgScQ9sX$3DM7DWI zTm5d>BNpDS#8ya%a~VWi%I#dd+;|6j{oxc9Cn@%TUVC*i9yG)((7rR_1xxBW6ZY{( zC0<7;FSB|SEZXQ%W)$qstiBvem+jYri~|k&>e4HpsXDbX7o2p%Wje@LRL=+gW!+$V zQQMb^&X|_syZhpm?L}{i_{}<f0E~&KLYx7YqkU^eKahtIZ_=RvV7kK0Y)##f|NR8I z_5bqz9sKN@XE%3bAfUnr-Iqd1Ytj4JH>L~clksIj<BZma6)X9T1`+P@%Wn_l6aq3N z+D!%vHh9iaYokn+xqJ)tVG`aCsN3tM4jRM{{4~ca;S@MIxhE-}D$AJFySh&oIvll4 zOrL~lqimvP<Y}kkslDSzLgN^gud>Px5P<$^dxItXe5g-68HLXTbOuJ!MW<J*_L7fA z8%aWp!2js1FQGsiTP7Jir<%aa`L#21Up$N87U5~Fx8>>-rayGk+2bObg)D&1KEOq8 zogw6}=3Djd>MvJL!K1_{>J{!k+jlclb#@NZ_S{o*%r@=rnVM-oAG^553=BN2I?6Pb zry0mwr0`FIlAgRbV@4kt+D_n^xFiY7W6Af9-s3S5HN6Dd>Aq(|tGz(cI>+mq0Y+84 zT>0lG6Hm+F*=OGAtG4;I<{*K~MeKF8o34T?rE5MPNG1AytB2LD;rJ#N)d#*%7fG-3 z2*#OJ%b_Se>5kJ3&-r9RVAuYm!S9^?o7!}|t}QmQDr(d{IEeD)&pt1|pW!w6DQJ2{ z$V<1OIM<#&l7$sw)f-P2Uo)?+vHi5k#&@!#^s(yjUXA8}mapzWrH&v#YkxYaQ0Cpd zxbaMd(kY+NVpQ|$xQ~}wB?x-)?}K#W5zwMH>#(Qvkimzk>uw_>`%7Wq&W@FMxs@8- z!rd9C9xBoIAJebxmqmMsO+k>0!qD+JLN<NW_TV|Z+$DScLSblUK-sua6yb6e)`fHP z96GRO*2twH?sCsfYHGuf$A-89Qox4K(~3?bMK6T2;|p)tcN+P?ee~&#ykgpoYA0^S zlXiI0Oat3K(YrzU;6QC_uZA_Ws%vI@a{;&WIe(U}v3yb2l3<J_HS1bk{wi1p&h_<x z5&T;seti<)w)^LkjC>C>4BDT>RD12D&z#ktizMl3*r;6_toqq8;$X00P&!pIp!5O- z&yWNR+fw&y-Lq3J+2sLuE?Lt@9Yw~2!o6x?Uz4x4oE8S*z8CHs@)=IVF4E8VE&6^n zuUURUvybxx*a+}4-Ls}0Q#?2q%mEN;J5(pyF^lm|r?CM-X0xZ<urzjkvwhyjakdQ% zop!8R<Xzb6S~u_@*tq-ZB{A$4j=qf{ESL!S=u(f?J|qO?!B9s#p^cIiV*EGMARgcw zzr%K!S3t30vfJ?~{)!8NeE&C~(Vjo-rg!?4Qoq*!`?xT$w*4n}{VqrL_q7Lt%KoQ+ zl&s+Izb5ye9(H2?FaPhS`ky_D0I0^39VIk=AuQsr92_q0lelZlrq1pXhIW6>-H+ja z=IN>0wP?EY^HsKJ{pxbc*H`TA3id77Gyw&Q6zWQ-)HOlgud=Q-^7$o~{m=W|;dRuv zrBz~*qrUdU?k)`{)7h&pPmq{UlD%&YHCvX{i3^X0+`bYox4+l5+hASrwnD4mtsW~C zAD6d8*ShcPw^{|y#s*YZc6-PJP&rrC{XyMw!N)I1M$ZUw^#@VPgeNdbhuoJuE>e5` z<2<yKS^5pg>LVp1<mc7nDLUaV7mT1|yeI=@&N>f8MUoxQ#w{^P<l=cKDD*n7Ofb2( z|F4YV<W-cZT(BgxFPK9T`JMR}c03<R#wsdF8H$osx{8u!U_9>4^uXO8G;|fEMk)9> zl#F%f?CzWTy{+pU<3dJR%RXY+p3@xxGc`xc<U|$IA5VL^|M>t{5Wr{k;mgDRu_EQl z+2ikeYRxE(jUfBa=L&rxU3&eLCH_5GMPF<61;L)j6UW^GKD_+>eI~#(sPaDfCV$`( z@#co5?}hP*3o)iMl`6XtnU(R`xav~bki0`TTb@`4D~tnG&~(zq)3=osd{EVO(|YG2 zw~+F-i!KwPO1S~`SIiF@+P3PNu9*h+RQM)xeR2KNa6Dd)GQW?a{XIz}!(Hw;sj-%6 zPW=_tQK2W=R}{AWQAjnW@#4OVTw+Z@17H_b6@+DS{?lfEP?@6Xj6dJdkjXNn8>Y#^ z-!Jfz1h^P4kisFPrOw6nT^gIwSz1(i0T;p#-+?{BF#sZg5suGB`Jg{OHv9_I`T5l6 zQ*EM~q-jEwCGhx9p$cnHG{ccfI=3(L?%F8_ou<fAbg6ae^#@ViFxyyE;M)v;PAL;4 z5WrgMxm5Zv5QK&e+D<e?ul1!4qJ`Q{`mrC)Qq+~-S5?CeT2%EZBt^XiK5dXeN$f5q zU9vg08n~tk+W<aQP>NDJ$C_F?IjI2i`HI<pKDBUw^9QL8DC#Hu_&VHV1}lCVSw7T@ z7nI(9ts-uia^CsXUlpBY>{umsO1|}+=&Y~~n1NpYfH&fm`iNHPRFrd#e%a{&PzgUw z8_GmM;zILShR=b(mn-^4lvmLz7Z#~m@%FG8ZQ0CaeNYIonRrkoP{0+#5mVry%wdo> zfb~%-8!R(>EvGEhk`y^+cKzs+pt66=S`K6A6<KF(1Ccup%e}E254r_eR<=ILSOS_H z$;KIP>%ADiwrO{Ewx<pTqi&MO!ZdL{H^~s2)k|;4;{*Bf0w9k?cB8#2r03phuBX;( ziYz|(=sS`m7fmS!V{};>BX4vxm`V+Y-8Vr{YTSebQXY`uL-iyCJCJR%bHN7j*4k4& zCBBJDiE3P&;|hTgELk%Gld2avOln0pV;fsZzcIQX-m|uLlOy3x-0Y%LS(+KlP?yPR z5HM?g>c<R69#Jzg<3F}t;C0k@Zp=-UC<K`JJ?3zvDUAUe$l+}0;LG<TFG8=Jnx9cd z$XUna%JK;mpQKQ&dc>wv@;<RC2!z$5!#W1gof@-B4b6{Z&oYDL+HAiA268sKr$2#q zah&S&mLw%VTl<F__{`dhP)Eo5VIdOWHiRYri%@3}o`K)|wZYqL6~vj#uCGjrW|8q@ z9acx<9(@0g{VsJG>b&&*i^YWX8IB0&zd{S&l)S&nd7|W#yaIew)p-ehutK6Q;P&JZ zW;qF?HJqZwIM16+h5IUneEkA%FcxOXkTZ8N%xt)wiNoQHSfDtmYVqT(xD^uU-lV)= zVj(1H(e@GrDq)vCZ~ZK%>vs(`TZzH^S+1d{otPtD{7(L1Fk)<F)MGYP5=tpZP7GIT zS5e;`&vEEwosbz+W5vwzoocDA{akuBQRuI*IRYo`ttV-p-(6yoFnBxiGhAheuNHI_ zcIm$K1^!|$`1QDX>e~$ue^ivO7spAs#gB=7q(JGsfjtVIN;XO$L!&YB9r{H^4}`le z*B?_}X_7zomRA4>lX8ny|2fLK)%gKThdKOQ9JV^B3KHa9Wsa%zEHzBBn$5iAx=eam z?`>%2gL9{5E87H&@{l*EP#^WJOd-a(Vw!givU1F72fLEw)JP(Y?Lww%dCnY%=12Za zzsJ$|E;5;TdgkNDDQO!xP3NM^Oi{k@D^4#OCB^S5Kq{XVt!1A+ZGI`%tQ2L1QGzF? zbX_KaPFdaO4>f%#6}jVErlFF`9V-Xt4NYvh)gtW>@F3!0WC)6&kikB-%6NQEyi)sP zWv<bo{0rWcefoY)h;itQHexwRQDTOUR7Uag<@~>TTekIliQ{>lf|YwvsrqVs+}p<- zAZsQ6>#L_c;c>Su9Z!<*M>26Fz;E9eu4VPXV?K)BKzn^+vCpG23T8T$TKdp-{lDB; z5m-deW0{WZN0PZV!r580YF+#bLm7kuy`UDW%*k@Sb7hxPdkCMjET0mt{+HuLJa_IC zDEAy6O?(2tp1Od`Tn+UO3iHS>meunD^ZV%;CRkbwdSFi9@CrtqO6=?DD#NVm-Nsyn zz~I+8Lo;7bMNvh4nfw^%mW0NX>s<V~PLi#NZ8NW#9;fyVMm2ZI8_0wxarNQ25Fusp z3S$@Soe+I?jZ;094Sk*}kG-w|p)6^DCpJ-iX%*UM(hJGU?7pCU9(uIBn1S>CpYy+= z$>+&}U9Iyqa!Q2hZMuf<vrL!YAL~JOR)5S0>fntx?$=~}&H5uYMv~##q>kamJLT}- zPaFouHs!!$)bKp{`tJ|^UkyCm!h%3X2<01xYSTYfa(2XPwx(!KWxWA~mJ&DYuWvu` zo>>~pUBuXi3_5_1=N+D^8OW5nY|zLvNZ1n<CiIG)%x16>*I3n!ewiLiH&LtJz<+Qh zabMdF(t-13p)su1e2?V84!iiWWOLfJAG`sz>Hiy9d5}QUcDEU@6(1Toy&LP4UE8-& z?K~K%nZqBhmZMw3mPr(QDQ^a>M||W=aZ81}4J@LShlTKwEt<kzJH+iB{+jB|yB?iR zhcxKb!A5p(9^WPx1{tW(+kfM)H42oNWAe|r6J~gtY0-y~6R&$1Aro!-8T|@FVTZCT ztVA$(FYMnR&%@Z3rF{_4dT@A)^CbQH;2y&S8x7&m2UT0tuvCQ|mfRFDLT1%BGG`x7 zUKuJUL?R4cE*-k{2&^a$2(bDBf7k0%T9CnrY+{Sj0_E;u*1<eUPxZc$M|OYzPg)Oq z2S<-w<93j6L6&HJUyW^1JjURF)R)WKy#7G`de~1BBSccVugcDqdm|gq9BsSOTiMDC z+*%`y4sg?sOQkb6>K4~73Ld^}v{23)D6_|bI1a7W95~B&QWg^&Yj5VcRVst|&5U4_ zc<z5;%vv#jkWrM$IUl*g0^B%jzm&v&3S4xLwx)QIgzvC{2fK*kX<c4Qzbd>X?6D-; z>8w?J>zo9$_kvygnt~A`Xn7Z9qnCXy>M(y%UWsOuy!i&oOJVGQhN<W<5qTK9;l53B z*eR4gDv1mmk>DKk*=JuHCS8fzmN7zb5Pk|u9Fmqk>!gv1#PQ*uRpCm+8#zn&yYP&= ztFu}M4}qGRJ~IjJf~s{={1-o-HVP{Sao*mv!88fw`-A=<tJ*8Wz2VxsJ&BzaN};H_ zf1~R7AhPC*H@FYPM!tS`lQ*fqqJQvy1V5;KC^;_rI_(g(?j<U{y^#({w7@_en<%XO zFF@@!&oE;AK13HYhThyW(Os~kLS!|plcrM%?+JT!G|+KN*BFe8<`A0sYMaB=1AvJo zJtXn4kM<t%2Q7P>$NDBx%6R;H_1ImLqVxqtb5VHhIU?x_zcfj<JzB`^>Y_)T2CGkO z);jKFcP;@VbO&sw1m1@)GlpJ}J9v;p@1XiEsdI?E)49y6cRNl2imU=wvwbncFfOtv zddhp<Y<{`L>8;#2{7KsJRSQo!fkTMfe#`?MNZ*jOot?EItrk3W`P%!y>&BA67K~VG z<Xpo^#BaMUL~m22Z&a{h!O{w;D*f6kQAuXLOf;Lodb-A)<#-9|^HwVAHCc0&!Q6Xl zfQGc`06Uf#q#H-|KpA&m(P@nB51T&YK8lSes;B|%vBp=t2kcLwkMGtV7D(pv{q>@e z6=En!sTttQ*h08>s$ro-=0L|)EFtCo(ptm%Y{T-0o`S*n=?ZW<bmUNYX!XPNHI5Ge z^8(0-<85G>-dGHBRlA2!oMh{PF@Iz0lMnNzIC@?tK(7o8C6Oy!TP8KGTW)B3JWbuV zRQI;)6f%Z2;(ZCA?TgU%M+A{NdC`avp4Y_-qG1PLPV)>&QCg2u9qya)93+oQQCcWb zPUx^VnV`r}Y8r*a#Zv`v5Ca}o3N~!@@#&L3@t{^iwZ9h$F{tuRzxx@i%!xB?Gu=;k z`+knEz&Ww6!l;T}4U>Fy-n8?vDKz!z@>QV>hxc%pFSlJd>(-NMOfv*(;w`KJIIUeV zTqP-QV`5d%>Nd>VN`|&R<kKx)dgXmId(Wd^kg?X*`GYWmpN7K^AwWP@n23{zRhFoe znxV-}+NN0>E|rL{kQs2ENL*)_9-i!K4KOo`+TQe5FsJc;=xTrXs<o*LYdzsG6FWiH z>`w!1!FE^WZ$%Y1HblI%T=Ren)b`>{4@eJ{xEBv;7^NshZw@;p_l;&(I_%MvqNbdB z27lJ3J@_Wd_I2x&FkvfxTGSU^xnJZrE4*9do1L{QC0zM6Y|VdIPPM(xAY!Q-{NzA@ z_8l;MeXohfMIf{Ew(+;e!hPOK4W%0gAHAg>p9~~V6n=(i_s(c(=*>pUUNq0M6k~)` z^>uI}{D|1Vx$2{dLx@`?uCqh4blsmnB+1P<T1;;Y#9rI~%_=E^AYN+ROfPJyiZT$@ zw#Z7>s_YgmiUkT2Bunz2gp8=`ouxswM_*>ocX>Kk@z=8?FIr#@D`87Ge1~I41Gq$1 z_Xm-23LWA2U?L}8qeSUwHf-G$uAk*+^D3U-#1E%Q#0@Tz$qX)fRAB@5RW|h+dAvvL zV=B}~*Rl4&YpJ@vw`s(`A#<#Dq=f6+`>kg3jG{g*iJb0<TzEI-R9ZVtVlG}91hS$f zee0s=Olxl6%Qfctk?x6?!d=_F4<7|qzyq6Sy2|z#4s>>|9Ha@__F81x<I)vtE*LB_ zNx#W?NCk)oW8cYS&VjCozpisSj7oTJoS1K@&-9IYIa-l0rZ9*uDU~-b90TE($?zzj zaU#%ep!?br0i)ggp*2@*f3BwhZmxvj&@7k=hj1B;D576K%@wF#OKl1OHE0P4LDDem zn4hwVuYL&((l-HE;c*#iSLykrDP4Zzg#;q&j8VDXr!N(chb-{JlM=|R#HOwc(CsAR z&Jg00b~p!O_v~sDFOo=bw~<eI{>C=4{qn`@g*Opv?*W=UL&CI1h5D|=P0_d4E8ypV zA?F-QgO}6=ff)L7Tf)$ov4(=n&TWB1fKHI5vQU{Q7cOAn?4qi5&j6xz6T$6f9rv1y z)m3)>HpKMtn`Oy-dA3eNHW&7uioy`Z-ca3;<t{%A-GY@KrxOE+Z<9t$jjdm9RJ2Hc zKCL{f(b=>>%nBo?Po(3<M?u1l3BX}8BGTOju)>1%2$#q6c^T7w^d_b+R(wKHOa{bw z)(4C@GbWFlF5%whTpQ)<@7EF1?>;k&(x@O3M;1T7qqf(vs!&t7z?2`hab~@;4eLzv zy~8Oq)3ld1Bzx{|o=Gnk?WT^wCu$mH96Po;R4Syf&`w$rSvU-%6?&HE3|v6nxMZW) z#7qSn90#v*4zi99f$;o&_th5Sf~EHu+hVnJ-{=o(+=a+3V&Jvp@e%tt)6nIt#nkC9 zya%>D;HQ3iC^)Po<8`sd-SW-WiWduxxn>1odf(IHUEniX+%btHLJ-C5<;r$J*~>?t zEp!!F;!Jd?e4X7QX~IE>jpq-=kiuGe&mTOQtMP}h>8}j9;qsRq>XcN?fRNSjCJ=-P z;|`+8G$m1Uz8u2&=+29fY<w_PK9ZrD{-*RtJ+qB(7#Znk+S3h_&Q?x{EzuhV17tCZ zrcFDt!gI+V{m<c&m-L%3R<rIW1Aw(QFU*0zD0()Z*H8&Z(aVR{sPuXyku|g~Pb-uK zbP#Y}p)m@6ywn@+*h9mV3YWn3dh1n_HCx4gGYYDV?KOkzX3$ORFt%0GTBE_rPmhG4 zcO8B}V3ZF6x%q5d87f(gTzojbp~Ld_%E1fx=$1t(>dqt2-)3|$BEp+cuN5^VPXkOS zx!b+R0LA6*w;hn0DS1!Ss}33^q)QA$#z1-T$OP`3i_`;Hg~P9Gr^Fo{4}owIOjX@J z=E~OXXtE_qB*Wfdf%~6F^tpP?sTC9o?4_1G-2JFBG_`V;RGh2uB+#D1ydysRnpq<l zVNR!{rv9C)_aZb)cr5BD=scw$qUT|v9Ei*V4sad@#!zmzD3sYn;()W?EIAvUUfpy3 zW~PaL2<1H*0>3}#!kE^kR_FRl=fuK%#KVq`p450&?#qh(buT}WDTtDCN+;Ih?C7R0 zKs__<43k_oI(RgK*COa8WQ&Z{JftW$ukjtNh0**!)JZ(2bT|Gq$IwYi1F0#}b9z>p z52~y_pURV1w2mcb3jR@bU7;VWPw!+fJ&4;aKNnZk+>cS>;EK&|%fe9#`l`OX&L8>u z#m}HxR!HU2tz-T<D)Q$e_@%qiE%I1u;>aHccu?q3DtNerE2Yd|*Jd^)Gyb%bpq+kg zfw}n|t?vF07LFm~Y&K61&#x}NPmFtwB_B@0ET0B&39(3rEd2E~%=Cq!TAl9gY?b&n z=0ZWf^=s1!pymB1H}(=h^IvYBA6CC|EW^Gl_(PmDYLG$}3$pz6m(&QZSD6Ny<{-G& zThXtGC&*d~kJ(1@^l*SjZky^E11Crc_ga;05dyPc;8;3B|1z^ovr>#-@uGQOuy{x_ zQ0m3fo0c2HX5o{%RO*BWM53sa^be=6#D)_b4X8H59j5Lq&<n6Z;Dw1#nG0uhxz3n{ zho~|8JW8ZgDnPJVbeq%5!0yxldpFOe&e5PCqu)D`{lr=T2&MnCU8^@|W9gSfWsDI} zAK6fG^j7y{6ih!^(O8wD-g_x$c8IYZ9f*dh-ILQ=lwdX>+;uKriN1WfvxMot9RAA$ zDN!Zs7-yGF>zJjQORxvQOn`_{eu1^LS^RE|FUBbxW+<Y_My<m4B8>iy55zKdQ7rnB zn8@`wz;)Cc^UYm}JFbS4(5i6g&OF?#m8%bBQ)d%hPiCQDFyg$NI(|Zi|HVswRX6m4 zY<vE*cR$}c3&FL7495q!MRY9lK?uK4DXj;O?GKL`_?O|V_j9n)QeEyE{lqOPO0W+x zxG#EZvQSv?#E1;~^uY87Kca2Db2n~oK00heGv6?4vax7<yWPPR)Aq9S#V^|YuQdjI zq`un-`a{&~C>Hg(A2Jd`p~HsUaSj1!*yaoGmTWM{=2+U6lKfqX<e6s}{$TZ5e}0Av zd(U^!C>?;cN4sP#;!o-gNt^qMdWxWI&x_}tc(?c=;ujIG1Ge!$Lb+TpIUoui{lGNc zf6LH!Q*rS;Br?!GdC<Rj*Z-}y|2y~o{jvYwPe*tFSqMIt&2Pf7J`q004B=ft@b7~> z@kpY4#mBbv)$pCWcR*N;9pRn-Hf!N}5(yW6c#)~F))2yWgu{=z`9BZ7_4{<VDF%XO zPVTeN3K=H~7?!N8-*^%~pX+&jB4F=@ou!^Gu#Oj6G^kYKEz!8l!hMYR3vvl&7b;f1 z5;awI7XEmf*tmrK1e4b-{ONwVtgwdtS0B$Uw(wU2xT4+rb*qnIuEz38Im7C_)i8*J zo+s{PSwT#usa)i~d|rO>3Q7K3t!E;QKf3_PGh1#_%m{JIK=S0q#4r*}8eD)Zh+nB} zjj5gPu9Zw!O*9G(SrQub8R()DGRA1ohX9q|E{bC@xx4p#P=;+5s;W09{Lam^`o#ui z;(SI6(2!If)q!*O&A}tj#0uVCE!znhRJ2N5QZEVtt5WB#hkZPv5AXjRkA*-GE1wgA zC2=>9f@_PItFaLbpOy6aZ;`in$WM8x#3b`^Ez1S1$QBXwn^K)m9pks@LP&N8(P%4- zpmHQt1AM^-xkgJ&^?ZH6^2WP>D6HdmMLX7NhpQk8#?eTIr$%0l+_np|@=epiu(8an z-mq)c+=Fo8F2VX`4j0)<u|!L{{70|7eBU`4tapYr1%hm?`(3pa)R}IE<$dG51lIGs zZuZbP#O9vG1ieNuYB?Fo4CZJuv<h}yO1<txFIG{YDbmjSJuXIh16H4_Yg^J4D+M#W zXTYWcjt2h~G{Ci6QsCI*t7JlWDA@8i!sgzjuNe1Wij&^bW=H@olNWUAXbZWM{hoHK zb&*1vm3rESywb03u@nC4YH*!1%yecr9JbsL<qMUtk6V!Rc<!WcHVmYc<~q%l^5U2{ zB)+p;9ymj2V<sr;YcHjg7o6d;s=v*K{TRDMu*Css9@Ei95dfR(KU5^D{0($*dYg#{ zE}N}4FHQG9lA>$`k{v<}>sZthey+jEl8mu!tpX-)f>81pdgk>~5*atoM62x}UpQ37 zA0osBTuGMNr%8n^SI*@K)pgBU=k6={js%xU`9D7jLy}0cf0Bz;cEPaQF1D83#mSAM zJTa-Z4Ph;el1N2Sh}me}4)T$#(NFFiSMDTznw0&5N5fhw@qXn7mX<({saRgC&Sb(l zVFR|{(T&NiwY!~j$?b(W_F@E|1do0&d3+Y$>IS)ip6=ASIE9C(SU;-s`S+%lJBfHb z4<YOJJ!a;;x3+pIXPHAxnAtK>eqF}op=HI*U8Jb&-y$rt6a}?w2t~D``O<Dy1e2sI zBF<0WWIwaYGMsVFCCuIk?B5viJG)tS?kY;-CPFbQAf#3%>@JcFE$7Nz-X%DOv6|Pj zTz7GaODAhiixh1?YN~Sj5B1$mF$gp^0JJJH>H<E0u;3z$n_i!$%tZ*!zHgH9WsjzX z?tr9!HST&M?4Dv;56yDXru;}HAIE0{VYB%w981kMn`d@ahJF+u`uUvCYL<QKrm8R` zNy$3S6^rQ)@2yWbtSlpCkI%8Sk1yPEsiCf_6?1YsM^#*4APPYrVRbjfy*8H+w<_G( zvHD>#?Gs-wLSH%Ww)caRmJ##AbK+}#msYCjcXU+pbl992auKPno3<g#d87ApV&v50 zc!SBBQy8?!(E1V1tZ}i|QE>GU;qLrK-w$3Q3y6X+rLdei*qFKabgOpo<BIosw=Y{7 z9^Y|7%z1cRfOa<S1dndFays7s${UKxNk#*>b7kNPbn)HvWI<tLT9sey+Nr^pJoGI` z_+HZwKm!>9DTGS43pY?t2FJT;*7|>9%+H1gOvVr%SMK`N?;q}uH!Wo&3uD=8(U7PJ z+d0f#r?QzP%OT^oS{1DanWwIDk|k7+imL=sozLXL(YH!mrOdR++t^ay^`2C#gQoR> zrBfc=0(NwZf<iAi$u8G;;%-YRKvFZ8#@k&p+iI17z!^$D2!1pALd7Z=<x&SV)*Gf& z0>`#374%Tu;SLur1mM-ay`Jc{-i-hfXo|@a_r%==YWO@{(URkcD*X5}2<8QWI$w{3 zg#Fmzr91Kc0rQWOb@-k+S>5`~kMkF;j8jv}i(o-OqU`e>+cmCSuWzrMUGC!MOLYOv zrZmqNZh~<2hDjm)5{dN9q$1_o_vlJxH0%y@1t<H5#Z#LJ;5nW3E7x_#M<kgG2~s6` zLArcqR<Qyej-;Gq?&Wt~vONi@zWTj(we~)5Bq^;$_e^@e4{%Uyl!w@L_wD$9=i|KR ze@!wN1-H_<eJ11t`#oviLN`Sm;WkI29?Q3j{oBs(Qnz%PVlJGfGrzI4K4KnMFd&E) zYhilw$m4MPaXP~?{)l40{)}aKDavPDWZ9a22e|!@)hw1gqqWXLknLBdd1v{xWGcy; zuh`v=bl2B(wo&hG{{mv~KisFO>}YnkSd2k#I2aYHIx#+bFvcK|778@hze-u`ZhGac zn2L=+flXGvxXHw%Jj3~fM@^P*rY1I5`s5!bnM___dG8N0mtfm0s6zDayo_+RlMa4N zh*^G{KNa<nKL8Z*qB^DTVPdaK{6N+zip@$^oH%`?F2Mv7CSoK%bsB7JcrLJ_gLd#p z-+K^D{{BY*Xbim8HkHdqC=|taiZ(KtWQ(&Fl@r{v=R`RwLM-7M6U#BN$^!zkH?-SQ zEKTs7GbKe>Z_*BhR8kqJ#sk1KF;T#P0)Yi#YC6o|Q=Vd1fm|LLO=PXrEDQH@i|aZ* zqig27fh&@YAL{EC#z}^?6e9&5246Tc(@NbN+HB<=<+(bJAxrmc6l|^cg(o~>ltTW+ zc_N{-ToQ7zpWv=HsI$Opt3JOb*5v0qku6R=uy?kXoOQ%?nps-Ga_KRS9z|3>T+#~% z)-j3qt?%)E=86qjD*ezjZ{FpRnP*#HwNUwW!|lSh$kWQixFaYTMGI`-MhfRQyn}7m zQ9lK+>zm^ooBPgHDSNNwJh@$QSOZn8x7#>-myqyZ@{t1K&mu?5+=Eh9%F^6?TGSo8 zfIm(aCwPq?vL|}ZGMBEkddxw4e>$hfS9;f?@uzkjfM9TmsOLnVhqk-llz|x<FjI_y z`6La+?$`Ke@!fMEon9(#*_FRUu+!6Yuhrlyz0$s9EBNh4B>qiHeM05<;K`4#w0RBQ z)~i;W1-X%aPlHzfcxZ%l!(3T-+fVad{hR{BBEZt9DL;{Yl1`*0o30MH3@xP7p(YC* zYH8!Af7L;6Ga=rfh`E(vq8{=}eYe!p1BiBuB%-EHnA~+b`wuA@09_g1s|x_l+$6bL zN?hRY&I5|?Sg}87Y-F}I_0St#J~SDuZkxx3ON|_aRMm{JbWONqi#dH3SB?>L%3f%A z+0~l*&6gY8u&qWZ6F~IUgh>aZ%In3(oSmjE87I>V3k+{p2|;jkcDqG8qG+>Z`q5e) zt@3*`9}AlLNQlk=JL{ytw#QD4VpluAzkBqFB@tF5r$W&2t?(@<)728wVo`sqr_O_^ zO&qw;3~OlY&6m>N)#BjbLY!Id?%MFobMdr#R_i>sv1k{MK{s2a?$NXrJp8%;M#<Av z@#S+~=#<L0m!$b-?A+rE1L9@u3JQ-eQF2Oid_I+J4_nAia|bUkW?WZT{Pf&}QleN% zyog95_kHo0p~A};9OtI%wiIP=c%t4xrAlwoY!U^$V&UO_|NY^C+jIa+Otp){&|&u( z?n;-uFM1x;v>3+ZQSKR8?jnMFBG59F@5H3jMrI0!E);cAdE2o`A?Yo>JTew-tlSEo zWoSsGr4(HlFdtM1+P}oJP%T;z`91*j&;+&h>AeHtrFhnnN%___V6A>2M*)j4dvx1I zecnU_xIdZJqt~CQ;oV1M!wTnG-B@hAUH95L)+oA2{O7AW#~+!N;fRzt6zH}Saep4O z07oWyEc&O@Pp2T3uP5tW{<^n4xE=TpSJk7bXi)|sIM76Sn1=ww;H+3Q!PzsZqG!6X z_@*d;;++6V-rDetI#HAY;6?)|Rd!Fh9w`Asx*Kj2_;Z^SEiyDZlkLtnFlgU1FxTp1 zKijDKqe8y5^CC3gb~CQ#-HP+KjZz*YbXSYV;)AgFhl@~%m45&I+htXa0IXSG%6M&( z2^T5Vnz{eTcDEYa%;#oS#{TO3{B7`fW%qS=1D=)&yH$#3nWg1lhUMN~q)%WbsjOf> ziy);#eR-&iLPzVnmE{}45ce!nzAfrnu&PI0m4KOjx~mWfa<CjK*PwSHNVR#@Gb)g6 z-n%ym92LR`j#VPO>mKgbNnejTbbbX+HoI$*$aR>gsB*9)fyx7DCOREkw&NOEx7}OR zDvq~@RMAB^uRN1ot{EI$%Ur1wsNZ=dwl-)KEqXXIf#a{R?fE7q3#E*G^II0_nW67z zf2JBFk*V2fx&|W(tl#RtT9yQ(!%DBR#+SGdq2(h}fch@8S%skHABXMrnwa!^dw$+3 zYW*@K5iitLo3+`$?cIgzt8HM4v=L|6x(5hdwM3x{VBD=$PXa+&*5Poy4QZv3;hUcZ zi2M0@G?4DDHNF6CPXPU8lIY$dUBe}=+=cVDy3g+PJ!@h5QzPk>C!kQ2*Kta(Rash! zQpU|fQ*GehnqI~wXIvc6E6h~xX9NfF{YK9NQZJrI+T%xhCjO<}96=*eP}wMXueVPW z-;ll>7c<|G7B=SSIH>M8k-CXpS0)H_dO_T>SJLt<(Of#4S>>skU2_Z3%bOEOi$1UH zLQz^V@n32kVBV_<u{+MvKe%@M9A1N`+Y7Xoj#;%|*owH)Zkw$1Z2HQ4Qh5e3w45V! zE@%|A(=Md8Xdmoc^)Qd8L!^v>yTtAer3LxeylvMVL|&5$0JebozkPlCDxU*Bsb+ZU zX|?rXNv30&XT=M2^Qk!_<!u8?0NWty{l7hiW6Bh$?@hDpMV5-*`76pEGo8<-XTc4- z9HA&ju73#*waIMK!Zmhp0aysJ6i&a%jGpyM?u%26D;iA}0Rf+ToC5pZmFNc8+2VIQ zamhR#(Ye0+RQ%&1g+*h#n|!nAF~_yX?|xFsK!vIQ<$E0KpaA@dGGkx=|6r4p<i?<v zu?n!#`jLiX{rx`p5BrB*KN;&WtB>~s9Fi$-|6%s<vr~?ayL^el6|G|T?Ifd>JiKx> z7?jRl1#8Y9yw%!`Q+2CHDuH4#mudn$8tT1N#dXu+k#&Gi(h+TNmn#?XiGKI^y7+5+ zfad=X_xo@awO8y=a&!JZo6(S`?^MH^YJy5Qk*TZNTE|A{z^6*=goiYE`jeAb?Xs%5 z!TrsAcCrCBmU9}Bd6t+i`CdXr=^Jd4Bu+6HHuR)p!eDiQK)KD=N`{}JPZaftu$e2j z=d|Tfji&+=j=wsJ|Bp8i0@5yjg-VfvRz@W#!TmCPg;P=RGW%?+SgL@S%)JLQcbIt? zA(+`&O&}|Eov75r{F1w_o&58M{*`tD*~J3mnF(Q|=8iq<=BBp_Fn^uQfex#y8MDyR z{a4uwC4O>oZGn}hVTsO+q1lRMK%TY?WvJqrHZvUPw6XTxRL}rp*YemRvk)a+V4vhs z(Wlef((l~W&WB6ca;)9IMGPn>n9uz#=@FA8BG<YNT;|?=tWniIvai9dbE88jLeXBn z82@jWat-Bp2mUyP509jx>dK{ogw@&{OwFNn*}R?TR&1J{TYKVC=KQe`SHU^fQ<<xA zkqy}z=tPkIi!rnpt-F1o5@H1H3Uh%-p_kw1%jy+=p+MV6<>e=keI}QwQcL7j$O4i? zK|af|{H0EoC6w(>0bC-|9`1=q9<Jy%p-%bu<w~xJ`ncnS1IZsOh?wPa>&8FzL)s8+ zfb;Gdl37$L2)|r3tfpQQvq$suoQPSrB`=hPVpdbZK(PvbqnM#Ak?i9bA2V9gAM{t( zdik}Gs<u#CEn-FoAUM^5W+gMcE(PTt0|fvn*BFUA|74F50>9qIhArQ)SRAQ*!C$&F z37B9n*Ul-nlCh2#3%JmE5?V(u^rD9?ZBSB_6+ATVN&QD-eP`_t_HqNDe%5j=_je6B z<sCACq!hk+!_IQZkd+m4BmccF%;VO^$-@d#J+z%n?p)T}N9M5thUE-uO3$wf+^H+1 z(8qV*VT62M_kN*LhnCIC*+{-?0*Gu5o6%-nCLU$poVnJ|a`S4zzQKqrnUJYOBjEMi z>GD_AA+BF``}{$;%x+8kkwEnB{2%_~-_thu{s(ZCB<|uiQwvNWc?o~1v0*eI9LaGH zxh4Mi8t6KUzsH<skz;9LgN%7tV0>~0a9?1p(H*0J^iQ*aITHj*`@yOa+{5g$-Y1f? z`|@^)5(TPH{vFfN{9S|onN#^EZQ~&Xa0m*&mjV9FnrXKlRZCLR*-*CUL}jOOt+{TX z6Fg2|LP#uvp{2Ixei_Ek{;`g|fMnm#YeyL%4;p)9HX9{2)NOI(uc=*5Q~2Z^AXS^Q zO-Ze966U35F;jy-wZPcXZW3jJQi9K2(s_KNEdf*p_$7;CU;Q^f9|SVC{^6OqiVrU> z%QX;L<dw&$2thW!0ZEV|LyR-o)72=Aq6uc@rBuQ_R^UKB)bnsItzwl2yd1B2p(zic zXEA6yLm(0g)4Dp_+>Ulo9nf9KP4J+k#tI0gM|^RqaYgG7I}e%$SPg{~Hv{wzNN=<g z@wbufH>!;~oooROYFss~V9(SmeMITy0WUUg36}W2wW8cv+EYtM+M2E&J2(}9$m!8p zOB+4pWo*B)4DbHP77$%F#(K$_d9_B#HeF_Srg};(bH#QZMBn@73P=*sXBLtvn*4$6 z=m&%_pIPa~R`ms<cN(TUHmxkZMvnTj@Rg(X26x^K9wW|}7b-({01w1ypQWAN!e<bB z6;Di}=X0-(Js?&AHpI;nKY=hnE&=7imt`xyFf^ZZPSl0+u%~{OA{h=Oy^h|y`b^ji zyK2nhBkNiSQd};>Hm`k0h*&zEr2Un{xb#QV1ibzOW3F>|SU@aT4H2*It^ih(sN*YI z?L_`Ko`~+mvR{sXuLFOK0N_sSmHFjPEC~2ry$9Th*<rtuBKm)rZ2up)6M?1<_q}ug zFe5AZZ~W8!e@4;8f1Q{idZX|ygYv5l+ef*Ner9`afv)31hH9!mN<08x6T!$1jD+6! zbmi?bkOmPyzG(FMpMy#Cn4Sw@uIUROfC(ym(ge&yfhfT3kix<`QoA(rGSO{b%r0dT zK5)x<P!a17%dJ(=CM8DH=Qe-DkFmFm5F#DwO5;8QIGgTio*`|IKEp|>5Wl}w90)q) zAY9{}*q)+iI$$>H&y={f1<SqvU2K+(6slBgyd>va@T4Rg8xQF8W8tudOcj+YU#gD6 z)E4s3xE(=;4+;;%t8Mabw+-x4Y+i1zaI-RP^MCANrJv{gaf&?B1&7V@%pLFJa(I?B zNdhfYRCFnMl?-Ln*AwZ-<ZR5{XI35=Yzt(wu(b;yGXs?SH=F3HLcD1CH5<Uwqjix@ zTcMX~w^F3%vRV0)qj$I@@yEjdZ*a#s+6FSTrWU0N0uViyMjjG>J>g`C7dX!%vK_5| zhd5~OvY-FH#wWrrK}Y{;3mGqS>{=jYqrVaQgAr2ZTo=7)p7+QKz-e<O+4A#8W|ZP= zkJs%&%JfpmVg8=d2Bj<|t*$|wr)gqe>QlYEFF;7ML|Z2zH%gj2j||8fxXP?vu)@z% ze=)Y5+knAzxHu!W;_$81HaRZCs2O2A-gWniVoMhJk%c5-;P!x{c8-g3p>MQOiZ*LF zLjo535O=Yx11vaSa=p7gtU39uX;S@Ih~pV^<A`j)Jkk?gv6iDd1G5YsB0bvmQD^=* z1^%aKX2<+I+jkHb!ZJ3z=V~K2-%|q-0#6JF1;kV_TRhq^*EpAw5&&2P`kJh)n!Zvk z`u-OmL{&ftuyjqKo$3(?k{a$WnSs6@$Tn361Q71rLO@*4g1JoaSt>b0(OJpbEP$5= zqVEPTGzd{7iYDD%Ba=znfER`r$bIPQ*=O~R*}0SpC<Y})+IxTV)Z5ro0;|6-zXFuC zD62Ew=tS2n*?gNO_pquRmaXV2Y8EBts_4#DgomVc?BOofbQF>`%a?T;N6wD6nejPI z%399#?eeIfI3m)|<0<?v0eUzPf|y{xOhA9aqxa>qp9>UkS5-mcS465Wh-4MU-t9`D zA1lT4y4~vG?pJ5WjtbQk&=a#J4rbwmt=kQ1lB<EBwg=gZUgmL>U%))`dKhn$5S{gF zRZk<~r7OH=lhBTS);|b@3O)zP0D-ORuRd;SyH^r{(W8-@g&TCmCqog+7UU+)r}<v^ z>op=B1E?W`1Q^F1uxfrB2W!RhY38xJdb{^Z4)-SIT5Ye;p!_A$zL{r^_!1ZI2~%py z&}ltlc^dR8QSJJlfT-HSBM{}WI(nLpXx+J@{qB+7Jjtq)X;^J7N3%a=K<Alf6HZ7Z zS+ncXOQHwB3a~OJ=(2{>ES+2Q5Szb1R}Rb+BQ5HC)Z@{ZjUKZxrL_VJ3|>EFLp&pk zGmgUw^Xjiq^DYUOM;=CeW<h-F=A8&X_JvH&TOi1o?8MH_`^e&vo42J`C0eMR#j<T3 z1?7$a*R698-^c?#Oi3v8?Uq?c?d_-6Z<i7UfbH{8=bD$4VD;xH&LV&{!Q8?H-zd2b z3qziM{(AZnA$HTvs?Vv<`9<urU<8>c^Nks*8a=bj&JR<Uq3t?64`29MVCZv`<1M#c z<?qyfw9#)86Ku2rbNihP5l|wzDmZcGAdA_us(ak1v*8DrbM!7JfY%<<s~!!l<JDh7 zOZ6sn(<n~$el?c?`;_CH)Pn10XAJ?O*O%yfb3BIEb?YwSRJVbfz3DRzox851p2)qG zgjY8@0L@jdF|(`Y%mT<eaY)a=|1vaXRWpt|HiW;g(!-I`y5=EROl)C6U+X|0HSHsI z6x~{7)IbPppxjU6G$e>soWUSY-M$4sh~Hmp`@lQ24o^?93sqcc@#kPB=686~0bh~0 zETr;;jP`i*4SenenbIk`1@j!T=2vf^EckPLF7C0O-Qr5YkM(R!zmvC5S=$<aI;T*X z<*?OquI8t#ZZ$6y>8=Pc#jo@_;tz6uFcwzU>RfEQjz{eH0)&Ro!J{lM?~ZlN%NrD| zyLW>aC|EbY9Th!1;P#V@hKB*hUAxtuF;|!L1}^)9IwLLBP^|hPFI(9CK~BYkeC>g~ z&4jvoj1i_wulJ02dZ-G30FKQ%?&3XLYqCQ_ecW_}FLVakH_$t)Osa#LfD{(3c$w&B zjL84uD~nm&b~!S@sDy>~&AQKc|Ar@-e&I>S=mp_9?$KRI$`D19fboceo&h?b46LuR z!af!uDOf~TIBVDqmSn>s(HrI>7ODE3bLaMPrSBshIKXmnrCV18*h2NrJ@ZYvlLh3a z?itJNMImX34x~<{0zCD1m$5!>fDb!@$2l&?Hkf7mGcZ;SF`zExc&p`9I_YQYwpeTD z*Pe6w*9`W7_4ax5779Nk@0h7Oq>G7)u$djM7;a-{HM|FQ+*Z?n{twpPJDSb^|Nrk+ z)uL2&7}eHjZK_I(R%vUmT8UA+HImv5LN}^Ljl|ZbwMwWNLTIaI)Fw3|En<b(l!$yU zqp$J)yg$Ele&>A7@mEfeJg@6|J|E+Lzdba`LE()#k&BI2z1=%O>D78lY1aj#H*bF+ zoMY|mJ8!wIxPAuMc67AJ?M$z}ot#14a}E_VBTb#8opTLASt=G99B)pAL}miHoD)KW ze8VYmbD4Nu;*MyIHpDjeVB^PHtuE#y4dCzi{u%`0=e<fD#f4(h)lZq4KJ>{-CYeJ* zPktLr$diy#Gnm@_i{&C~IVhqm{$7oF5H!KNsA3Kjbw^)pZZH1B+lL945)=CHXg6<k zbszUakEW6BW4K_}evNpy<zNxbO1Jm1+TCMMKrQ&`Wn4M`e>_dzVQ~<H4uZeAuKW_d zG+G(9A!%1Q9%=bY<NCxy@{9a>dx{;rV@}s%&9+!O)OM#_?2WNhJj{GZLne;ZdeQT! z-1Du5(c?D)BF7p_fIWTk_yu0Sag*~zr=db9EG;)-Ks3&p`X&=XiBo4NU%93c%WBqj ziDknr@@~XLT#5tTW3Ez8<!kKtW@SyCe)DwAi|xQxN@m}Sv*pJH4sn$$R{N$@{vHaO zACipRubi3}K{r&otpp_wE<A}00+F8!7wAc7_2&;4y5G{a`t2NfZN=JegulA$Tx$gN zP1*)5l38QV-eblp8wA|^$jovBCj-L=n`aE3OJ`tj2X2JNR~iu{3$&hJFxdA0-Uwtz zZS6d_UcS{oPXP46XH5+N^WUd;6;wqA#3E23Qx5?L8dUQGDN6H^jNU^A+C-Zd7qm8v z@-xBt`x&LCqZ@(w%zAtb-ij_p+V3<!?X3Ctt&0tHOtcS0auRT*FO=&<#hubB+m42= zfqi?QQ!p9Y1K01)jSdG-I?P-hOPBmv-ZgtSRy8&?QWF2`2z)-Qni|(6o!53gYomxa zZyjj`8x1pwml<2h{jA0$9Lip6>d8n`nqM6ACpU=Fg+4KZBEf}2NWsB;=Y2;$=mB^1 zUq#0KTZ^n25htzYPUz#Er`G<2>C2a*j-iqjc#xC+eh$6XLKQQIav1~XS{VdBbA@-N zfpjlzkQD`K$~PI4wvlO-u)r8^Jb@a|!)?s9Sivaift-D6f)CqvYmQa8Ph0^AdRmjp zC6?HJ8RF0_mE()aU>vYp{$<Lp++O6y0vXG<GpoOIdHU%ebJt$*e#q??b-LYP{h6fA zmCjD~>U1zy5D=2wDB)wObq=3T22wkE5D`a^tXpc5ObgNI&kLNO|2T9=!YTy+u7qAV zKNv5z=9=H!Ziiae>nRh_TW>WnwQ3D`XIiS%BP`7NEqw*m4L57^`>hqs?sswwG~}^v zO7AE{TSs&+<Nf`I=6^MoJ!qeQz{KU3i!3qfs-ih+E8mYyl6KI&R7d`-MfVuJGqCUC zjn;~|e;H0#4yk*HtH$z(Ht$~xt9N#YOTE?IQ={~xQ(rz0bsUw8l^5zBwi6OrUA10n zny<)pH}ImwkbRdL5a!YkKm<wdtHXor-ypDed!JkCt!Q-rh;ODVx!hYVRH4Q#k&K|b zl4#@@2^Y|chb$s-IfgCw@hCY|+I&9E&;D2S^c(dwiZR9hh0M$hMm6m77@N^jfR{NU zVlr-(p%s~|bP5^SVu>JdFJ>=Iy|I>@mKD%yTY!-NRV>~<Oa$u>`99gGoU(MXj0$=% z2Hne-39(m~R)akV(EeEM76*x&Uw|$)snA!fdKs!|$rz>=Y_6+EF;oK4Yr^D2N#sfb z;sPzGN0`47=^u7f$!(^#Y$|&^COv3SRF58P)qCZfkhdpoqy*S}=D^YyXe&6!lbM4N zNfX|m?7s5)>f4dHA65HBum&xf32o>%z#=aA4~Eto3#R65;JV=Eh>aPX48wZ4p?9>5 z**KzlP_p{sbWEvreY(o1Uut4xVCsSeBS5DYuPq;5r0eLv$e5m2$wRticq++TZ$Ern zkNK`&f1U!a<vlph8_LsOa}WjZEGsL^3Qa2yEMu)!tI)Z|q!&IO>s299l{l#&241=( znHNnIhDR!R=k_E<eneMmbnY1)fmFmbn<xy#tUa=JD(b2(yk&wLvC8aw{frFm$LcQo zm|-eN{i0w(Wvm%e?ue67s%JS3<M9)D+QB#+$73vsh8s^lD<xVNEOb=*=eSzLS=5Ee zopzv59ToU1#FVOgor&_X?CRpfKL$Z0nVyE6rQngfn3?i9Ux#2EuQ`~{n>Q-lG0??+ zW#Vx?JdOjE738uZB$UIrEEF!;ht?~!j54JaS?er(p}8xReQformiw`L#Cz96FPG}| z8b+q+C?kijw<1>$+Z6!V(bFtKv?vjQtF_kkBlVL7bkQ{(ZX2X>mtBknf=y2l+_acO z_Dw4n;~p$ZrR-zHdN=f*bBAT-SqD~B08xezMo+SWqBii_6P4N7pI84{`rXSws_<m_ zZ8WvEWnD;uKYO8_7d1W><Ru}IxnwsMedFbZY5p*DC5yaKXsyfd;qB&_pT7~*dfQ!L z&Sby~>@#$|+G4U4Q=d9Iyx^_?2+NRIi6l40^wG}uEnG_BR`rorhdQeCX3oi3<^U5? zS0~F?H?2&6Q5__=4=Rsbz~@8!UPyPKxmzk`J?iDk7}q=*Uj=4$E#%W87@jTAw(Mus z())ag2z4vwBY9oN!Xs1Qoq^g&oNlO;diO``%S;D&dOXk%$8w8;EK26kkk&=+NH@KR z)9)t*aXhB+^FwPmkBg(0w@?y12y~7`XHV7`c7^y6?eSaZs`e?@komfekvX8B>rW3X zFj!7oP+sYx%JtZtW^G`~qtTbX?Dpr+?-w20%eP{BR;~PYx3BH|JY9M<lff5rq|?^J z-l+P4<(moB%Bn{}b6*`eS*Ji9!u^5qt^ypF;H4cmYIE3D8lN&sZksUN@|jta*>AQQ z1vA~Ynnr$)TuyK|TwI&DJ~BoMX>?(nb1aEB=$yRnQ2$lg+}m0^koJ;G#4DxDH5D@@ zX=gZ>ZUv*_aTyg-yr6h?)#(M(YW|py1vrn9xIlAr_87SsJI4epzAz<h&Ayi4_ubRF zEXNc$C0o6~qma<~ByV~KSXL>d%8FZwWS4JFj8<B)?(zgCF&5@8Hudl?COoby?lR~s z&h{RVQW9#-sZTZT+zb!ANu73WKhTf6E>D98B_#)VV_r4|_TF_3w|T!;fVXY@$;Oh* z#riDrK(D9@4JzGh4s10kCClKpD!zX+JGRrBXgff&q}vFgon6PutIR4NXP~DZsy;61 zPhU;OkX2jD9eb;K0t0Zq_tw4@?%flGpR+T}dG;JhXjFuMVQ}9N*YO*fJ?=8NaYjfX z0)MgBZ#;Lg43PsyR66G`U>}<Z>i(XcltjaF`zlQXX*Ox}M`?@Yd*68aJEZVF%Jm<{ zbWHncW1hN~($fivWYhvr=8zL7@k0WfFd<g+G1W7;ayS0W&0|J6rA-2)f_AjiGQ`S3 zrOI;9dxjJi?2yx&r!B7C1uLjaWYq1gS~#nd(k{>hm*)I1expPF8hcE5r)}YbTh05J zbwybj3ybizp^e68^b88xO(mpJG>AXuJ6nAh{27}8R<B-1>jbf5q|I40M9R`Mdv)Tv zDn_c^E_Xai4bw1Q;bqR6H;L>BBA%1mk27ImlS4yv3aK-;8Csu4P0^p!eVLbI7-+(C zb(+<9j4A)Cgip7iD=;}YfrivMu`nFeE!w)y-{Wb0fhvpES{A3sx5BA->1>)o+LT$B zQ(Z*DN<yky$b2IcGW}P1p!sj8e|n&MTCXqGp`nmrg!wojxBGjZAl>l{Lp^Q!jd+oF z!%?IWbOo=qve@)AsPi19yNa|BNiUqcp;W4wKT$PBmq#DJpje!+BI#$}=!Tmw24SoN zt~vr2r)zyU1(&hZLP@80m~}&!e;F|f2>T@b()LYLzWl45%l#+(if0$>J!SWvr|p?f z1)o;2+N||+UqY>8b_rP7H308jK%96*;V$uL4*IoD<eiTWoHDKFu(>`hO}eDpHZ;T0 z+|ApK#qG9)W=|@ZxO`VRlk6VMmeUoe!K}iu^n~X}lmj*bSJ=`lD))L^!PU2ODXfd0 zD8k$EgCg^r-63UaspOJItmwW4CV`nMh&O$ygEHes)w?_Nd%th`@w-^LZ`f?055$}5 znhY_{U{@zm6&<{ZOCSwxtAqzS)e~Rd1&i?34;e0*ngB{aZfUesS0%Rf8#&x*%^s|g z<_g#DW~14!6!nyeGMPHE8F+o3%UOlb>#0jm+z(AUlL3cXAm|SH*BFdxWBjWem^r`? zQ8&?foj`3|T<~&X<8{17U$yG|s>URP?OU1rd>$TxLcU`nSkG23H$|j<8;N0=gb|VC z*gh4}jeM)@HOKs7>J-wNUZ!`P4mF`1Bc{ajS>J*}r(>jxEc?4k>$(E7;DxQvFG~i< zIUeW%tS`UU9eT5tX+}XEE}*7y{ad7b@Tc(`zrAy~iD>ix_2EuGV&Esyw95Itu>V2! z+lz8hcUZ5ap#@bR=ERWtZ0fZN-+#Y~^W1G6`6Aj!JL>Y)``Nt$)!w9;*XbO`TFy6_ z`#4{TImq7?K+>TF7>7PSuMnu|oK7hf>wP8UcE{$T0`V<?=0GUtY4)ETUxb*ypV8xt zwm)LNM>Dd(fTpHxbs-{Q_rT3y5#b>r{kCU-w^41vH5?yCdfgbwK=PGTM*|CKieRMS z=3{~gqADBD_!4L|rTO)s>9`nZ_EHuzfkWNb-&^<lZ77oOw-rVNHY(|-^W$yBfr?o$ z(1Ln*yFVZ8Zs~;s^ULoYFeP!yK6z!Ohhvj~pFqwVG*T<q1ztgn-&bgKQgZ4Ir7eB4 z$0polhD)-@6OgZ72MyPPCoB89pjcU1yXHm9%i`LjIrLc%o95?&ifXIvPJZ^SD$5Bs zrk8vs-SrpOC<t+^`gflaoqXhSV`=?bGZx4SEy7A#R{v$B`0F_RwtrE3Da?3&@`+LQ z-h%q1^d9XPn}-0t>+^6eNMRI9DsQWv3^!_gz$vbAxoNl3I1Hoos9f@x!qQ8w*~;Pt zOyk%`#r}JdV+Debc(`(+cSlu=N;##hFX&{y_c2?ThbV9@mRW{M)o?ydj>GwwT0da= zju9<TdIqrPA@y_9J?rrLI%0>A;CU^c_g%Zhj3z$)0`N8&Ia%V7Ahf1eJV)u(e9mz9 zUOF4R(7V)6mk+zp@vNNEcHK9-gw|`H^|t0sr;dB4pIW51;qr|C_aB0Ok5_;eHpF}A zxd^|n#bu(s_^KYR(Ccn~<*XcWkDw3>Bg=GSPAiX{oNqfH)4FW7x2ZnYEg(}uB22m8 zr6;FI{N$Z+xRLwqNM^;Ss>g_$quj%}J?D96%oaLZJ1K;mQc4WlkdT@*+IT}J@}$0X zB+)j*pg(tII<ni-bntW$IAgIfa>H85<85D`q~9rGcRZ_>m;UhU7bwh);2T)4kYTH_ zcmI-q{I!SO3$bNWt{RO4^}>H*JTAZGdYY{-E<L3w>xPPJT%$McZcfRo<PblX9JUI$ z(tT6L0?*J06q-!&d1mto)mX2+gIBpOKK4Kg?^AGO(%(&tUA<V4eB-4^Z|OOhD{!Ob z;H62s7D8zRd)BD+^qK>_nyzUiVef^tkrGC`a1wvP*H~?VS4P;{Z?!;}hDBRXrWJy& zA9lD0;{}a-OAki^S*wC?*QsMxn4vbtWZQL2ahtgOV*FXGdh<Iu`lwI0yj=#1xYG0l z>05fn86iD}dH$uG>EF}TvTF-LW_F>)RfEvc&MFni*JA)$1nixxU<>$vt+47LfrGE| zYe#TOjWo$hUvtEI{UQ+t_o5auUkCb@eye`;CC?=<MX6p)W$Qk{B>wij6Dv&{X)6gm z;(n)iqj?6~Bp13p851+P)0)pkBztYb6eYM@txfvxy-<gur;w3Xm##0kPbi;8uAHWk z>GCukmgKi^rA;W=X2VEQrRvtJmG8*x3jWq?KA7h_*dGIq$e+mbi`85CH~?_f-ZWBc zj|8~$2B%4ry4qu}anbjU+da)n*HXvso>eQTdF#6L(Leb(VFB1x1dv4^2Z__&=%c9f z;N-G;FAX2*<3876nF9i^sE0I>khnthw?jaYlP^K_n9-y=Z^k%+yV{%t1-T!-tk&Mz zDXts1VTyBPU-Bk}HU0{x3%Rygy3+j~q@7f=WXl^YZaH<ylEeVErgM4>SY&Y*2v6Ai zks_@fxR&Pk-DkW<WQ~Dc3Z)KeM*5<F?HF-^>!fOIS)T+h5{NIGpPvKLy~gaD?y`BI zd=^$r=O<K;Db3;r)37XsCF;@(JW7%{rPiR@Q<tpRu2l!U0AW<7<1TvBe&?_0;NJj3 z5`nfMl?geb?^3pRdp*!t9)~npF*MQ=AoRT^BAwnc65{z2U&!4ajEe48g7>Z2Ho0z_ zJ>sD968&3lC$45;X(f%z7TXCOMEp<0cjSUv<4s>HDg+o>@^hvMpU_g?HuE}Y=(RtG z)L?Mucf#9J4dWlP0`0FHiB<~yvyVm<1uLve5k~%(#^>yh$f-5<rI^|tPMDsDd>+p9 z0TV+7>y#%vu%;|3Z!3*-Lr_eX@&d2cR!r03g`VzdCl|gQz8CoAkjA1q?JevIuzT!w z&m$LBG8`?Gubq^C_Ri_Zy@2#g!a~QpIxSLYBdT@j6(2^;H*BehA?o<`0MV^GFKs!& zVZ4nDq&McUG%gRZYEdDVs?)NaDhn^HE>z=8L8Z${KR>MX0|~R8sOt}zoYrPWW{~3% zvHW`L2|q?5Y|x1Du3kHza5F!W)!8eDU1>Q4^2ShBKqyDJ);@jBw|&gd{tJKhL}cyv zD}pq{N|M9)r`sxetxiOMDG}c-PN<uJ7Y<RRi;h4y22KT7F)5blEhc!kKbwTc^8s<c zwE0@~N+RM0_n=XKcF#@z)5K{)e@<?JZF69x0{&B}spN26@R~MIYY8kcT~>yc2p#Gp zJlpDu>;NT*eSfRA!i%w#bbHn8u7aGci+6OV+^^6Rr5by9_|<RG0v=zCr4Ov`viny= z?89&72)P6GP+t(*cn^~De2;nEMGez(%+CfT?b*X(X@Vp71HUIi00&rUl<-l-^wW=( zk0zSgbzDI|J>c0=b~AP}5b=?ijImZB3j3!{$Gi-hiUIOk?VJNjZ?T@g236SL)qMRo zBVPd3Aa|Hk1w@WR9xdzj*=ElPl4oHYWH+i}f9H*x!~x~rOGSE@RZhiNYUM7q@BNt6 zBjF5REXMAyYsp+AcL$@T#(#bcG{UOC;)}Jy4BYQeFI^Jusr1T;r~_UG%JZbdpYp-c z<6~1BOfHAHd|eX5Qh@OJ{oV{9y^^&=;wm~5eFz*b@I@J~$BUHtDm9F?;(FU~Y2~VH zPEL`ItX;;{!uLruoyRDCLjPNE8c^9Md1YtRBij3O3F<SZPD&u(#iWOnMS&S*xf@OG zWmDiDs46#*Z`-Xd<DGFW;050dUgyoqF8UPen_idJ>ePgxlnp?qGoJm-WBzGA%Bwe$ zWF~(`?WF!pHuNswQQdHJj*Xx!Us|<&dc@`A2B_UuFGlj&5d$oMsnSSE=J^EOYIr`3 zIk-~<bGa|j<gofvoc46>BS^tV`cWdD8wd`HB{VweF`UUjjW2kbWsRCwne5Tyt#h+T zNyI<#xKwD5nBqZ&q_szgL%gW616J1Q%cR=R4?0Y3EshdV=ccQ!ih+Y{#O>OE&F__{ zrPjMtyM)N_Y(9m`?}-`9KYH!s<4&Xr1thSOh2a@q6jr4>0XJW8y&dnPC4U@4n_Q^J ztR$Hn#kyR8+gMvyGRAYe=?GSl2xw%|jUPJM4E`V`iJ9qet@^pL37;ljO?y#ZiSdVO zOqUc7wxQ*eucg=1J|QU2*;<NCwBqrOua7C=_{uCLjgWlRYOPv&@0mPj3>P{CLLnDW z6{4M;i#ZP#1H5yNc!KF9UgdFb0>xwQX}2Z93Q>h-bf=HyXSUyXm72Lh=(WOGz`--3 zI9_gVJReS%x|;KVqrVS=POEYowb9G0*O0cW%A(P~gjl^C<iowr<1`r`wh9i|q*old z9Wq~2SL=~Qiw|(1&_ii2hx)F{$vCJMY#H`!0q7!@Y;T0S3w1`6DSZ!*8v|rv65Wwp zjb$et3fIDYS}z;tsl+neWWLn#^u8Tb8Fn;p#3E+eY=LK~9|SPT1a(ZO`kf^&#kQli zy*?9vDxEG_0!`%K=DjX#vl~Nw(;Wl7W3b9Giy~L~C&3?={K>g9wz<aDI$pm@+Mjb& z0oPg)2kseP%>|E5pQ4fgY@vC9hT4t0eWGtA_;TWm{Z1KE0=vbWB>f0EGea;~H7wsX z$iY{W+vL~HW5#34O^R1X%t~PS>!msMv`4M#3jIFUeW1M(OcG^O0+)(l1;MNp?mo?` zux#@Zp6LSIBp;3Qn+8iE6P`+gE5D!)7~Va&GR<lHXFEGWg-P2|M@D#0RjWI2ntB1w zaNQ~Q{lZU{EYg7IMHret8AGB@AldXNc@;yBpS?QQzA@|V`RMI5@S6TEtut*bY^`f{ zGYI=9K19FxF83ym0wAC$t<RrCSpcNB2|(i+o`w1GOFG%omF!}!<ZmxQe7e<VgzWk2 zyi!nW_nx!N##AiHEJZ6tt!d@adZ<ypoh7CE<no_sdEg655h0w4Sxr4hdU`QdamKo$ z5yf$e@qW6%w+x%<5q=uG80R=k_hcIBHqM)H&V{c;%T^nM$+H3#=`C+nV~q_-0cNF& z_=g9+V8Cf+D{is$v8Q8i#Ad2my*C%YWj|5r?r<y39_n!Y(a=TWMF-LX+~X})j}=;o z?LKr!XFdHUqEvn;Bkp;{(tdBs7CEJXy_WZF^0<=dO6A7Ap@Me@xlk4pu`jtCWZXU` zn)n*am79&`L05_=?`J2TkA%3yWyCoEs;%x6<1c$13bEo6$cWsya<(h2;&0}soh({Q zZpMOEJj3jVDoZ-N+Ec&zWIMbUdsO*@iqg`N^-s72AT6>I9=^TP#O63rgnxciu0y8n zJwl;A(c1jISCxU#@TO$IzwmjBVuHduwNkG>46$(k>Al24bvIHhvVZ!j7;lm$U=Brh z*no1(X!mN5;*_ayeZg?*Gz$okSRIsRnzQ<-xGSr^YxyIi4iI>N-pRS4K7!B_v3VII z1)3>HT&nY}wRmM`METuQw#zkJXV=JIG2SLcXh_MU6ozpn{yem6aX;+{*kR?JQAY~d z*2gx=2mVC)t*B%s$FOgf%-(h;?cr>ykw?~sv3XI`shhRgNGq#z`5VspJXgnD6i^ol z?6r5NDtY?BqNlBw#htn@_LezdcocuR?H>w)6j|N&{bcaIC%?+Pg#t;Hn8E;%K_Rt* zdTEW^G=G&c<k8uHAi+9S4T7PFHV|D|YD`FE4E7E}K}q9M>P$jFRL878#h~2iBz-KX zJJmkyHZFZFu&Bx!R9f3zT1)1&r0%Mvc4$S0qbd@cd<lkKv)r5ejhtHhmk{blEheEB zI96uA2=?U=2<TlWZ~BpCFKL~)a_*|Ud{ZMtG`Xy+%2@Ld&gKQH!Qu<X?VP0abAgt5 zo2n68>}#V=u4Xf#BPs6XK4h$y+yu1-0J)yc{v^@NeXJ!qvlN3DRKjm-c8M76Q<fUv z)6Xp#5;`t8FP|k;Y@4L>Vpu6Q<v#ZkKuk-?Y8c}O@lq)5CQ&VWs$a!vS$eW)@P~mS z2qMBwP=?yL_EXyS-&&TbXN`i6{9Xz)J!qOg{|7NGC1`42^`=AyGg$3DQ5dPy$Vxa= zu6pd;cSUPwvyaQLY}flUZ(Q~g$cA_jtoW0eN#!t)lZ(>W4iF|xF=Nhbo@eWxIAi)p zR3V==2q&`ME9FI`KCZusWHnrqOe(n9Qhgd(bDHMBU}=<6j|`n34Qu?;$ChWvAOQK3 z%NluBl-@C)$eZCB2~^_ClCRtgpME!{!xDRcvv{?65iGqFcCeaRii25FXwE|!2u<>` z$;2Ud%gP7kiB*cdPrp1DVS_HRS_MLKw3GBlPT#YPtp7!=!egaWAiwy^?MZeMu}9dP zCPpdG6k&IRcl(6J<xQu55!YDP4vFehRP$x(F*85EKM!%zPpPyy^}Hu(wuJid$HIK^ zloa`p_%R%0e+D_UTPFQO56<$z@|R6$m-qDEpx^CPCPKPdQ3tFE4s&#_p1_9@>VO;q zgb2FYZ=x%Y_R3ZNK~boYgKjO=%QJtv$hYoB%6_K*JP^w!c2#?Iqz3PJI3^=#61lhf zVX&~z<DonxjRS3%*t4Xig_he0<@+>v__gjMj_f}`9Urf$qM4GX$8KW*ErylF3<5E2 zY>29ux|l2&$JFusz-7+Fvabg`{Q*5P9+6S|EVYLp1qf@n#5Np0%zjtFusa}f1Vgm? zK?zylpetx|AeeP1lqFK777hV!Q>5CFtm$Oa^M7<Tz_^;{157viPj{)-S!Igrn%=Wf zJ;v~KoqL%+8SpUG1wB@*bAz6^wbe&e?DUkgPV0w4NCy<&2GqT>Mr>5!=iAMBLl(6b z97WH!+h}NppqiKsA|TVqm6iJR%%s`#AOE`&C!Ng7YMavWDG*S{ev;)2wcKE@<$tu# zGS~DeAnH9X?3kL@bJ9|L$<SO;RN-=1_Q*P#TKVzA1+Zx7C5l6Q4}W7`lj7y?9wpxn zMm?}n&Ug_58rziP*sMH(nmb-g`V6T9IlKVrqW0^@vy)R!%@i!f%BwMhw&er|&h1>X zi}~Hc#F?omxeTtRi@kx@ybmV?03AXUQ)=~Wf7!Z^Z}r3|{*aN^Lt8>(pu)U!btR!q zlD`t_&3x-I2XXVd{mq9Jo!OFW!H;fe0t$R-4M!6>tzehjqe1s&y4VG?yr21}Zu-3M zO&a#v)={K<(_2UbtXDq;to^Kc{lxYuXO33E{N9tJNCzuscN{<9Q<^YLxbprM=$e9N z8T_a9rozX*e+ON2J#f4EcS!w6c|_wf(xmYt(ir!lhBL>6J{fOuI9Zv|z2I)qQu2-b zJ0eh_xbBc4E8Qq<v!uCz?)f}-qxC(?7*MhOgEuQWGZa1_%ZDG~T?*<{{SxGk12p>0 z(2!_FzJ`<LDJMA7Z%>ZyZ?^WukrRR<FU0~8SZvf+Veq|s*jbQJxEt6ZvBD+)%)76_ zWqqTYeAv7FCjirbr^C>^qbUX9MLPqywz4h5j|6JR0t|#G_xc^|`TWJ5i{ad`l-ET# zUlW7usl2%K9gq+_>^p6Q_13VSDhvovmdH%<!pD{+D{vrzlq21mm|wAr#gC5*y>%J> zQ$t>G?QaeF;3>>G0MjjWOhaS(Wapj{P^D4g$FVy%Yz(Xbn|5Po`ljNrHeVR|>(I?U zt5nF>HyNpvvwI2YIXJ7-#O$6<6$bSd%=u*^srgWEhZmqHnx4E5MWl%PXhr6J3FhMX zo@{w`e;j}-heOZE<^!7aq0r;9TbzKhyQh*roeR9v1TbaO*LXhtpk1FfT2a2ACANG( z^#X+#S$7DYySZh92D!Y~0T@PTYAY+DZuMsD6BBcTtcWkAx|H}nfp!4r1CXa1UeT%a z(%Y9WT@kn6(G#z7{iQRLvC(XGm{@I?#D>k<+iykJ{|5WqvH)EckGsu(Cqmj#szmL0 zE_C^DK;T3J$mKJPHV1?-AGFx6q;75_u2<U6Z8HmTe1JfG5cB|hUvCG6s|30IM*Bi{ zB&COQw@nD^nN9R<UV+h;d(j7Q?E(U|SJA_-KG=;qh}T$;mix$Cv2ZZI63iR5ehV&- zfBcPA*cmK4^X%;s-@_SsT#ADsafI}%id{Vv<5nD*y)FD%GlRzNFUk~NUig;aU<hl2 z15B!|-FB7p&-X3q_`>|FF=W%Q21uhzsij)M0yhLSGCF>R1xn1%Y?94?QaLCu&n9pE z;%n_cC)zQtH=DOiR?z)O9us+UPE#T9{Q&?}x%sxoZ!YZIjXOHe+aVrd6_9YuCJx;9 zaLnl)tdEq;p9j$3uG%*97UG8Vi3JV60>}g1ZY}qzHBbI%g8s)_w?5FWuiJ?T0PD{R z`ENa)KdQ|C>;nIhp#C*uz-mYDcT8RV!++7J09f8vcmAcC|MyD#Ex-RG#}m1D_P;0% z020}s@A`l91^&Oq@BguCz|aCZ63pVz^|IjE$1Quswo3kI56AW$(WPTxY-}t89jsJC zn->W^RD6Z%*b4c8hd_j<F&$EdICWC~-7U~mQpiV0w!cSotm{naPUdg7^WWsex_f#M zhSd80{{Hmb+-A-XW&D|t>y}r}S0q(D<9`on+`M(bGHMgsvkNS)qaPZ^{5oWiSB!rt zXx#C`j>IbJ1Nbd0E=DTr$C|A?WpZpB;9BZ9UX)q>qU3Hm-)SQNy^mDV2|O&Lc5=#n ztMKsp(asei&h~w>c_z%`-o*QXN5MlaaPd7qjL)~V=A)+}BiEO2;kd+`F~StWw}Rez z3u6oIzEj)c`6MzOox0a>!4;S6N%XZLEXd5%!aJt1k=T+=h0lM%YpTX76#i1P7?Ors zp8k|sepEn{21+pNb|!tY960AG-1-Kvx=gbVITJIujyDz;0=67nr`3w?gMMqtZZ7YR zQP&#r=I0`D;i-0Z7Xyi@XE!Gz?Bm6}9o{CA>h0W*@|9jc-c?Zg3haV2lk34C(1+sU zF73=`vFc&R6Brd^HgR02T!`)<cSV~7Qx6hfS(`&{5T-tO50X|W4K!#G(9Cs65d+Lm zcNaGwF^Cty?>-jHrw<G>yraDds!7O8B0XkLcO!e9l<x|gQVK78`{|CRv*#U4$PFR2 zlZfkQgNQIP`S+Gi`0P&CC+oD8ZV1QXkGbJ`varf(Xu>U~3qZLG@{Z#g+&RRyTi9cq ztS$p33xt+atJ{h-QmtKI$Sxc=X~@W6$s5a>tUeQbSy?hn6Kw*xolWsiBA4vG;1voT zQ$;JUoXr{QZlGp}8y2($Zgk2SGN=j)rM(GG*<#t*$Ys8nfJHx8>cXIKXno6cZqz)1 zwA5_ZUMTL-yibjL<TIY!LuWxYL}wbiDLX33`)Dqs-QB`ms<;P1;$%OSW>d=hw1wit zG+ZvsCE`3HrBG$VJ%$GhfD&_HCC&b;QOSMabL5saB%z_IDDOd*9-wVR&D?q^Lfu7H zn=vmRTVmpjJkkiH)0B>OeL+trUF4q5lDoieP84x-r`ZSw+D6_*92e$GyHccWa%o~C zRWY49XO97!^y1k-$Uj6ZaOZLD6d)qa-Cu&cX1N7>dIw4}+x>)!+BOj+kN_SZmi8*; z4fYjBf?3v#DdnpFrmw**N_@-J+TU-vWvIt%I28ipJ>0*_JgBrK`B*5NCj$d9mMClP z1R377xvxN+aAKhFJb({UF--3Pe<u)AOa@XjarukaG)vRo#PlN@o3nd1Bp=ylyFTPE zz9gVo=hkzrUc6?mdw`~J-)haGlNek3pEk`i&O7@Y_E)-ODbtIyiel!Kj|yNGTlYcG zDQG&2!CjoSsMaVNag)A0J)C6UK6Faqp|T^S9?RM|SsP~WZ6x#Q(Mp`UO#Zy7N7Hj2 z>D7?{On@yP%V|_|Q7V5Y#?Hgp|3!0>ie4&dEzgUx6p|8cZH!HO-;|34=~d7QsJ@sx zwd-7k`FO0`)9_U-d+*`>qU@71mv^_LOb2zEYbyA3y|rj_o*V#6prYW`XgN4_eAhPu z$7Yj(UT~khyZjzhZ>2xSq5W)0o-PZ&Qsip-{JP8XvO@p5EOuXo`4(9hm^g7y&9^&! zFXx!DWx^)GQKkVQB24;m@knL`TB6#o&!MLB?1ijr=Lw6?gpS2akdLI;`Xyrlr0B9z zhZjiYKJ(!NhCS)v$;ANvoHrS|IV?GOo!>hg`DPH}kvhQ4l&__#1$&;B$KmZqzlL|% zjyeS&Hw8J=zSfXQFEmi>f)f_ksMY{R?HK-*Z}gWsz}wRdC)2upEDbtqcVJ=qv|CKV zn>IV|=ve;QmjVP<u^4wFf@c5qOxH(d=$g}mUvB2{S_tib;mr5o>s!F6IMh)bfCUD3 z7&2I}Zr|VEoA-hhV|xedAP@TQUfd6uPHGhVQGhXra@l3~nEp>i3VnFWi9R6eWIxtn zdm(=8RKI$f3!7xj{0l+D)w+`t9Yn-_C#|jX|KN5B_}Ju2Q~i+n4cZJ|FKEqZA)eLH zE9}_H@Rv9NwTVGt(NW_&@Zc)mn46+T&kiUd?hHK*Y8A*%n9-iepA~rJlvq?9Jr9%f z_}o4JjsNaAtgF&t|5X#qsI{gMxT9YX23)o4{1vr1<J-8q&0z7{$^E^mv7hNjWA@4| z*w<S5&%!uSSun*LaS{xV?WY(D3`C)#@V|CAoVF5=DLs2OJYERdU>6h(1&6)Z-!h=1 z=0aCx4`1TDsMbF0{2@gzCs&^`!6w#GwCAb2tXI4Z$stT$EY6(`8XHqZ)5}W}+`<Hp zn*4F#Hlv>d4%|Mj*YQ2l05WOzD=f7$5e4u?q1S&?I)GG~(=-F>X0vSEG&fgrB9wBb z!5L-?%GhL9nzFFTvH?SUeNQMAdj2|p;SLW|PzVPkspciX_n{Hq0gkC|v{&+X`7zKN zvDr>Un)=@m~i80JY6F%KT7SIWUm_?AXe#g#=Mo0E?=)vY+vqn*sclsy2apse|mb ziTQ(&AccjcV2KQX9aO;Laev`Zwprnw<KpILwGiWwW(x{nD$*!Yxz@R_`58NTbPEao zpXT5rq2;^yE`6#LO+LtpdXzDNNMQ;4aBtMm9LIQVap=CyQ6aU7KC4L<o`DVkP^9$q z=>gF*2c63~$|MpKOye#kEMX9t6?+$CTdfCOiB~Yj889rfOYDA5M?tWEeB0ae3I{8Q z&Y4(%{QkLF1)wgGGAK8eGl9y`1KA8M@=;%Y^D1wzIjSA7MjlBwUy6L8+$$Lbu%^L6 zj%iF@p<9llkPkaKH{{Vo)Mo(Bm8vA#s!Yo**W22s{QH`pXubqI+A(rLDJLnzw_b<@ zTeSc(>9P%<BNA#82)K&T$^_(_wyDL(b&6_;%-PKy;h(cqqV`$r()-1HCw4cH*bNYD zf9HNP6ExYcy>REvYtdvumL7Tkud#2#rZ&7EWSg|=oJN^h+9`o3;JGIhpN5CGE?+~O zLOlXOPbeA6OWw1*w6bQ=#b9GSR(V4$(={Q*HQfee-3-*YJhh5ILCph>=^~+dRn6#o zPiPn0PMRy-)VX@D#8?Lli}y~O5+h+Ezd}5LBFkWFsAnxW)M2evZu5D({$VFD^RB@I zEubhhQqPT7kT*lAkopMT(SpSrnppNB&d%vBRQU24%EzZ5mw0OBMGE<8718s$^SZzt z)Kf&KM2Q}ooLT|)BzPX=Kja<+EDy68H}6F<2Wl|~_F<xhvTC{fc>TGEJRAs<t*caz zS?cZ#=}`z40Vsx8vpOYI{RL(MNS#f4BbJZlJ+}LltU5C%${rGm8Z#J~gy38G6F&e{ z-`p_A(hKznkyjIi_*|sClzY6izV<^8fD2d{Ns0EM2P|$}j5iPfs0^`%DUN(x%kgp& zgYavI|KYxVE%H}1=n*V}^}2%se*gxq11=?w7(HG7H+_?WGSE3^g`vZb^R$8whB@1( zIo*Q+{Ze4yjdldu`g~ZR36xDNKcoDiuEY-p;YKY=E|_C)mh}(txv)`SB@7%u&DSJL z>MN$73@=?yj`m#kr~z*CUB8iRz0ZD93iqTY-twP{ruwG)B;;R}EK;#}_AO^#65ot* zO!K|Bx(e)TN}sL)!$vk~*#9UYxZLqzH2^uN+c=+ap9n8(=B{3fzmRwR{OnU~kY%4t zcql5l|Dvq$hXV%?vjUnw&3HB2;zcglApsvzyEf8NEB#k8wMq0IU5DGM$o^*18i811 zdI~5guys|5ij~$KUwzv$RWHtO#`eIG?->s#u)PN#Hpn$m0H@br(v-Fn#CvMYTRl8r z14pW;X_(sFJf;+GlpZE(Upsnp`9%=a8{_(BjGH2LL#N`Cs)@WGIKzVaC!|Y(bvHbL z&<gY-8W9d*AMUDPyxv@^UXADRcWZ0|nm9!9lER?}{<zV&CX_?cNIY&p3g{E^9_($E zECG`O=39<uo85=jZw7vY0=>lzI0>T1{qG$9{$2B3@C*3K8H8PuC2g1=h#HGp7L1Rg z1{Sx<W2^>Wd!pi5egd$hZ{$SJf__h%e(WbJseE1CNq5n_`t<kNxA;;l&hKxzMD+jQ zLFRivDIRr4S6G(D>L8ys*=rr_++zz6<R&SzgnTewv-|`}9AE?l@OPrEa=j-NiDKc? zjdRLapV(|N5YRhKewgs`wIx;nE_-qfV3s;L9(x2B__Z~oC)>LmRdE))b7Whf-L&r; zZL&HA1J!l7DX{?D>ZJTlH;mI^Hqm4en4z0pB0|PZG!tLkD`@z0Vp24o`TWy5HTMJR zCqFHB9`m2|L)*pheXi2QPTAcbHON{vvOQgq?q&q|K|j({4ubbA8^pV@9yHh!IRlhm zDaSRmC?9H-Q|G9%9mO~+P_pz+q2r&|wdzd%%~+}QOdWmz855ViqpA3Z?>?$||Evbb zC0%vYX<^2TX<&ev5)^xEeBw|hzWJ4(!s-)<w~d}>x@D<YLJW_jgGWKLW&60>6R9@w zBV2+#*MubFQn<U}ySazGKevBEiAm=JaMwaq<JJ3q>lW{GeI)htRz8ctyfosvO0Ejr z0XE^Vv^R<+%A71q3qbd0%E8e0YXy&vua1dwKW18Y*H2rJW!8h^mjG*_)ZR8HGk$K) z$3ObX7b+YgyTg(BaiP42zZX{=DgwQ{)YLc)L{eR67XXw0djE;a$U=zcPj{9pRf&DA zS1s#}(oRQ8WXD_<j@rf#JU%M8U9Q+nYFJ{VN^ELgeue>yvguXX6q;cBC3s)%dvQKN zGgxx1yllUBPh+#TWgOXDe+9Ia#0T{KN78S=XuGu$Pc7~6TJk=(V=02%`X3bo`%7=@ z50pzF`!GUGPxys)swYVX|DzOf5@%!=dDQSM`ABcQYNPOuZRq<>&*}e9EyMonbLI!4 z_x*smBLAggGJfdv+i}44^k0e{Ax1Vp==-<L^`8Y5cT>Rl$h}Ef|39j2TufJfvs|~g zV~}(4ggWux!)5*y8DzHdwNk5={YpNo@wrLWcS<X{|9ZQ)oA5{)V>N9Wymf_kHJsnP z#*0hwBEZPVr=oU%(-q^msej1!<Q^H;^ZQ@l=b>iOniI7aF#_jKyxh1DrsXhL36sh9 zdXpPS;cT_zV(F$&7Ib8~eAvK^*p2y^+*zf}G!=Yr#iI<Bbh5=jrRovz=;W1hoSY#< z#k!TY`n`UHlU9JIbC0yu9lDSLRr1x)!4+4eY8g;B%OZG2b<Su$zgJYWR#@!+PBqwE z1w<7er^9oRyAOdgn1^&eY*a<ES~1&7YSL#ahNWYA-^sNCpctT!@vfi|#SNu{UQAI6 zAry9p!F9nx?A+6Di;HyPW}aR+9_Nc5OUsL!S8p7%rk0<{Y!SX0?`v()nWu1`Nbm6^ z5kHQu6u~>(RCG5#<jIqZOqdOpgMiRXSpnc(0r%hbPu4o3ii*mwR#Up(e$XK6C!pZ? zHqzDvGb~t0hMvla$W0KIgPQ+(Wz7AdN(Pq3Y_N`Zm!#1Fo-M1vKzDwRU0^uRL$-%O zRaU8KV-=AoU_i%KjJs=B6pQMyi)E_8B4ZymdSQjwUKO2r>CPj_{Ny%Z+@wpyqqH&e zW#NtuJeMH|bdk$tlH6c!dZyDrl56)u>KMiOH7fZ({?_~n)IJqQ<7M{Ryi`vQ`!VNi zkrZKa5~&2cAtTTP1O}-QD4AnBD3@K2Er3ZYU$_+2LK~kXdJ$pfmT++xTIr{B4)B?D zy{8dlDL+4qMRhe>pDmf8WxUI}w8QV%wd)M`<|P6epb}b}l^9U5>g4nj^3u<lF(9tM zFs0-x4Z5-M@B>jv8W2Rp3zh@42l1p20dvP6V4##I<T2x(rV7iJLX|g0!mZ|bl!*18 zQK!2afB|@17K#lAPe8v-CgM+{#<5$q77J$`Q|uk*Qx%+%-k7eYSDDlGe@<H^{eT{J zG7gmea5U#*apf(aG@tOW4w86%V7V$HwvUp9ps$P8f9QuLqb&aQ6}G3Z{^N3Nk4N2p zy0$*a_Q=(p7e=1`nQOZ9g2#=WIjh^`_g%Zn&+N=@-5#$BEU}uXnu39_3O4BV!18K8 zIc&kVG5AL3;dEt49Pbj^<HC3WxJuD}y13uLz^=`%J<HP{(*Wjv%Ktvv8$y5P(Qm}G zm%pNW2af`Ty%LZPb_Xf$MU~jTUJRa*MQg(n$AYdAoa2y(5Dj1|jdkPM>$TA^j{&%K z6=l(Hb#M%d?60a8yt2=OFKugQQ64{)!A_RPlk=V$KcUUedXl0lQeAY*RaCkK@~>S{ zgasaUg6FoR&qOkFYgb~_0~ayAjUwK!ZxiJ-0*jTk?ytBP<%(>S1{kDqTC+;SL;ku8 zcWFIWjeS-)zQESh*LfrI2&%>HO*NxZQtf0!hd^WO?U9-4%NkaGl1p<draIBgD|%P} zlU?Nqqq>ly#u7UR7^g{ej9*H>U>G&w3}bkX{mZv>-2D6Yn33{lK5Yv&MU{&`Prw#S zyuL)Tveq}O^prLU@}6=`QMUN&_IXS`&TQayy-;nr(sYb2N+;-=MOI_1Ha3!g!2%|N zHL+UtJ;K=Er@RTz<_88@{ZsSmr(uJa*CY}uKN?HO=SR<QjnnEH<PQloU|2>qrxoPj z!yM2@?F0e;RDZRqIR{*G`#hNmiRV+YwB0c8xtgV|6(cy`q2*jIneFYa;`sC>fKmKj zwWLq(jfg$Y>=&dPSMr@|!a_n+Gt7&irwGb3R|Q=7yST?=D2YDSlRbjgV2R-AiCjei zNumlUu(+b$JIy#4xxe^|0nH~i|3y<d4o~*?4Zn=14bfQ~rVB<Y7hi15pj8BBs!R2S z#_7-*HqZXRh>~!o>ElY-0tTaSM{&FPK1YRh*|8Hj3-5lbE3CVFoZ@vRB1*jtBP*8% z>`X*Zttn!_>aM-;=wG)SM4U(GjPy_Jk%i}t)2R^e^cB0$i#;3jsWe?&b?;!XGfk-3 zTGGEq8Bv%w5%GfAVx1E30J$!b_Qa9zpZDfFc8B7CIa<!hZ16IC1|2;E-;mDshA@?= zmFo*f2AUJcipQ^53ahO3VPeo{7Kh(gi--C22bBk9-)vD>D5^QEr*+Ia#N$yfhJ2dE zr%{1+b~(5L*&tt4s<wPyqA=JTYOR1b?$nvJK0~m1QFU*c&2wrxAiK9W!o-~R^S<dW z+v!$=6|pzGEgP#3^Tp<i54uk;RB;;8%KAz(S%oAcoCc7JQgbC|nL$CBUQ$2(r_h<V z@Xw9&9%jSJ1BR2Ft@~&bHKW{Q|M%U2MfI23xo2k9`ZZ)$vvKq9WciDlM?4qj0vN@d zmA_lEb7{@22XE;`spt3qx=9KybZVC$$#ZDjHC}^#F+W{jx-XcAdgv%B;CG*$M?VTT zNYgp<CPTf;O0Kondk{i;+5$EPWW{g^BDt?sC~AHF{tVVp@i@0v82UxwaI_NoBIkj0 zN(9vi7_s-}S6_)s2azc5)S4P6>(l}O5e@$Ofl0uL>efN+1RE3;amZi*eeh`}fDc*w zT2L)l4`xUyx~D<Zr7jX*OuGuan(%965P%_Ab{o@q)Yz}Nn0yXAUEgZ8szUH~<dnHo z9d??<U=OB-`C_x1OTtFjI8=#T)oPy4=gq)4bUmYx;ie65+^i?-Z;Ss(I%pYDeMz9^ zw~&cw+&AS<6$Ku?))_bB_`8LHq9h=c`_j+3lJNNbPjv+<>x1UY6?=B;!B+g2;f|6u zq>nZH_g<jcf!TCV78S@-OuT(rcJAOr_S#(QrfYk@su}zBb+OkfTGLl32vzE;qw?{! zYdU<~PN_lFy|5z#z(&piUwcMdUtQ=RktFx--Mft2iHd~(S`NMs1F8bA7+)VQKk&M9 z59>XTgg^Ol`t0wE;E?EFk{dDHZ)<=Buvq98=j8bEE!cZLtJAN>S3u>_)d4)Kl_OB+ z!!hy48tfK#D4f>nJZrP4+G__oKMtuEYS2Ot!piWxwibQ3Hp2e65{Vml&mQ?J*T>%s z=kUcy2CYi04jNI&XwE?v1{EF!PfIti0~kPe)4h_6^T85FWYpU6i_<EZxpejbt4Cu= zbhG&5mvoU<8D#C32$M7qAdE}fU<rA24MN&#QtbL1{vp3+oFZ*-e3e~rNfp*m4}A&@ zI(j!3Qt9!lFraMpjlH~~yp-B%osmEJQ{PL;wYu_#Qb{yI<~`cv%6DM5r<pd=o^<x6 zV>+Kp+z{t3oH}RxW%pA{q;3P4f@~O(j6^Vpx?5K+G*`8Dhz%bI7P*kVLXKVfLNjcY z)$z6R9}xGtJK?559Q;Y=Ifk-VJZ|#P)_a2MN*-S4E|BkMCPi;7s4$AQr_b%$B_CbI z`aZv2&HTg7W3uDEFIliyeD)3BvF=O+GUICgjGKpq$>sySipZ%jTpL`&&3DlAsCfb0 z^GoV8pYyVBF`g-<{d73+LZs&swjx71Z@QsMQfERM>_}*ga3D2sl#Lf+MZtITB|n32 z7|ctHMroWhBN?B(c`UQ}5pPS?BK6r6P3*hOO9eHBbpWtqS6il)Cc5G7)aCJ&O^kma z1sQ00o*+jnc$l$jKo52fq)LoKs(^4+nJBzHO?%f%y)NJjC;~}q1f!iIJQ59mx7smb z0wa~*3-SvKfG(bg<+Vfhw-e6Iq?I!AD_T1iuG;A3;C**nvWW!|))i+y&%ftxVr~6A zf0M;PTT0rm__YUH*K~Chv~=Ny`LEOG;i^MleP?AlgGD~-W-YbtZM@o_=4PGPL3{+i zNnJ}+ImRr}i5*QMAq+Npj$s$?jXEb;t?A7F2>6`}N>zFc12il(&+rak<*j3fM@yl! zLTb@Nfu^<t2!_7%m|oOvd8U23aQ>!WOP=2!Q=x(_!i>eq<tgcTTnV~Idi9gJmEXhH zF50Q~DgJJG>yZRQq#f4K6Zq^{-N41~kDribc~~qRl}SP0y3_l=n*&$*Pj6YO@}Plo z+@YgU&l7KT`&ZbvKLcU}*@&9^tMepfq5QG~Qq^9rxb<=9bp34-85=TquATt!L;27% zL26bCnbd_~Zs2o)RkqGl|3Nm1H@ws~L12{C$>&5RGu%an-?$%C%j0U*H4Q#XvX@=D z=%WPS(i+d?2kBRh^W9U%S9LjnqyehN4Tq-}SKf{cuFd|u2wU8cUOvHNH*&fbPZp=y z2HpGY?i#1Pks*t-s(z8T#PWmb<cfJ2JDFZ$<Z$<FR-^tCfhK12tH7x>?9}-47F!Rr zhk*x<>LBMZp5@o#(Ta3(B-mkkU1MH-Od*tt|B6s-B}m3HkMfw%eis;fRBrGaf+m1x zAwwIV+uw<q!fI?c{kQj`mzxRX3yGYtyrlB0!p`=aZRbCs%3(<$Up-{bPqjQt`keuN z&H4%(`agcxL6m6R4McE~gVp-ZO2h<%uJ4=joPS=0|ICy(ugw3=YaBnD<jNKAG5EK> z%$e4||1Nhn+q5qdpLN78ech6_eD5$%oQGUwdv%{UeA!Z7Te)YOKsVs=_pc!H*{0uD z)Foa&V|heNKMJWo^gMS!#;VF9=uTeW%7D}k!{haxzteF%Fe~wSZopU+&*7|?v>%*< zcjRSa^%wYXXcOg9=;+R*>|N(L{?5|pPou<;@0X|bYL6TijG&&9e7_?Pxy}b9J3BfE z=%bslfxRnhkK~8}y<}*D%xvEJy0Kg&nlkc1DT`Lm6m;*q=UeND%Pq*p{PD4m4=(FQ zn^&+k))R6kIAor4@K+aU@{#=VU-z_<q^ziYiq<AooenCKj^Uv)&Pbe~B~%lJUbtrZ zg88nW-W_6|u>Jb2G1y8IuG&I^sbadmGZ$)I4>89qFqZ=w`I4&PpjF#>;1n13y|XIG z(4~6xXiX>i2bl{b>6Q7+mPja+`Bq(<b@mAK#jSn1R<)v|5Y(Hx)e6{k`1IdJk0btC zu^TrHH=4{&T8{CS;m|hGej9A|o|*7q+ZQ5wcY0ei=E-hch2`eHM@qq$XZ*~nDsOy$ zUux3Q|0L|_3C%@(yZnakE$9i!l^%4oVkhngtGT%oX{FA9^h3Cco!lokQQ@W9<7Twt z1{QWhu64T^O9wq2?lc!I@_JP0{_<K?g~@U@xkt{VVYuHa_I-<DCbL1Gk6v_za~dL! z$rns~M;}#(ecmUnhri)F?mnb`a;7)$X5q}wix+ZI&XentmuPA}-QlK`xlgfI7mWI= z^8%~12bVu4V=}kTz?xtn0o&1_)By7kOi7jyi4B#&ZxC^t;N7xpe&Cm8fGyR+r=gzu zNlhW2uM>UKQLY?hvF`<k<Di|xC^#Ff+ftoArlJuT__eAAm<n+V>3Uf}^9QwZ>gQMP zL+N)oQ6W%p3E<hk+z<A-baIdfelz%-q-GNQs=hC}`EKjN)b`mh3y3rSl$5LkZ^mAV z<4|7AnefKPtQJzv<($rsH4%KpiHgPa`Ib#ktE~(cd@%Q!4+?6xefssFm%GcY`!QGi z>*akyu!9B?(}?=+YgG6`GW_-_z^-`4(&WStYhsIhi+(HPNiM!Cd1OAxFe7!vbSe0Q z<eB8{gtaE}@5NX>VvrgY=Yug!^~=W-91tF>S$8LA?VokqzL&W7h(lCu^@%I%DXiL> zgJ}wAR5TB9;sT%}pRIun5Yfhbs>hs^o_^)WSg0QJ$6Z5vuXQUApjJqa64rB!3ul^z zJ><@aC@_{eO;()p*RMCR@x?8;)3!gvZ1!fxyDcNyT!x24n1XU(zw-kR!s#!qO+2W5 zVzPiU<34WT1j?S}c89jp0YrY9B%5o3{Z}@i{=Om6YX8<+_i}!8y-vLCenAzsQ&QEm zEZ4!Mz5ct_=44<_=;Ecm$gO|&*k+UEwj<Kg6IYuk#%7+XR%e@4*0@O0;>{u+GT_sd z&ATHZZqRY$ZQwI7>M&qCtn+g}5Ef+Ga&>QSnw2nH)&nEeW5^tS9?iq?jO%uZdEfHj zXWewTdaf^>PD4DSFVnX+yL&(W-Y#a0m;sQiz323!lS>~HHwu*wR%}$yJgt%ydgU** zw9o%qjH?~0SZ*MPdU{maVCu_&CqE|{SbvA=s;ecmq88Jlmm&yYzriL3U$r>o;TJcM zGrIEosNr_e;N|JRcQ57e|JUAk2Q{6x?dsY^#l=-bfylCm1wo3k)V!dAQWZpMh)7%d zN(c}_5)pw_kf`(;l_oV(BLM;|YCs^N2M7=psUZXiNg(w^-}ijJ-#6c1XU=>xXXgBu z`AsJCB)Qvj-`92Bhi3(@`tn)70f8R0wa1qZ^EW}}MxSGjyv|Jjl~8S*d+a0{u=So` zzR!RAz*?Er9j^7Ey*d@_caGM~Lw*ugZqsmgIy7{EpjvBNxRMctGQ7aof@U2({5sQ{ z0;ma5&6~jPc`hw6a`_5JR_C$TqpuG9s~z-T%xU0&8g{8L1)2-;HGR5vaHa6d*QNdv z@47=eE-A9?yp?93V2Kv()E%XqoJ!a*137x)OiRPa$*P@kXP)2^)r`;z;W)?AcI!X? z`c<+8_)#`4+Z<6@Z{5rE2~N8g;dt49ro(RJU5BABt=++n)4kPYvSB|$2~Ml^c+oQ+ zU_^ALXoPGT$YG1231`eB$``|{ES583nak<DO&bI`4Q*OO3B4?hh$Cf$!WFE99~G~B zsM}d{`a5cB+rP&NiE9jG?AyP4Dh<<G790XnRYhE|tO$M+_F%PcxfYTtSudT3>1=Od zd9R=6-8YKl9e_nMm9|D{-HzFZukklq9E$>Tv~Thw8w2Rk&T=~2;F8C?hxC_`rXT6m zSBGZ6NT>tnj&6&p7mJi|gxp{0ep<Zb;0Jk__>#?_kh46bw_$N?rq@VtOC{zys8aXp zB0M6^kicNd3@$NFwD#ga8RV`ikZorR)`hRGNd_4lcT)Ujg%51^{jiPTIcdh#zhqLs zZ%~lzD0uxNwf^6(24vaNLEpXLLC(P+2l!Va-S)kv`7cfJ|Nm^;|IzOf&%VN6)efc3 zW1cH>dfgPxwt|As1N~_yJmTLmAKZ2<s+UZdlkQ;4$>`?^OC&1S^NraCeE52Qy>l^w z;B*-}hPxkd{C5olS)`*G%Du(R9G&4S4Xy{ggRLPSMmMRDO4|u{lvz`P>cH&#O;%Jv zHG=PRzqTslDcNV@;SUqaphz=f(6g0Gs$QRPA3KA1=Hz+iGfkAX>#+)hbDF|;z`YCO zDpL7Qs;aw}sm_OAe^q=PT^CR-xI1~4f9%(J|D4;vwIm(4nvnTv|CxJoY$(6ck^j}d zlk(ZxcQ1e1tg)0<9vV&Sz2Tdu<}~I*+uP-~`VO=rTBOQ^Jzg&8{SZn`>Ro@1;1}O7 zcYo8k53JEq>Ny!Pyj4g-A!<N`OH<t4Tx6(&i=(lUC5JtRiz#&d%-?tkE>||X+V~u^ zW_Hyy^&|mPXFRqw$_N$XZN=!+O`}MNWHj=>^V5`Zok2ubZpfs1!D*m!&I#Kt^9<f^ z;fu|6BbBKt)Mbqz(W&V_(vlQeNzF&s(cOD*g-YK_ZoX({)}&$cF}zDU{_{hxfMF-+ z&{4wuly`CzzfR+_l!T9lr*cT+I7!85TW~I<nquF#W$*~`XF;?J)8Q3qEtLxrDgyzs zxf{_RJKyxv(k?X$Y;adnsm4I}e4}ih$Hj%iDi|g-$RQLbj+|qgf(Xebdv!n4y*Ec? z#SN2%vf_c`6Z|fsodG<_YV0dMQZ`J{^D2I;)ixoza(4?Ey>VD&8s~s)6`TEbwQEgx z;ia1$2B+KAn7Ix=tb6oFfjB#Vg~~HEDvPWQ^Wr7uD}~><_LtTsV*an;Ucwq`*r@Nc zMzoNVbN;R5t1a3WgKc#g=xLq!SwU~C?QDzx+xf_R<X5l*^OmRVN(y?T70sw|0mOT# zM;a<?+<q$QGCQbL63EXa(#~6kjxONiIZ=iz*sGP(_&%ASk%%-`2ILf&sTwn{X;$c} za<z-&axfYLSX6ofp89@tx!rSuT#&4Yf7ndz-wr){g&&zVA>3kq$__-0ElL0M@L`No zPN2&s2%Z~H_1?fKKD)#ixpEfBQwOA}(C}A^8^r?ywh@|~zXRnAK4#GZVV_?z6I<P- z*~%3&%f`-j0tdMw@wuoCNAGc|kZ$v_Y*-V;(P&;2moxj`n_nHnnoIaNdM<=}S#>1Z zG5CC4&NHg)VH$5C2=<vj!ysUWYr46x9g_av(jhr*SaqO3SM>B&D2CnTI?HvY&Yk0; z%g`svzbZAIZx|A$3QYL@?dP)YapsTI42rv_mwot}j*ZCakK>oSA9i&imdC)0?~^U+ zYeU>FEtUIkRe?!<6kxYLY?SEf`zdPWMe^ubrbxZYj@XOLSN^Km4>ZO$grw`CAPL#Q z70uJRzvi=`Nl8Lvo7RLKQf-{Lco!q@%zZS$%;ie1yuUYD9^2%W(4lGU<751Vznm$1 zDz-*td)W=v&JjAZmmCqz<Xm0ST4PX8gm?R#{Z#8;O;Hx%>Ev`cp^W=D->2E|_N0$( z%4fkrUVHQvFxPSRJ)PWn1?34O%9o@KERCCw(1S6#qs>k$I2;jj!0m4a^MTY)E8ItJ zr27=sy{F_(BMv<1^=^nq&~$3W*|3pYxU%EeWb37d-C9(f(+PEjG~ZTe(*!f%ql~0V zjLtjAZXsE>Bmk$wY!_2o@<{jnAg#cs`yy?-qX}O_57-&+cseBI0#I-}3;dIGwxxMb z{`D1rc*`reoP3IH+%&fjE{JJk9A125nNRMrV_|I|q@9T1vm#Ib7S;TW<VkX;4qQ|~ zaLEmI(+bXzF{n^PwdoxjfmPQIvYoy(-hpwP7a+fO3C9)K4m7w+$rN@bg~`Z<<-H@_ z=Nm0N;;CJ4-t&h05l{h{;;NYtjrhK${N~O-6{(YNPbZg0(el<GWoN*5O>F3kC-wEd zz<{`^a?cf}X3YG}Vu~qdh(rLba1h`DE1XRny|9Cj_iG3DV-M!M3tsB)C4N!1@fzW0 zAD}nSIMXH`igTB3rybSGqno9(>q(_JBkbZ!N^Ux%{y76G_uj}BV&#Tu8gnmCKTO+K zL(n}RtLKx?l;z2Xqimbbg$TnclGcSv?Zb#f@1Z}~dcJdvXj=%`990r+c4C5fv9~eH zk0z%Vt=qY&=rc&0%;kF1Hv!hH>>C5~l$WhiWz3(3Z4IAA<~w64_NaLnCsse4o64x= zz(!}7;^-P0x+7ZkKrJnIhI<oKWBH++0j>G1+GZ(J+#3jM=&uK8=es@;!Wcpk=={lH z_`K0}>j$<KjT%3H*@;N@iW2wlW;OoRuJj{F8yna4X4JtcUHkaqE+$~7NgUQiw*Mn( zQmqn%H+XBj_`9HiX^s)@y1D0<4-uVCPy?ZDJ-X<QwRTx#UKVY*d#Rhh2Gt7MP?%Ex zsV6Eat!WtD7hmg-FLzWaCS29%liko_dzOpwmRKzB%hapZOt7&^J%m_3JFKFynI(0$ zY9&a3>y`bYsfAx9)+}xkWtwu`IB(+kFR1Ck;6-mR-oK&JlY38&PM0Byi}WVJP@+4^ zRM>Vt{gS^z)giYu^dZMCVbm$|`{rf94)3Ks+~u^;tBjINm*9)E4|}M?1!+FQW6Q>p z9^g_DYv5+FnAdEVTxj$c2i=(#Br^!Sx0_c8EgFwEW$sE_rURO7&i1U`<V)z=YwyZN zSOqiZdl3a@=;wX`<6jFhT_P0Tyn%GHWPSAHQ{czc(-Zb%o{!rvWtOuhmguhF=ms(c zJ+$EnOjmZGrQOQnpjn=p_hTl<!4W7#bSOvzrB)g6q*ppJ0=Fy5NC13zMM1f?XRPMs za?|=v_O1HLCAYVz%xspm@M3f8deGuU{tf8^26u#q9jNRJe0CAnZ${f+&vQ0zW`va# zV_yTAG}i0)zHr8;^^UC0X-EB4!NJizx*JezZX_a4=Z&XtGPUTkb3uk<`ts@a<vmb> zRX^W^nNv<`oMtSY6Nth?FumgZ!yI`oP-9XcNvbIB?NSzl4d^!FmT?p8>0goT69<PW z?*g_QrHz#%=;9{z--_f}&#<-at(2nmR`dy<mf`z=nI6l^ar4sohv|&yeeeT6Q95Ag zF!yfXVS*#8EPUiFr#knK3Dru{@iQXtEb0<;^+JHby(Q?M_2;1qP|Jd*R)SOb>3p2! zvFJ%Y&+2(-vWtX(NF^BGS&2w4<+HyC?wd6*?CvG#b{BUn)fYN0mI+<#<~`PH{~mV~ zQ9AFE_Dx<&XN_N?54x*DHUQ9fQ=a;loiPq1dK-$m3}72;&c#^3x?v$YOoyq9{iul! zL^_WorLrKX{+Q=fI(2^d$Z!J@Z`0-4G(2A^jNA{As2_j!^35Br9<O(52_D{h&2he$ zho4GUS%OC4RIhy!xb(?phw$;Om&Rd742xRs=FGx9Ipnk<q1PG#<1=aNL6GLfZIVt3 zKuY|^{2)Yc<4aB~VYLES&el1L)l;DdD8Hu<Fbjfs{J(_A0#aHg3pq39*p78*-JtCo z64bQlO3!7+ZRLkM=ka+h_c4eBaYIW`0WsQfE-;*6KTf>(bKM`M^FD77zU~D|gp-dV zrE85-K!ceQ%`OA&=F>+Z$b+1w>7s%fzgk{!*5~FrPDjM-m>K&-AI*flRmpk$GiQ^} zO=(p4V&L(Y&?l4fF|ZWsF6Br|-&H{T^bo|M-)W6d#HQe6LfA^A3$;O|v{viH47jkh z!?r6Mo}y&)iH}O>VoVU~_xk>=x<yL|u|B9-aWBMxol<aY*@huN-;FMf2adyHVh+Gq zPJGXeD;916nvl<&s#ZkR5qcb1Uvfrdk>}u!QXt9gCkiF3`-{Kx%dj^9SiydF+>vtc zCnd8<Tc*oGOO=kgmHVKD{o{_@DyzopuzTL?*km1X#@w`2;vIXGSU<B0C_^0PY03^w z+LXNn1oDXOj8L)#<*1h=A>M8xd@b30W5WQ@K3uCMPjKU$#S;=9PSYe%rpltjw4Nan z`jD_DiYfiJoi^fYyS0H7Y4zTf_|JQ=C1b#|{J)KDL@PUX51}Jz96EbdwD%A!X&Lb~ z#G@!Hh{cSRIE*4Y_VPk>=Z3NyoL+*1e+;^TYJXoZ9lT06?lZZB?O#f$LJTe^q;j?B zh9}Y@jpk}v5!mg$VkFNm?o5V6byIUB4giVnX$%_0`buDaxPw(+|A;dKD(?GLx( z&`-^_SYo8|XJpzU2#<_*$Iw5w_7$T;;>rD~-f<Jj%4rdWY6g)AH#^d;MDgg(R`;R# zS=#Jdkcqx-_b>I8^^a59#vP}=I}g2{F1@!WPOT-G6Eu%DvO0B7^uUx6!3AgM2vc~9 zUUS+m3|+Wu3tw;9*KcXp=*yWRCM(3;%qNeT;!gpeH;|>jU<Msyx%6_}myj1S6O#z! z{o=Umm^P+|b0pBwj+^p<kIW7N?y53x<C@?C>A}g4eGze|2oNJGFB?{(M&)KpvBo>M zpnkoBd<Dx}7-fhdHtr?Gzf9r`HLWEFC9WXM_rc?IV*VP|nhhp9{W8)}gtV=lOPLUh zAlhFE+SprMelU;uHH+3!F<X*r?gQA>;`5?sD-Fkd$bn_;J^PT{{pc;GS0wZbE+GKm ztw-XcnT}S^7DWd%>1m=CwV_7u5Z6!K5Tnb_#LbsjmYm~vlONNK^jUn{Rbvtdv@h2D zM@uZ{?A0|?JF8X^MSUbwQ2Vs?^-l0r`<{%xJuhUnm)Visx~+9&To(HlFiDb_OjcU2 zhr09%dJ$R{z2w>{5%k8YaA98)Hk$ecqb`&t4M8u0-yV_WRRHWwdOz6j65h2$#pp%? z$9wQw>gwZM74@Vz7x6|n_qsN=O&C<H@Ky6ZPOB!%lNGTfkSr;$00jE&d0;yR9J#-K z;B;VNu%rTKN>iQ@JJnc(w)PIAK|Q;X{ug+`Z6D+-678!XWP@&evyZMloy#E^WC-){ zVnO!-L^2<f5iC-wzw^{q-n<q;YKFdBzraR`AFs@VMMa?X*#3y$)K6@p6U4dKR~5)@ zGYh~yfm7Tkw`01kw6Q}oGIyU5PeoD@vg1{XX|kfZLvq44?KzEMHuzK2X2#J_gNNyr zOiTV$VbPdu3{hv6{bDA3*Nrjkh@lboxegVxmHQSPu!oUz2-5#aVf>7~p`4NX$}M{S z0Q(Iy*Lt-Q7ePyirmZr8DhtQmja*c?3wI#1IkVS&8)VC6-jPbXwKnR;rYt45EW-79 zQNVqO(g3P@Oy!T9nl)q9UOb-zX%K#$<R(90#;T8vOd2Y#f|Q;ybLA#@JkGUDidhx5 zJC#z{;S#>yln6DT&O56!St3Z#MPiSd#t>JBj&3n4WePo8tK2p6flI3)0WY|@d-WBS zIC&uku{7<!n-hxQ*lN?kA&QmVG{L%76g6(e+TRKYR6?Wh)GUd~jfG^_qhC~_>(E8v zoa0a%L#5#+TjxqT$TZK@hx(9!azz!+tQ@MY_pg{2cEE#+ra0GYrE3w6e@{zxN&IW3 zq5%MmOQyQ18p!Qh$e3Z!s@JAzNv1}094(DMEIUfw_@GAvXY;dKa}Nr(Gx;9VU=7!4 zbnQ+!f{ovqD&7;bbv_a*mJZ(%X`N%Bw+AQy%4+A2goC%{=EX1M-&vcVx96qV+zHLf z2WZOe60B-nuy}|}@}`o*9TlsJHx%ekT7=dKF5)oYZp45*x(#sBXZ#i5NP-^NeuP%_ za?AfLJ!j?jqHjh>4)Z|Y%0?6x(QMoKL$!j@vwm-oro|KV4cR<ABWC^yN<7s^Y0>Ia zRSl<$7MPYBW0JeM`(ko+7B}-;0RGhqGnFk3`(~J*BYlc6bpJe`5$dH7gu$B+FU;H4 zE35R~DqUrW$^v>1-_Z4q#1<QKDQEe*@3&+)$9G~Jw_~>?y_QZNc=U5k>CPAWjwpuc zTYM~kn&_QMIKI%l_AyNM5<wFvFeQ9kuK|5BmsA-qn6wOe@!zR%Y6UFHT{%`yb(s>p z3K8(v%XE5%xqFh7(tX5EM6aagyG$9fXrItI8!sMc(YQgmHFn!QkoSQi+YzAs)c5Ci zBtPSbjk*=e-Au~E;JBQHr~&-pEW$Nc4)f_4&~cyw-pBVF7p79VCYBtiExb8(c^?1b z^Sk({-Z(^%7Yr1Y3ESOFJ2M5{A6dD3Z!|`loqsvgvv@=^gXzaO?_GgM1=fqLwI=m^ znXzLwmOU?Le!fR5YBt+Jn!U*M@B!{th~1zw_Zqei$jcg4`nu0G=Uw3b_R*&1To3Z1 zDYDqRC5V;l=|ST|-+ZB)QvRIUAw}#ADqyAnZmSYq_d$b;sFy$RlEMk-#fyE^$zm}( zZB6KV5tDda=0CL!ToG&Xvvlm`o9P-AF<?BXX9lk^X@3Vy&DXs0(@xR5fu4+;6!7Sy ztuOMYsJzp^@0cbdOjkGwKp)UUQP~;RE?Ql8LkUFm;u8>L1N_~nM*N4xethQ1FwBPv z&rjeT_-HTojX(rU`nbH-5U&JGFwchVS_#o+^r0UsQ@4(t@kR_PlngN_^v`+fUo}6y zZ5?EmOe3<L2$Q-jA-*V!KFXVyofEWFW8st5X)ADd1#)dw1m-2h7e8Y57$zNr%30fC zNC<b3-EHXR@+H-Ndz;uXjVwdnQo2YSWrt#NZbp#@)@a=^+t_NSr<g@A?aOZLc9w zhelWHX_UD$tu@%&U5o0-)9|32kECjg9ahbsriF_C_@~K@A7Yf%Rb^f99MUVMB@P}m zWjxoCPTcB9tRU*Je3Ma4R;wJgYDIO$GUOEWpLVCjZE@_RWZ#3*?bRTPCv)`UbH;#6 z22aIL|Hj!&36HEJl<$gnF@0r?obJy?SOYif7dhtBn%0ntjk?D(^6T|?#h)MTv$5g= zxATcAGneCdZZ~RI9EZ8dVZ`6>0=*}3+iQ$eCucsBpc#F1I#o6{GN`bbwpo-{Qok&y zm+*7qnQkY0G`j`Dwhw+W#$2M7H6wxv-f*QJ8>*o;*?6E6LL}B!{BY`f?92H`W4M;J zA#!|#?7FU?3VVJ)h2XAz&Vq-Dng=)b!q+u&6!jPfo|6;2>x&#p<$+=@GFdUDaDeBw z7aHt69uDt0I;fDPn$)m~zVVR-q#Bz|{ae)20F2L>jxn^(xyrga6W*TYrCMuClVyzu zubIUI{ImVs^Tx%2tD}3z2)~zT^=3=e9?TEaUDUmx`V-IWGWhlm-pWDk(-v)n69UPS za}$l&P2_v8UpADL-vK^Xc)mWvd)V&8HMacON7x};y}|8JS|!G3g)b0)YZrB25<4l% z6;*`bXHxOPD5K`VI72fzq}%tXrc*6wYgJoL86Q(3fyIK51-j^s;mM0H%V5mV-fl^$ z2WjUehKV!JeC9;><MtPa_>*}FhD0GXZzb}OTkpiB#Bnlr6MtXuW@TTaZ)jSHl!gK) ziS$cki7P=dSHzl`jXPIQsG9ki1HHV-#ea)$Q^J!g(Kie<0JVyb6Tdbb77peZPv)_? z8s~??&&)ln%O*uA`goB$s76nO_;7`sHsQ%H+NzBpKT+9;SkIq4$Uh<1qvz2QJ{jA( zr$+qX@0~yS{JB`2-`775EJdv5u#~$q&x`>r?YZDpB&SyWSup~zhLJVP_LT5F<maDZ zcYO%^Tr{QaLYc@AntBy8pT077tbp1sx^(3lWKG$&@Xt<gO|VJyszNyEkpV^6Oh37D zN%tMslFYZ>Z$y5;jD|@z5b@#Tcaxn*nSMTMSDVs&h^GS-Qd-d!L6(cf>R&U@ICDXt z0(68C>pe`5k#+lz;Qa=tpNQqJL)<p%NX;8uVJcTvjI0hRS>9tlO0EmU1x-QJ-Xpc? z^8mieK_i<)ZRW-KJNTg5MP?k{QbXa(CQw;G{Efv&*B^8S^T!CPzv}#35Tjq=`%^6% zX<>3VRqBak%Vj%E8G82pXT(6C530YH6E`d>Z?A^vS_Whwk(e-fY>INYl&o0xA1q~+ zS&in2T$3l1tSwN>gepJ*oN<Eii1$Ul?GXAS2~;xD??Q8;oP`C{y7=-lp0gd_RK=LE zf8SmJlC|rRy;q;?`NX?-4XqNsRra3bazVooRlfu##@NqcFR`b23K>HgPW3?wO|spi zWXa3{eY$m{Sn%u?t6%o$NUq)BJAz;dkWyfVa?GDZSQu*&N#opraG3bq#X)rOZvo>? zC_H&%3+@n<;sO2z^wu>GutX@&AX#1+i)>`LrpXbl`>4;>l}W10ypoC(a6ACk4&2N7 z(@JIotqoPTs!ENwUvj%hz3=WqAL$~6RW{p==uY0>f8_NUkK|kNfcuMF`&DCWHQIqE zrS2IyHd&B$|K;Yb?y>%*`fRqqI!pXCdeRm65_&h#<qF7w=p>$H9IrQ|G;cIKJ)v#3 zawAs?U`d|?NC+6*W^i1Tb?ys)A@b$?QOkTsE@~3+`jH{ge#&yF@s&n!RV}w=Ydf|9 zQZ>%?;}b@@dBGM^`U+l27BC~apLQ5Ol@nbf4h7}m@@IZt|EIsq<!<t{2VT;M*m0Hx zZYuwq@9Z<)U3#wx8EDMf@crOWuUK7m+1cLEeI*=xS08UTR{?jm33H|@81Ng^Zt>~J z63eUNsD$xDAFQ}D6Q=HLe0~8qLeddZMj(kp^t;y8NyGD1^vvC@s=TT0n!t=jvCx&= z>B=K#49@@*Xlf9V8Pk{B;LO?pPn_t{d!-S%2ni<P3ziJ)@>%_*IPbxR0#4j5F5sq9 z*vmigS0S8NV?=)iu}`(m8|Go&rJP9Yc&=OcC(%AO;WHIw(Fcq6nninC7mTmG-`Yyb zj)+hHAY%P}9hCm+U;f$aRw%5R07oX27-at=i=Z1XaMQb0$<0F?*q~dW_T(6jNNAIj zwn_x);?6Y#ta8t{9>tZGxzq~m(?F)~_8xj05}-|k_3|@a#P>>0p1-hJpKY4wIo5h) zR4~6HaobF$ALsY$kI9C7?elu4U(^Rl+GN#JC)x9OecejRTNmKGP-!~y(RhT2Q8%Bm zK6#1`�s3QksXPqZ{!Lx$(0|8Z*RSR}GYPd#e<eRJ5emm_{R3Wh%|`Df2MgOKC& zS$P~HXe27ZNHi8qwIdwyp@!)99oVmmU-Igbf)13?d~<`~J(KrT-Z!QNQ{|(^xW~G6 z*m88~dHduWlE%a`CUGQUkUBB1xcli3_y$baC+b`xULK>c6}09;e7dC)B-~$@<u?_u zFHObLzDDSNTK0vU0ntLOx}BH6Qfu;QyHpo+fCV=}=yCV*Kj?MN+S}2m<}_!#KOLbL zI-r!p#Yf8$*#+-K0m}1IYyG&{I3^Vljuw?!!Ij2rtA4Ia_8-eRrq8!v(7O`7Q;s-| zJ>)nC)DN3CxF-+J<2n89Y3s3FHh}jd)vh(<F~?HioYvBWic}b;H3|c4IA1OOZ3wZ8 zq&2h-rMOl4p(<SNnV%m<qgrgbPJlKa@qYFbAFlIuN2&Dc!@M@1%L-yI0*LRgVX(ut zokAPnygy))CG;&+nv^b1Wm`w&n#P~881YQ~Z0^Pr{?cq~1biZW#~D#pKAX&2`aYN# zc!hlLZG?)QLn(u~fKrNob%Z$g=KP4X8*6~t@Q*yW>SYZZ`R@L>CAYoD15OPEm|~i$ z{EE|<DarOZ-cL}%j@+5;R0Mm|0!}N3G*~ciPx{;R&bywUeRSz@0#x&z)3MukKGk|G zX@+pE73D~(bS!uHG9PpD3-nlI)o2aDar0nqMxH-xP6+EcQe%&`!m~L{+Tr=c^r!<5 z7lK0bC_KdK9~k{RRTMjlvG$#Z^&u6M0qGG1>qGbGVCGxuD~<`n6MTtfl?qWW<_jD) z!i_dA&~uxEl3LWC`cGAPo)F|Oz%{xXKpZ`fr*KWPkH}VwDc*JQrOIzr|87ub?^f>3 zss>6a)FQcFljkb^2I_Bbe#5AkgPE5;bHHF4>f$rTf7dQle93u^WI|f)cQP=`%#+(O zySC4-ne+3XC&+k8FHl}UZHkVrik@>I=C*VsBR=|q6aR*7!3z1$U=^>;spCtK4^tYC zxheOcR-`gk*Knxv5c1Oo;$mJdfi-TLOCKB29SR_&uYDUqWW^h+cX8v^)}M(DLgFc9 zj-AY%E`5y#nV#v3@a(~-87Q@jN22vnk$0K%*5)9Z{RXTAU63`Nz7pv*7GXlonrkvC z=3X=>2E&_AvNi)tM=*Lzf*Y`wrk(j<zvRUH%X--I5$<Vj1TGekGu_u}*y8?J_>yLu zkAO#-{-QF7G_XUO`&*hY{Bxozfzx^v#dQ?Yhkx){FjZ!Q{~#*=(EVk&d<^lo4n8`4 z3vvq=Y>)AUv|M<h`TGy3VInVqW354#{qmeq00O4NPdk2cC4u*4*NC!Vx5ryw?D<m} zWCXuG<sWT8)c+vOa2+1LT$&$^=^2|y-%Px1A70*-H0l3qi;gVgPlu^<mJlVGce6$N z6t*Wx^rL?0HEpFzHuv5Y_8nMG!P$$CijLHzl-F$g({nLV$gPqJOe=J4Uoalk-23QE z`*N_YaI$|}|3CivsqNb)#Q%_9!e~i^q?cRGK<_N|We`_gQM<rK@T3wfY+KvG&^r;= z?A3;&)Q*+VpO*u=ALD($Dn`)6od=bk5FLbEnT*P6rOjybFbN2C^#_3M+Xm*O!z$V+ z)UXYvIS0+-k#}#KI5S1)cgU*VamS)#%qn)zDP;+83SHDNDoWCDKU-M^%-!}{vfb{% zf5Vade+drqO+7&@Ad3V4E6(2RU)-+L1^UWL`hNq&|M7;Va7K165H%J3K>EOeQSLv% zil;Ce&<v3X2~jWuqaSO1tLn@odwh}(@M2xXyB-Bwl<~h7{s+xa@?zbUhfgGkWZ2uT zeFH7{zyHrny<aZfd-6}=ux~W5Z_Vu!n*Y;mwr`-g|FL7Fic#?Jn>)50cz-boxO6g( zt>C)<$#-0m)RAj;r;mJ>`EtrU^Fk}@yF^>t-&dcfcKwrGdF=F)LaWo?S$J<R-ulg3 z>$^zYgSf}Po=tiD{r^$3`sGHJ)prcuG;MN+xArZ`fc(IxZ=ZkTn$6WJ)4LD<7n0XE AYXATM From 94b87f8d9a1a38b6e5440fb48e1b27a5c627af21 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Tue, 12 Jan 2021 15:59:16 -0500 Subject: [PATCH 07/38] ui: Remove unnecessary call to getDefaultPaneParams() --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index c418a20c6..e303a6bc1 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -113,12 +113,10 @@ class AdvancedMultiSelect extends React.Component { disabled, readonly, multiple, - autofocus, - registry + autofocus } = this.props; const {enumOptions} = options; - getDefaultPaneParams(schema.items.$ref, registry); return ( <div className={'advanced-multi-select'}> From 73dd8ddcc97da1156fa09793051ffec6651d8d40 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Wed, 13 Jan 2021 07:35:03 -0500 Subject: [PATCH 08/38] ui: Minor readability and style changes for AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index e303a6bc1..5dca8e86e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -41,6 +41,8 @@ class AdvancedMultiSelect extends React.Component { constructor(props) { super(props) + this.enumOptions = props.options.enumOptions; + this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) @@ -52,10 +54,10 @@ class AdvancedMultiSelect extends React.Component { } onMasterCheckboxClick() { - let newValues = this.props.options.enumOptions.map(({value}) => value); - - if (this.state.masterCheckboxState == MasterCheckboxState.ALL) { - newValues = []; + if (this.state.masterCheckboxState === MasterCheckboxState.ALL) { + var newValues = []; + } else { + newValues = this.enumOptions.map(({value}) => value); } this.props.onChange(newValues); @@ -87,11 +89,11 @@ class AdvancedMultiSelect extends React.Component { } getMasterCheckboxState(selectValues) { - if (selectValues.length == 0) { + if (selectValues.length === 0) { return MasterCheckboxState.NONE; } - if (selectValues.length != this.props.options.enumOptions.length) { + if (selectValues.length != this.enumOptions.length) { return MasterCheckboxState.MIXED; } @@ -107,8 +109,6 @@ class AdvancedMultiSelect extends React.Component { const { schema, id, - options, - value, required, disabled, readonly, @@ -116,19 +116,17 @@ class AdvancedMultiSelect extends React.Component { autofocus } = this.props; - const {enumOptions} = options; - return ( <div className={'advanced-multi-select'}> - <MasterCheckbox title={schema.title} value={value} + <MasterCheckbox title={schema.title} disabled={disabled} onClick={this.onMasterCheckboxClick} checkboxState={this.state.masterCheckboxState}/> <Form.Group - style={{height: `${getComponentHeight(enumOptions.length)}px`}} + style={{height: `${getComponentHeight(this.enumOptions.length)}px`}} id={id} multiple={multiple} className='choice-block form-control' required={required} disabled={disabled || readonly} autoFocus={autofocus}> { - enumOptions.map(({value, label}, i) => { + this.enumOptions.map(({value, label}, i) => { return ( <ChildCheckbox key={i} onPaneClick={this.setPaneInfo} onClick={this.onChildCheckboxClick} value={value} @@ -148,7 +146,6 @@ class AdvancedMultiSelect extends React.Component { function MasterCheckbox(props) { const { title, - value, disabled, onClick, checkboxState @@ -156,17 +153,15 @@ function MasterCheckbox(props) { let newCheckboxIcon = faCheckSquare; - if (checkboxState == MasterCheckboxState.NONE) { + if (checkboxState === MasterCheckboxState.NONE) { newCheckboxIcon = faSquare; - } else if (checkboxState == MasterCheckboxState.MIXED) { + } else if (checkboxState === MasterCheckboxState.MIXED) { newCheckboxIcon = faMinusSquare; } return ( <Card.Header> - <Button key={`${title}-button`} value={value} - variant={'link'} disabled={disabled} - onClick={onClick}> + <Button key={`${title}-button`} variant={'link'} disabled={disabled} onClick={onClick}> <FontAwesomeIcon icon={newCheckboxIcon}/> </Button> <span className={'header-title'}>{title}</span> From 8d024b900248d94cee76ec79f0dd66befeb7efbf Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 14 Jan 2021 08:37:52 -0500 Subject: [PATCH 09/38] ui: separate MasterCheckbox and ChildCheckbox into their own files --- .../ui-components/AdvancedMultiSelect.js | 65 ++----------------- .../components/ui-components/ChildCheckbox.js | 30 +++++++++ .../ui-components/MasterCheckbox.js | 41 ++++++++++++ 3 files changed, 76 insertions(+), 60 deletions(-) create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 5dca8e86e..9d82a1b8d 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,20 +1,13 @@ -import React from "react"; -import {Card, Button, Form} from 'react-bootstrap'; -import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; -import {faMinusSquare} from '@fortawesome/free-solid-svg-icons'; -import {faSquare} from '@fortawesome/free-regular-svg-icons'; +import React from 'react'; +import {Form} from 'react-bootstrap'; + import {cloneDeep} from 'lodash'; import {getComponentHeight} from './utils/HeightCalculator'; import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; - -const MasterCheckboxState = { - NONE: 0, - MIXED: 1, - ALL: 2 -} +import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; +import ChildCheckbox from './ChildCheckbox'; function getFullDefinitionByKey(refString, registry, itemKey) { let fullArray = getFullDefinitionsFromRegistry(refString, registry); @@ -143,52 +136,4 @@ class AdvancedMultiSelect extends React.Component { } } -function MasterCheckbox(props) { - const { - title, - disabled, - onClick, - checkboxState - } = props; - - let newCheckboxIcon = faCheckSquare; - - if (checkboxState === MasterCheckboxState.NONE) { - newCheckboxIcon = faSquare; - } else if (checkboxState === MasterCheckboxState.MIXED) { - newCheckboxIcon = faMinusSquare; - } - - return ( - <Card.Header> - <Button key={`${title}-button`} variant={'link'} disabled={disabled} onClick={onClick}> - <FontAwesomeIcon icon={newCheckboxIcon}/> - </Button> - <span className={'header-title'}>{title}</span> - </Card.Header> - ); -} - -function ChildCheckbox(props) { - const { - onPaneClick, - onClick, - value, - disabled, - label, - checkboxState - } = props; - - return ( - <Form.Group onClick={() => onPaneClick(value)}> - <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> - <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> - </Button> - <span className={'option-text'}> - {label} - </span> - </Form.Group> - ); -} - export default AdvancedMultiSelect; diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js new file mode 100644 index 000000000..353da4b22 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -0,0 +1,30 @@ +import React from 'react'; +import {Button, Form} from 'react-bootstrap'; + +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faSquare} from '@fortawesome/free-regular-svg-icons'; + +function ChildCheckbox(props) { + const { + onPaneClick, + onClick, + value, + disabled, + label, + checkboxState + } = props; + + return ( + <Form.Group onClick={() => onPaneClick(value)}> + <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> + <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> + </Button> + <span className={'option-text'}> + {label} + </span> + </Form.Group> + ); +} + +export default ChildCheckbox; diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js new file mode 100644 index 000000000..0485e64eb --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js @@ -0,0 +1,41 @@ +import React from 'react'; +import {Card, Button} from 'react-bootstrap'; + +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faMinusSquare} from '@fortawesome/free-solid-svg-icons'; +import {faSquare} from '@fortawesome/free-regular-svg-icons'; + +const MasterCheckboxState = { + NONE: 0, + MIXED: 1, + ALL: 2 +} + +function MasterCheckbox(props) { + const { + title, + disabled, + onClick, + checkboxState + } = props; + + let newCheckboxIcon = faCheckSquare; + + if (checkboxState === MasterCheckboxState.NONE) { + newCheckboxIcon = faSquare; + } else if (checkboxState === MasterCheckboxState.MIXED) { + newCheckboxIcon = faMinusSquare; + } + + return ( + <Card.Header> + <Button key={`${title}-button`} variant={'link'} disabled={disabled} onClick={onClick}> + <FontAwesomeIcon icon={newCheckboxIcon}/> + </Button> + <span className={'header-title'}>{title}</span> + </Card.Header> + ); +} + +export {MasterCheckboxState, MasterCheckbox}; From 11ea5e1a7eb536628bbd6521ddc8cfc336df7d4d Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 14 Jan 2021 08:44:19 -0500 Subject: [PATCH 10/38] ui: separate json schema-related functions into JsonSchemaHelpers.js --- .../ui-components/AdvancedMultiSelect.js | 23 +----------------- .../ui-components/JsonSchemaHelpers.js | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 9d82a1b8d..efd516813 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -4,31 +4,10 @@ import {Form} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; import {getComponentHeight} from './utils/HeightCalculator'; -import {resolveObjectPath} from './utils/ObjectPathResolver'; import InfoPane from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckbox from './ChildCheckbox'; - -function getFullDefinitionByKey(refString, registry, itemKey) { - let fullArray = getFullDefinitionsFromRegistry(refString, registry); - return fullArray.filter(e => (e.enum[0] === itemKey))[0]; -} - -// Definitions passed to components only contains value and label, -// custom fields like "info" or "links" must be pulled from registry object using this function -function getFullDefinitionsFromRegistry(refString, registry) { - return getObjectFromRegistryByRef(refString, registry).anyOf; -} - -function getObjectFromRegistryByRef(refString, registry) { - let refArray = refString.replace('#', '').split('/'); - return resolveObjectPath(refArray, registry); -} - -function getDefaultPaneParams(refString, registry) { - let configSection = getObjectFromRegistryByRef(refString, registry); - return ({title: configSection.title, content: configSection.description}); -} +import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers.js'; class AdvancedMultiSelect extends React.Component { constructor(props) { diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js new file mode 100644 index 000000000..06eed4aed --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js @@ -0,0 +1,24 @@ +import {resolveObjectPath} from './utils/ObjectPathResolver'; + +function getFullDefinitionByKey(refString, registry, itemKey) { + let fullArray = getFullDefinitionsFromRegistry(refString, registry); + return fullArray.filter(e => (e.enum[0] === itemKey))[0]; +} + +// Definitions passed to components only contains value and label, +// custom fields like "info" or "links" must be pulled from registry object using this function +function getFullDefinitionsFromRegistry(refString, registry) { + return getObjectFromRegistryByRef(refString, registry).anyOf; +} + +function getObjectFromRegistryByRef(refString, registry) { + let refArray = refString.replace('#', '').split('/'); + return resolveObjectPath(refArray, registry); +} + +function getDefaultPaneParams(refString, registry) { + let configSection = getObjectFromRegistryByRef(refString, registry); + return ({title: configSection.title, content: configSection.description}); +} + +export {getFullDefinitionByKey, getDefaultPaneParams}; From bf6db078a6d2e5fddbd49805dbd3f8ade9f6a1ff Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Fri, 15 Jan 2021 08:16:08 -0500 Subject: [PATCH 11/38] ui: add missing semicolons --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index efd516813..56658cf71 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -11,7 +11,7 @@ import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers. class AdvancedMultiSelect extends React.Component { constructor(props) { - super(props) + super(props); this.enumOptions = props.options.enumOptions; @@ -37,7 +37,7 @@ class AdvancedMultiSelect extends React.Component { } onChildCheckboxClick(value) { - let selectValues = this.getSelectValuesAfterClick(value) + let selectValues = this.getSelectValuesAfterClick(value); this.props.onChange(selectValues); this.setMasterCheckboxState(selectValues); From e04e11e4ac87967f0a0f2cef0839680001dc87d4 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 21 Jan 2021 15:07:19 -0500 Subject: [PATCH 12/38] ui: add "reset to safe defaults" in AdvancedMultiSelect If the user selects an unsafe exploit or post breach action, a yellow warning button appears that allows the user to reset to safe defaults. --- .../ui-components/AdvancedMultiSelect.js | 60 +++++++++++++++++-- .../ui-components/MasterCheckbox.js | 6 +- .../components/AdvancedMultiSelect.scss | 6 +- 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 56658cf71..508bafa83 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,5 +1,5 @@ import React from 'react'; -import {Form} from 'react-bootstrap'; +import {Button, Card, Form} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; @@ -7,21 +7,45 @@ import {getComponentHeight} from './utils/HeightCalculator'; import InfoPane from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckbox from './ChildCheckbox'; -import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers.js'; +import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers'; + +function AdvancedMultiSelectHeader(props) { + const { + title, + disabled, + onCheckboxClick, + checkboxState, + hideReset, + onResetClick + } = props; + + return ( + <Card.Header className="d-flex justify-content-between"> + <MasterCheckbox title={title} disabled={disabled} onClick={onCheckboxClick} checkboxState={checkboxState}/> + <Button className={'reset-safe-defaults'} type={'reset'} variant={'warning'} + hidden={hideReset} onClick={onResetClick}> + Reset to safe defaults + </Button> + </Card.Header> + ); +} class AdvancedMultiSelect extends React.Component { constructor(props) { super(props); this.enumOptions = props.options.enumOptions; + this.defaultValues = props.schema.default; this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), + hideReset: this.getHideResetState(props.value), infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) }; this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); + this.onResetClick = this.onResetClick.bind(this); this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); } @@ -34,6 +58,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(newValues); this.setMasterCheckboxState(newValues); + this.setHideResetState(newValues); } onChildCheckboxClick(value) { @@ -41,6 +66,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(selectValues); this.setMasterCheckboxState(selectValues); + this.setHideResetState(selectValues); } getSelectValuesAfterClick(clickedValue) { @@ -72,11 +98,34 @@ class AdvancedMultiSelect extends React.Component { return MasterCheckboxState.ALL; } + onResetClick() { + this.props.onChange(this.defaultValues); + this.setHideResetState(this.defaultValues); + this.setMasterCheckboxState(this.defaultValues); + this.setPaneInfoToDefault(); + } + + setHideResetState(selectValues) { + this.setState(() => ({ + hideReset: this.getHideResetState(selectValues) + })); + } + + getHideResetState(selectValues) { + return selectValues.every((value) => this.defaultValues.includes(value)); + } + setPaneInfo(refString, registry, itemKey) { let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); } + setPaneInfoToDefault() { + this.setState(() => ({ + infoPaneParams: getDefaultPaneParams(this.props.schema.items.$ref, this.props.registry) + })); + } + render() { const { schema, @@ -90,9 +139,10 @@ class AdvancedMultiSelect extends React.Component { return ( <div className={'advanced-multi-select'}> - <MasterCheckbox title={schema.title} - disabled={disabled} onClick={this.onMasterCheckboxClick} - checkboxState={this.state.masterCheckboxState}/> + <AdvancedMultiSelectHeader title={schema.title} + disabled={disabled} onCheckboxClick={this.onMasterCheckboxClick} + checkboxState={this.state.masterCheckboxState} + hideReset={this.state.hideReset} onResetClick={this.onResetClick}/> <Form.Group style={{height: `${getComponentHeight(this.enumOptions.length)}px`}} id={id} multiple={multiple} className='choice-block form-control' diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js index 0485e64eb..b5a646aca 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js @@ -1,5 +1,5 @@ import React from 'react'; -import {Card, Button} from 'react-bootstrap'; +import {Button} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; @@ -29,12 +29,12 @@ function MasterCheckbox(props) { } return ( - <Card.Header> + <div className={'master-checkbox'}> <Button key={`${title}-button`} variant={'link'} disabled={disabled} onClick={onClick}> <FontAwesomeIcon icon={newCheckboxIcon}/> </Button> <span className={'header-title'}>{title}</span> - </Card.Header> + </div> ); } diff --git a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss index 3dc1fe9a5..de3d5d542 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss @@ -18,12 +18,14 @@ padding-bottom: 5px; } -.advanced-multi-select .card-header button { - padding-top: 0; +.advanced-multi-select .card-header .master-checkbox span { + padding-bottom: 0.188rem; } .advanced-multi-select .card-header .header-title { font-size: 1.2em; + display: inline-block; + vertical-align: middle; } .advanced-multi-select .choice-block .form-group { From 917d6f574b538899e3ada28bbf8603acff6aa127 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Tue, 26 Jan 2021 15:15:11 -0500 Subject: [PATCH 13/38] ui: use class properties syntax in AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 508bafa83..5c7c11345 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -36,20 +36,17 @@ class AdvancedMultiSelect extends React.Component { this.enumOptions = props.options.enumOptions; this.defaultValues = props.schema.default; + this.infoPaneRefString = props.schema.items.$ref; + this.registry = props.registry; this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), hideReset: this.getHideResetState(props.value), - infoPaneParams: getDefaultPaneParams(props.schema.items.$ref, props.registry) + infoPaneParams: getDefaultPaneParams(this.infoPaneRefString, this.registry) }; - - this.onMasterCheckboxClick = this.onMasterCheckboxClick.bind(this); - this.onChildCheckboxClick = this.onChildCheckboxClick.bind(this); - this.onResetClick = this.onResetClick.bind(this); - this.setPaneInfo = this.setPaneInfo.bind(this, props.schema.items.$ref, props.registry); } - onMasterCheckboxClick() { + onMasterCheckboxClick = () => { if (this.state.masterCheckboxState === MasterCheckboxState.ALL) { var newValues = []; } else { @@ -61,7 +58,7 @@ class AdvancedMultiSelect extends React.Component { this.setHideResetState(newValues); } - onChildCheckboxClick(value) { + onChildCheckboxClick = (value) => { let selectValues = this.getSelectValuesAfterClick(value); this.props.onChange(selectValues); @@ -98,7 +95,7 @@ class AdvancedMultiSelect extends React.Component { return MasterCheckboxState.ALL; } - onResetClick() { + onResetClick = () => { this.props.onChange(this.defaultValues); this.setHideResetState(this.defaultValues); this.setMasterCheckboxState(this.defaultValues); @@ -115,8 +112,8 @@ class AdvancedMultiSelect extends React.Component { return selectValues.every((value) => this.defaultValues.includes(value)); } - setPaneInfo(refString, registry, itemKey) { - let definitionObj = getFullDefinitionByKey(refString, registry, itemKey); + setPaneInfo = (itemKey) => { + let definitionObj = getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey); this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); } From 145a41ffcf4029c7c26e69ebf7875d4c1f06b9fa Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Tue, 26 Jan 2021 15:46:57 -0500 Subject: [PATCH 14/38] ui: move getDefaultPaneParams() to InfoPane.js --- .../src/components/ui-components/AdvancedMultiSelect.js | 4 ++-- .../cc/ui/src/components/ui-components/InfoPane.js | 8 +++++++- .../ui/src/components/ui-components/JsonSchemaHelpers.js | 7 +------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 5c7c11345..bab944093 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -4,10 +4,10 @@ import {Button, Card, Form} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; import {getComponentHeight} from './utils/HeightCalculator'; -import InfoPane from './InfoPane'; +import {getDefaultPaneParams, InfoPane} from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckbox from './ChildCheckbox'; -import {getFullDefinitionByKey, getDefaultPaneParams} from './JsonSchemaHelpers'; +import {getFullDefinitionByKey} from './JsonSchemaHelpers'; function AdvancedMultiSelectHeader(props) { const { diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 5c963d87e..6e50ca66d 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -3,6 +3,12 @@ import React from 'react'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; +import {getObjectFromRegistryByRef} from './JsonSchemaHelpers'; + +function getDefaultPaneParams(refString, registry) { + let configSection = getObjectFromRegistryByRef(refString, registry); + return ({title: configSection.title, content: configSection.description}); +} function InfoPane(props) { return ( @@ -49,4 +55,4 @@ function getBody(props) { ) } -export default InfoPane +export {getDefaultPaneParams, InfoPane} diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js index 06eed4aed..9a3d9c66b 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/JsonSchemaHelpers.js @@ -16,9 +16,4 @@ function getObjectFromRegistryByRef(refString, registry) { return resolveObjectPath(refArray, registry); } -function getDefaultPaneParams(refString, registry) { - let configSection = getObjectFromRegistryByRef(refString, registry); - return ({title: configSection.title, content: configSection.description}); -} - -export {getFullDefinitionByKey, getDefaultPaneParams}; +export {getFullDefinitionByKey, getObjectFromRegistryByRef}; From 32cdc034f32fc53c46eed596af426b681cf8b031 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Tue, 26 Jan 2021 15:51:42 -0500 Subject: [PATCH 15/38] ui: fix whitespace in ChildCheckbox.js --- .../components/ui-components/ChildCheckbox.js | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 353da4b22..4ce11295e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -6,25 +6,23 @@ import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; function ChildCheckbox(props) { - const { - onPaneClick, - onClick, - value, - disabled, - label, - checkboxState - } = props; + const { + onPaneClick, + onClick, + value, + disabled, + label, + checkboxState + } = props; - return ( - <Form.Group onClick={() => onPaneClick(value)}> - <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> - <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> - </Button> - <span className={'option-text'}> - {label} - </span> - </Form.Group> - ); + return ( + <Form.Group onClick={() => onPaneClick(value)}> + <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> + <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> + </Button> + <span className={'option-text'}>{label}</span> + </Form.Group> + ); } export default ChildCheckbox; From 155da384c275aa6057ad1b661cacd5c58af51ba9 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 08:14:18 -0500 Subject: [PATCH 16/38] ui: replace "(UNSAFE)" text with warning icon --- .../definitions/exploiter_classes.py | 15 ++++++++++++++- .../config_schema/definitions/finger_classes.py | 8 ++++++++ .../definitions/post_breach_actions.py | 11 +++++++++++ .../definitions/system_info_collector_classes.py | 6 ++++++ .../ui-components/AdvancedMultiSelect.js | 7 ++++++- .../src/components/ui-components/ChildCheckbox.js | 13 ++++++++++--- .../cc/ui/src/styles/pages/ConfigurationPage.scss | 7 +++++++ 7 files changed, 62 insertions(+), 5 deletions(-) diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py index 0a5e671a3..25158d73a 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/exploiter_classes.py @@ -12,6 +12,7 @@ EXPLOITER_CLASSES = { "SmbExploiter" ], "title": "SMB Exploiter", + "safe": True, "attack_techniques": ["T1110", "T1075", "T1035"], "info": "Brute forces using credentials provided by user and" " hashes gathered by mimikatz.", @@ -23,6 +24,7 @@ EXPLOITER_CLASSES = { "WmiExploiter" ], "title": "WMI Exploiter", + "safe": True, "attack_techniques": ["T1110", "T1106"], "info": "Brute forces WMI (Windows Management Instrumentation) " "using credentials provided by user and hashes gathered by mimikatz.", @@ -34,6 +36,7 @@ EXPLOITER_CLASSES = { "MSSQLExploiter" ], "title": "MSSQL Exploiter", + "safe": True, "attack_techniques": ["T1110"], "info": "Tries to brute force into MsSQL server and uses insecure " "configuration to execute commands on server.", @@ -44,7 +47,8 @@ EXPLOITER_CLASSES = { "enum": [ "Ms08_067_Exploiter" ], - "title": "MS08-067 Exploiter (UNSAFE)", + "title": "MS08-067 Exploiter", + "safe": False, "info": "Unsafe exploiter, that might cause system crash due to the use of buffer overflow. " "Uses MS08-067 vulnerability.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/ms08-067/" @@ -55,6 +59,7 @@ EXPLOITER_CLASSES = { "SSHExploiter" ], "title": "SSH Exploiter", + "safe": True, "attack_techniques": ["T1110", "T1145", "T1106"], "info": "Brute forces using credentials provided by user and SSH keys gathered from systems.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/sshexec/" @@ -65,6 +70,7 @@ EXPLOITER_CLASSES = { "ShellShockExploiter" ], "title": "ShellShock Exploiter", + "safe": True, "info": "CVE-2014-6271, based on logic from " "https://github.com/nccgroup/shocker/blob/master/shocker.py .", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/shellshock/" @@ -75,6 +81,7 @@ EXPLOITER_CLASSES = { "SambaCryExploiter" ], "title": "SambaCry Exploiter", + "safe": True, "info": "Bruteforces and searches for anonymous shares. Uses Impacket.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/sambacry/" }, @@ -84,6 +91,7 @@ EXPLOITER_CLASSES = { "ElasticGroovyExploiter" ], "title": "ElasticGroovy Exploiter", + "safe": True, "info": "CVE-2015-1427. Logic is based on Metasploit module.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/elasticgroovy/" }, @@ -93,6 +101,7 @@ EXPLOITER_CLASSES = { "Struts2Exploiter" ], "title": "Struts2 Exploiter", + "safe": True, "info": "Exploits struts2 java web framework. CVE-2017-5638. Logic based on " "https://www.exploit-db.com/exploits/41570 .", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/struts2/" @@ -103,6 +112,7 @@ EXPLOITER_CLASSES = { "WebLogicExploiter" ], "title": "WebLogic Exploiter", + "safe": True, "info": "Exploits CVE-2017-10271 and CVE-2019-2725 vulnerabilities on WebLogic server.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/weblogic/" }, @@ -112,6 +122,7 @@ EXPLOITER_CLASSES = { "HadoopExploiter" ], "title": "Hadoop/Yarn Exploiter", + "safe": True, "info": "Remote code execution on HADOOP server with YARN and default settings. " "Logic based on https://github.com/vulhub/vulhub/tree/master/hadoop/unauthorized-yarn.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/hadoop/" @@ -122,6 +133,7 @@ EXPLOITER_CLASSES = { "VSFTPDExploiter" ], "title": "VSFTPD Exploiter", + "safe": True, "info": "Exploits a malicious backdoor that was added to the VSFTPD download archive. " "Logic based on Metasploit module.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/vsftpd/" @@ -132,6 +144,7 @@ EXPLOITER_CLASSES = { "DrupalExploiter" ], "title": "Drupal Exploiter", + "safe": True, "info": "Exploits a remote command execution vulnerability in a Drupal server," "for which certain modules (such as RESTful Web Services) are enabled.", "link": "https://www.guardicore.com/infectionmonkey/docs/reference/exploiters/drupal/" diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py index 405983dc5..5e3f75f33 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/finger_classes.py @@ -10,6 +10,7 @@ FINGER_CLASSES = { "SMBFinger" ], "title": "SMBFinger", + "safe": True, "info": "Figures out if SMB is running and what's the version of it.", "attack_techniques": ["T1210"] }, @@ -19,6 +20,7 @@ FINGER_CLASSES = { "SSHFinger" ], "title": "SSHFinger", + "safe": True, "info": "Figures out if SSH is running.", "attack_techniques": ["T1210"] }, @@ -28,6 +30,7 @@ FINGER_CLASSES = { "PingScanner" ], "title": "PingScanner", + "safe": True, "info": "Tries to identify if host is alive and which OS it's running by ping scan." }, { @@ -36,6 +39,7 @@ FINGER_CLASSES = { "HTTPFinger" ], "title": "HTTPFinger", + "safe": True, "info": "Checks if host has HTTP/HTTPS ports open." }, { @@ -44,6 +48,7 @@ FINGER_CLASSES = { "MySQLFinger" ], "title": "MySQLFinger", + "safe": True, "info": "Checks if MySQL server is running and tries to get it's version.", "attack_techniques": ["T1210"] }, @@ -53,6 +58,7 @@ FINGER_CLASSES = { "MSSQLFinger" ], "title": "MSSQLFinger", + "safe": True, "info": "Checks if Microsoft SQL service is running and tries to gather information about it.", "attack_techniques": ["T1210"] }, @@ -62,6 +68,7 @@ FINGER_CLASSES = { "ElasticFinger" ], "title": "ElasticFinger", + "safe": True, "info": "Checks if ElasticSearch is running and attempts to find it's version.", "attack_techniques": ["T1210"] }, @@ -71,6 +78,7 @@ FINGER_CLASSES = { "WindowsServerFinger" ], "title": "WindowsServerFinger", + "safe": True, "info": "Checks if server is a Windows Server and tests if it is vulnerable to Zerologon.", "attack_techniques": ["T1210"] } diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py index f1fe0f6f2..16dc0735e 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py @@ -10,6 +10,7 @@ POST_BREACH_ACTIONS = { "BackdoorUser" ], "title": "Back door user", + "safe": True, "info": "Attempts to create a new user on the system and delete it afterwards.", "attack_techniques": ["T1136"] }, @@ -19,6 +20,7 @@ POST_BREACH_ACTIONS = { "CommunicateAsNewUser" ], "title": "Communicate as new user", + "safe": True, "info": "Attempts to create a new user, create HTTPS requests as that user and delete the user " "afterwards.", "attack_techniques": ["T1136"] @@ -29,6 +31,7 @@ POST_BREACH_ACTIONS = { "ModifyShellStartupFiles" ], "title": "Modify shell startup files", + "safe": True, "info": "Attempts to modify shell startup files, like ~/.profile, ~/.bashrc, ~/.bash_profile " "in linux, and profile.ps1 in windows. Reverts modifications done afterwards.", "attack_techniques": ["T1156", "T1504"] @@ -39,6 +42,7 @@ POST_BREACH_ACTIONS = { "HiddenFiles" ], "title": "Hidden files and directories", + "safe": True, "info": "Attempts to create a hidden file and remove it afterward.", "attack_techniques": ["T1158"] }, @@ -48,6 +52,7 @@ POST_BREACH_ACTIONS = { "TrapCommand" ], "title": "Trap", + "safe": True, "info": "On Linux systems, attempts to trap an interrupt signal in order to execute a command " "upon receiving that signal. Removes the trap afterwards.", "attack_techniques": ["T1154"] @@ -58,6 +63,7 @@ POST_BREACH_ACTIONS = { "ChangeSetuidSetgid" ], "title": "Setuid and Setgid", + "safe": True, "info": "On Linux systems, attempts to set the setuid and setgid bits of a new file. " "Removes the file afterwards.", "attack_techniques": ["T1166"] @@ -68,6 +74,7 @@ POST_BREACH_ACTIONS = { "ScheduleJobs" ], "title": "Job scheduling", + "safe": True, "info": "Attempts to create a scheduled job on the system and remove it.", "attack_techniques": ["T1168", "T1053"] }, @@ -77,6 +84,7 @@ POST_BREACH_ACTIONS = { "Timestomping" ], "title": "Timestomping", + "safe": True, "info": "Creates a temporary file and attempts to modify its time attributes. Removes the file afterwards.", "attack_techniques": ["T1099"] }, @@ -86,6 +94,7 @@ POST_BREACH_ACTIONS = { "SignedScriptProxyExecution" ], "title": "Signed script proxy execution", + "safe": False, "info": "On Windows systems, attemps to execute an arbitrary file " "with the help of a pre-existing signed script.", "attack_techniques": ["T1216"] @@ -96,6 +105,7 @@ POST_BREACH_ACTIONS = { "AccountDiscovery" ], "title": "Account Discovery", + "safe": True, "info": "Attempts to get a listing of user accounts on the system.", "attack_techniques": ["T1087"] }, @@ -105,6 +115,7 @@ POST_BREACH_ACTIONS = { "ClearCommandHistory" ], "title": "Clear command history", + "safe": False, "info": "Attempts to clear the command history.", "attack_techniques": ["T1146"] } diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py index 5f113f4a7..174133f43 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py @@ -16,6 +16,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { ENVIRONMENT_COLLECTOR ], "title": "Environment collector", + "safe": True, "info": "Collects information about machine's environment (on premise/GCP/AWS).", "attack_techniques": ["T1082"] }, @@ -25,6 +26,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { MIMIKATZ_COLLECTOR ], "title": "Mimikatz collector", + "safe": True, "info": "Collects credentials from Windows credential manager.", "attack_techniques": ["T1003", "T1005"] }, @@ -34,6 +36,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { AWS_COLLECTOR ], "title": "AWS collector", + "safe": True, "info": "If on AWS, collects more information about the AWS instance currently running on.", "attack_techniques": ["T1082"] }, @@ -43,6 +46,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { HOSTNAME_COLLECTOR ], "title": "Hostname collector", + "safe": True, "info": "Collects machine's hostname.", "attack_techniques": ["T1082", "T1016"] }, @@ -52,6 +56,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { PROCESS_LIST_COLLECTOR ], "title": "Process list collector", + "safe": True, "info": "Collects a list of running processes on the machine.", "attack_techniques": ["T1082"] }, @@ -61,6 +66,7 @@ SYSTEM_INFO_COLLECTOR_CLASSES = { AZURE_CRED_COLLECTOR ], "title": "Azure credential collector", + "safe": True, "info": "Collects password credentials from Azure VMs", "attack_techniques": ["T1003", "T1005"] } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index bab944093..b92ff3f1a 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -123,6 +123,10 @@ class AdvancedMultiSelect extends React.Component { })); } + isSafe(itemKey) { + return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; + } + render() { const { schema, @@ -149,7 +153,8 @@ class AdvancedMultiSelect extends React.Component { return ( <ChildCheckbox key={i} onPaneClick={this.setPaneInfo} onClick={this.onChildCheckboxClick} value={value} - disabled={disabled} label={label} checkboxState={this.props.value.includes(value)}/> + disabled={disabled} label={label} checkboxState={this.props.value.includes(value)} + safe={this.isSafe(value)}/> ); } )} diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 4ce11295e..1cd3caa8c 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -2,7 +2,7 @@ import React from 'react'; import {Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; +import {faCheckSquare, faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; function ChildCheckbox(props) { @@ -12,15 +12,22 @@ function ChildCheckbox(props) { value, disabled, label, - checkboxState + checkboxState, + safe } = props; + let displayLabel = [<span key={'label'} className={'option-text'}>{label}</span>]; + + if (!safe) { + displayLabel.push(<FontAwesomeIcon key="unsafe-indicator" className="unsafe-indicator" icon={faExclamationTriangle}/>) + } + return ( <Form.Group onClick={() => onPaneClick(value)}> <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> </Button> - <span className={'option-text'}>{label}</span> + {displayLabel} </Form.Group> ); } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index e5c6c08bc..435047845 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -57,3 +57,10 @@ white-space: pre-wrap; } +.unsafe-indicator { + text-transform: uppercase; + color: #ffc107; + font-weight: 900; + margin-left: .75em; + margin-right: .75em; +} From 5942fad434b0136aeffc693033c05228977b6a45 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 08:51:30 -0500 Subject: [PATCH 17/38] ui: extract ChildCheckboxContainer component out of AdvancedMultiSelect --- .../ui-components/AdvancedMultiSelect.js | 28 +++++--------- .../components/ui-components/ChildCheckbox.js | 37 ++++++++++++++++++- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index b92ff3f1a..90d8cf818 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -1,12 +1,11 @@ import React from 'react'; -import {Button, Card, Form} from 'react-bootstrap'; +import {Button, Card} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; -import {getComponentHeight} from './utils/HeightCalculator'; import {getDefaultPaneParams, InfoPane} from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; -import ChildCheckbox from './ChildCheckbox'; +import ChildCheckboxContainer from './ChildCheckbox'; import {getFullDefinitionByKey} from './JsonSchemaHelpers'; function AdvancedMultiSelectHeader(props) { @@ -123,7 +122,7 @@ class AdvancedMultiSelect extends React.Component { })); } - isSafe(itemKey) { + isSafe = (itemKey) => { return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; } @@ -144,21 +143,12 @@ class AdvancedMultiSelect extends React.Component { disabled={disabled} onCheckboxClick={this.onMasterCheckboxClick} checkboxState={this.state.masterCheckboxState} hideReset={this.state.hideReset} onResetClick={this.onResetClick}/> - <Form.Group - style={{height: `${getComponentHeight(this.enumOptions.length)}px`}} - id={id} multiple={multiple} className='choice-block form-control' - required={required} disabled={disabled || readonly} autoFocus={autofocus}> - { - this.enumOptions.map(({value, label}, i) => { - return ( - <ChildCheckbox key={i} onPaneClick={this.setPaneInfo} - onClick={this.onChildCheckboxClick} value={value} - disabled={disabled} label={label} checkboxState={this.props.value.includes(value)} - safe={this.isSafe(value)}/> - ); - } - )} - </Form.Group> + + <ChildCheckboxContainer id={id} multiple={multiple} required={required} + disabled={disabled || readonly} autoFocus={autofocus} isSafe={this.isSafe} + onPaneClick={this.setPaneInfo} onCheckboxClick={this.onChildCheckboxClick} + selectedValues={this.props.value} enumOptions={this.enumOptions}/> + <InfoPane title={this.state.infoPaneParams.title} body={this.state.infoPaneParams.content} link={this.state.infoPaneParams.link}/> diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 1cd3caa8c..e740734d5 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -5,6 +5,41 @@ import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faCheckSquare, faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; +import {getComponentHeight} from './utils/HeightCalculator'; + +function ChildCheckboxContainer(props) { + const { + enumOptions, + id, + multiple, + required, + disabled, + autofocus, + onPaneClick, + onCheckboxClick, + selectedValues, + isSafe + } = props; + + return( + <Form.Group + style={{height: `${getComponentHeight(enumOptions.length)}px`}} + id={id} multiple={multiple} className='choice-block form-control' + required={required} disabled={disabled} autoFocus={autofocus}> + { + enumOptions.map(({value, label}, i) => { + return ( + <ChildCheckbox key={i} onPaneClick={onPaneClick} + onClick={onCheckboxClick} value={value} + disabled={disabled} label={label} checkboxState={selectedValues.includes(value)} + safe={isSafe(value)}/> + ); + } + )} + </Form.Group> + ); +} + function ChildCheckbox(props) { const { onPaneClick, @@ -32,4 +67,4 @@ function ChildCheckbox(props) { ); } -export default ChildCheckbox; +export default ChildCheckboxContainer; From 5f9470d17c408e3a8087efb6716d9c68b59f985b Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 09:00:55 -0500 Subject: [PATCH 18/38] ui: extract WarningIcon component from ChildCheckbox.js --- .../ui/src/components/ui-components/ChildCheckbox.js | 5 +++-- .../cc/ui/src/components/ui-components/WarningIcon.js | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index e740734d5..57088f0c2 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -2,10 +2,11 @@ import React from 'react'; import {Button, Form} from 'react-bootstrap'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; -import {faCheckSquare, faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; +import {faCheckSquare} from '@fortawesome/free-solid-svg-icons'; import {faSquare} from '@fortawesome/free-regular-svg-icons'; import {getComponentHeight} from './utils/HeightCalculator'; +import WarningIcon from './WarningIcon'; function ChildCheckboxContainer(props) { const { @@ -54,7 +55,7 @@ function ChildCheckbox(props) { let displayLabel = [<span key={'label'} className={'option-text'}>{label}</span>]; if (!safe) { - displayLabel.push(<FontAwesomeIcon key="unsafe-indicator" className="unsafe-indicator" icon={faExclamationTriangle}/>) + displayLabel.push(<WarningIcon key="unsafe-indicator"/>) } return ( diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js new file mode 100644 index 000000000..2e759ccb6 --- /dev/null +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js @@ -0,0 +1,11 @@ +import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; +import {faExclamationTriangle} from '@fortawesome/free-solid-svg-icons'; +import React from 'react'; + +function WarningIcon() { + return ( + <FontAwesomeIcon className="unsafe-indicator" icon={faExclamationTriangle}/> + ); +} + +export default WarningIcon; From 5ed102bd0957c96b2ea5f505c44292f4be2896e6 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 10:08:31 -0500 Subject: [PATCH 19/38] config_schema: fix typo in Signed script proxy execution PBA --- .../services/config_schema/definitions/post_breach_actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py index 16dc0735e..857e80da4 100644 --- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py +++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py @@ -95,7 +95,7 @@ POST_BREACH_ACTIONS = { ], "title": "Signed script proxy execution", "safe": False, - "info": "On Windows systems, attemps to execute an arbitrary file " + "info": "On Windows systems, attempts to execute an arbitrary file " "with the help of a pre-existing signed script.", "attack_techniques": ["T1216"] }, From 7ec8f0394c6e64883e5e54c3d6fdb29272e9b28c Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 10:12:28 -0500 Subject: [PATCH 20/38] ui: add warning message to PBA/Exploiters InfoPane --- .../ui-components/AdvancedMultiSelect.js | 14 ++++++++-- .../src/components/ui-components/InfoPane.js | 26 +++++++++++++++++-- .../cc/ui/src/styles/components/InfoPane.scss | 7 +++++ 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 90d8cf818..955aec509 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -113,7 +113,16 @@ class AdvancedMultiSelect extends React.Component { setPaneInfo = (itemKey) => { let definitionObj = getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey); - this.setState({infoPaneParams: {title: definitionObj.title, content: definitionObj.info, link: definitionObj.link}}); + this.setState( + { + infoPaneParams: { + title: definitionObj.title, + content: definitionObj.info, + link: definitionObj.link, + showWarning: !(this.isSafe(itemKey)) + } + } + ); } setPaneInfoToDefault() { @@ -151,7 +160,8 @@ class AdvancedMultiSelect extends React.Component { <InfoPane title={this.state.infoPaneParams.title} body={this.state.infoPaneParams.content} - link={this.state.infoPaneParams.link}/> + link={this.state.infoPaneParams.link} + showWarning={this.state.infoPaneParams.showWarning}/> </div> ); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 6e50ca66d..f0545a5c6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -4,10 +4,16 @@ import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; import {getObjectFromRegistryByRef} from './JsonSchemaHelpers'; +import WarningIcon from './WarningIcon'; function getDefaultPaneParams(refString, registry) { let configSection = getObjectFromRegistryByRef(refString, registry); - return ({title: configSection.title, content: configSection.description}); + return ( + { + title: configSection.title, + content: configSection.description, + showWarning: false + }); } function InfoPane(props) { @@ -48,11 +54,27 @@ function getSubtitle(props) { } function getBody(props) { + let body = [<span key={'body'}>{props.body}</span>]; + + if (props.showWarning) { + body.push(getWarning()); + } + return ( <Card.Body className={'pane-body'}> - {props.body} + {body} </Card.Body> ) } +function getWarning() { + return ( + <div className={'info-pane-warning'} key={'warning'}> + <WarningIcon/>This option may cause a system to become unstable or + change the system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive environments. + </div> + ); +} + export {getDefaultPaneParams, InfoPane} diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index 8c61d873f..a177ed7e1 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -27,3 +27,10 @@ margin: 10px 15px; padding: 0; } + +.info-pane-warning { + margin-top: 1em; +} +.info-pane-warning .unsafe-indicator { + margin-left: 0em; +} From 9d9e8168fb2c23367b9947273aa1a041687b3e2e Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 10:18:40 -0500 Subject: [PATCH 21/38] ui: rename unsafe-indicator to warning-icon --- .../cc/ui/src/components/ui-components/ChildCheckbox.js | 2 +- .../cc/ui/src/components/ui-components/WarningIcon.js | 2 +- monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss | 2 +- .../monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 57088f0c2..47a86dab6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -55,7 +55,7 @@ function ChildCheckbox(props) { let displayLabel = [<span key={'label'} className={'option-text'}>{label}</span>]; if (!safe) { - displayLabel.push(<WarningIcon key="unsafe-indicator"/>) + displayLabel.push(<WarningIcon key="warning-icon"/>) } return ( diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js index 2e759ccb6..e06f00ec9 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/WarningIcon.js @@ -4,7 +4,7 @@ import React from 'react'; function WarningIcon() { return ( - <FontAwesomeIcon className="unsafe-indicator" icon={faExclamationTriangle}/> + <FontAwesomeIcon className="warning-icon" icon={faExclamationTriangle}/> ); } diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index a177ed7e1..561e436cf 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -31,6 +31,6 @@ .info-pane-warning { margin-top: 1em; } -.info-pane-warning .unsafe-indicator { +.info-pane-warning .warning-icon { margin-left: 0em; } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index 435047845..98e598c81 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -57,7 +57,7 @@ white-space: pre-wrap; } -.unsafe-indicator { +.warning-icon { text-transform: uppercase; color: #ffc107; font-weight: 900; From ce9a398f28a0e22122035f6be5bc8ab5ee6ef79a Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 10:58:42 -0500 Subject: [PATCH 22/38] swimm: autosync PBA tutorial --- .swm/JFXftJml8DpmuCPBA9rL.swm | 57 ++++++++---- .swm/tbxb2cGgUiJQ8Btma0fp.swm | 169 +++++++++++++++++++++++----------- 2 files changed, 156 insertions(+), 70 deletions(-) diff --git a/.swm/JFXftJml8DpmuCPBA9rL.swm b/.swm/JFXftJml8DpmuCPBA9rL.swm index 7c186126e..3e348a3a6 100644 --- a/.swm/JFXftJml8DpmuCPBA9rL.swm +++ b/.swm/JFXftJml8DpmuCPBA9rL.swm @@ -1,30 +1,51 @@ { "id": "JFXftJml8DpmuCPBA9rL", "name": "Add details about your new PBA", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIweW91ciUyMG5ldyUyMFBCQSdzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbi4=", - "description": "SW4lMjBvcmRlciUyMHRvJTIwbWFrZSUyMHN1cmUlMjB0aGF0JTIwdGhlJTIwbmV3JTIwJTYwU2NoZWR1bGVKb2JzJTYwJTIwUEJBJTIwaXMlMjBzaG93biUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTJDJTIweW91JTIwbmVlZCUyMHRvJTIwYWRkJTIwaXRzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGZpbGUocykuJTIwJTNDYnIlM0UlM0NiciUzRSUwQSUwQVNpbmNlJTIwdGhpcyUyMHBhcnRpY3VsYXIlMjBQQkElMjBpcyUyMHJlbGF0ZWQlMjB0byUyMHRoZSUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMCU1QlQxMTY4JTVEKGh0dHBzJTNBJTJGJTJGYXR0YWNrLm1pdHJlLm9yZyUyRnRlY2huaXF1ZXMlMkZUMTE2OCklMjBhbmQlMjAlNUJUMTA1MyU1RChodHRwcyUzQSUyRiUyRmF0dGFjay5taXRyZS5vcmclMkZ0ZWNobmlxdWVzJTJGVDEwNTMpJTJDJTIwbWFrZSUyMHN1cmUlMjB0byUyMGxpbmslMjB0aGUlMjBQQkElMjB3aXRoJTIwdGhlc2UlMjB0ZWNobmlxdWVzJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwYXMlMjB3ZWxsLiUyMCUzQ2JyJTNFJTNDYnIlM0UlMEElMEFFYWNoJTIwcGFydCUyMG9mJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGhhcyUyMGFuJTIwaW1wb3J0YW50JTIwcm9sZSUyMCUyMCUwQS0lMjAqZW51bSolMjAlRTIlODAlOTQlMjBjb250YWlucyUyMHRoZSUyMHJlbGV2YW50JTIwUEJBJ3MlMjBjbGFzcyUyMG5hbWUocyklMEEtJTIwKnRpdGxlKiUyMCVFMiU4MCU5NCUyMGhvbGRzJTIwdGhlJTIwbmFtZSUyMG9mJTIwdGhlJTIwUEJBJTIwd2hpY2glMjBpcyUyMGRpc3BsYXllZCUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTBBLSUyMCppbmZvKiUyMCVFMiU4MCU5NCUyMGNvbnNpc3RzJTIwb2YlMjBhbiUyMGVsYWJvcmF0aW9uJTIwb24lMjB0aGUlMjBQQkEncyUyMHdvcmtpbmclMjB3aGljaCUyMGlzJTIwZGlzcGxheWVkJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwKmF0dGFja190ZWNobmlxdWVzKiUyMCVFMiU4MCU5NCUyMGhhcyUyMHRoZSUyMElEcyUyMG9mJTIwdGhlJTIwTUlUUkUlMjB0ZWNobmlxdWVzJTIwYXNzb2NpYXRlZCUyMHdpdGglMjB0aGUlMjBQQkElMEElMEElMjMlMjMlMjBNYW51YWwlMjB0ZXN0JTIwJTIwJTBBT25jZSUyMHlvdSUyMHRoaW5rJTIweW91J3JlJTIwZG9uZS4uLiUwQS0lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwWW91JTIwc2hvdWxkJTIwYmUlMjBhYmxlJTIwdG8lMjBzZWUlMjB5b3VyJTIwbmV3JTIwUEJBJTIwdW5kZXIlMjB0aGUlMjAlMjJNb25rZXklMjIlMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjBhbG9uZyUyMHdpdGglMjBpdHMlMjBpbmZvcm1hdGlvbiUyMHdoZW4lMjB5b3UlMjBjbGljayUyMG9uJTIwaXQlMEEtJTIwRnVydGhlciUyQyUyMHdoZW4lMjB5b3UlMjBlbmFibGUlMkZkaXNhYmxlJTIwdGhlJTIwYXNzb2NpYXRlZCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMHVuZGVyJTIwdGhlJTIwQVRUJTI2Q0slMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjB0aGUlMjBQQkElMjBzaG91bGQlMjBhbHNvJTIwYmUlMjBlbmFibGVkJTJGZGlzYWJsZWQlMEElMEElM0NpbWclMjBzcmMlM0QlMjJodHRwcyUzQSUyRiUyRmkuaW1ndXIuY29tJTJGYTVWU2tMNS5naWYlMjIlMjBoZWlnaHQlM0Q0MDAlM0U=", - "summary": "LSUyMFRoZSUyMFBCQSUyMGRldGFpbHMlMjBpbiUyMHRoaXMlMjBmaWxlJTIwYXJlJTIwcmVmbGVjdGVkJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMjBpbiUyMHRoZSUyMFBCQSUyMGNvbmZpZ3VyYXRpb24uJTBBLSUyMFBCQXMlMjBhcmUlMjBhbHNvJTIwbGlua2VkJTIwdG8lMjB0aGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMGluJTIwdGhpcyUyMGZpbGUlMkMlMjB3aG9zZSUyMHJlc3VsdHMlMjBjYW4lMjB0aGVuJTIwYmUlMjBzZWVuJTIwaW4lMjB0aGUlMjBNSVRSRSUyMEFUVCUyNkNLJTIwcmVwb3J0JTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQu", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYxZmUwZjZmLi5jY2UzN2IyNCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTYyJTJDMTUlMjAlMkI2MiUyQzclMjAlNDAlNDAlMjBQT1NUX0JSRUFDSF9BQ1RJT05TJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyUmVtb3ZlcyUyMHRoZSUyMGZpbGUlMjBhZnRlcndhcmRzLiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmF0dGFja190ZWNobmlxdWVzJTIyJTNBJTIwJTVCJTIyVDExNjYlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJTY2hlZHVsZUpvYnMlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIySm9iJTIwc2NoZWR1bGluZyUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJpbmZvJTIyJTNBJTIwJTIyQXR0ZW1wdHMlMjB0byUyMGNyZWF0ZSUyMGElMjBzY2hlZHVsZWQlMjBqb2IlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMHJlbW92ZSUyMGl0LiUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJhdHRhY2tfdGVjaG5pcXVlcyUyMiUzQSUyMCU1QiUyMlQxMTY4JTIyJTJDJTIwJTIyVDEwNTMlMjIlNUQlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEFERCUyMERFVEFJTFMlMjBIRVJFISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add your new PBA's details to the configuration.", + "description": "In order to make sure that the new `ScheduleJobs` PBA is shown in the configuration on the Monkey Island, you need to add its details to the configuration file(s). <br><br>\n\nSince this particular PBA is related to the MITRE techniques [T1168](https://attack.mitre.org/techniques/T1168) and [T1053](https://attack.mitre.org/techniques/T1053), make sure to link the PBA with these techniques in the configuration as well. <br><br>\n\nEach part of the configuration has an important role \n- *enum* — contains the relevant PBA's class name(s)\n- *title* — holds the name of the PBA which is displayed in the configuration on the Monkey Island\n- *info* — consists of an elaboration on the PBA's working which is displayed in the configuration on the Monkey Island\n- *attack_techniques* — has the IDs of the MITRE techniques associated with the PBA\n\n## Manual test \nOnce you think you're done...\n- Run the Monkey Island\n- You should be able to see your new PBA under the \"Monkey\" tab in the configuration, along with its information when you click on it\n- Further, when you enable/disable the associated MITRE techniques under the ATT&CK tab in the configuration, the PBA should also be enabled/disabled\n\n<img src=\"https://i.imgur.com/a5VSkL5.gif\" height=400>", + "summary": "- The PBA details in this file are reflected on the Monkey Island in the PBA configuration.\n- PBAs are also linked to the relevant MITRE techniques in this file, whose results can then be seen in the MITRE ATT&CK report on the Monkey Island.", + "diff": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..cce37b24 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n@@ -68,16 +68,7 @@\n \"Removes the file afterwards.\",\n \"attack_techniques\": [\"T1166\"]\n },\n- {\n+ # Swimmer: ADD DETAILS HERE!\n- \"type\": \"string\",\n- \"enum\": [\n- \"ScheduleJobs\"\n- ],\n- \"title\": \"Job scheduling\",\n- \"safe\": True,\n- \"info\": \"Attempts to create a scheduled job on the system and remove it.\",\n- \"attack_techniques\": [\"T1168\", \"T1053\"]\n- },\n {\n \"type\": \"string\",\n \"enum\": [\n", "tests": [], "hints": [ "Have a look at the details of the other techniques." ], - "files": { + "app_version": "0.3.2", + "file_version": "1.0.4", + "swimmPatch": { "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f1fe0f6f..cce37b24", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC02MiUyQzE1JTIwJTJCNjIlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJSZW1vdmVzJTIwdGhlJTIwZmlsZSUyMGFmdGVyd2FyZHMuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjIlMkMlMjJiJTIyJTNBNjIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMTY2JTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjMlMkMlMjJiJTIyJTNBNjMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NCUyQyUyMmIlMjIlM0E2NCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMlNjaGVkdWxlSm9icyU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIySm9iJTIwc2NoZWR1bGluZyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTcwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmluZm8lNUMlMjIlM0ElMjAlNUMlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMHNjaGVkdWxlZCUyMGpvYiUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwcmVtb3ZlJTIwaXQuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyYXR0YWNrX3RlY2huaXF1ZXMlNUMlMjIlM0ElMjAlNUIlNUMlMjJUMTE2OCU1QyUyMiUyQyUyMCU1QyUyMlQxMDUzJTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQUREJTIwREVUQUlMUyUyMEhFUkUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNjUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NCUyQyUyMmIlMjIlM0E2NiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NSUyQyUyMmIlMjIlM0E2NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NiUyQyUyMmIlMjIlM0E2OCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTE1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..cce37b24 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -68,16 +68,7 @@", + " \"Removes the file afterwards.\",", + " \"attack_techniques\": [\"T1166\"]", + " },", + "- {", + "+ # Swimmer: ADD DETAILS HERE!", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"ScheduleJobs\"", + "- ],", + "- \"title\": \"Job scheduling\",", + "- \"safe\": True,", + "- \"info\": \"Attempts to create a scheduled job on the system and remove it.\",", + "- \"attack_techniques\": [\"T1168\", \"T1053\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "hunksOrder": [ + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], + "last_commit_sha_for_swimm_patch": "9d9e8168fb2c23367b9947273aa1a041687b3e2e" } \ No newline at end of file diff --git a/.swm/tbxb2cGgUiJQ8Btma0fp.swm b/.swm/tbxb2cGgUiJQ8Btma0fp.swm index e3be3fb14..e62725beb 100644 --- a/.swm/tbxb2cGgUiJQ8Btma0fp.swm +++ b/.swm/tbxb2cGgUiJQ8Btma0fp.swm @@ -1,75 +1,140 @@ { "id": "tbxb2cGgUiJQ8Btma0fp", "name": "Add a simple Post Breach action", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIwYSUyMG5ldyUyMFBCQSUyMHRvJTIwdGhlJTIwTW9ua2V5JTIwd2hpY2glMjBjcmVhdGVzJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG1hY2hpbmUu", - "description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MCUyMC0lMjBtYWtlJTIwc3VyZSUyMHlvdSUyMHNlZSUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUyMCUwQSUwQU5vdGUlMjB0aGF0JTIwdGhlJTIwUEJBJTIwc2hvdWxkJTIwaW1wYWN0JTIwdGhlJTIwVDExMzYlMjBNSVRSRSUyMHRlY2huaXF1ZSUyMGFzJTIwd2VsbCElMjAlMEElMEElMjMlMjBNYW51YWwlMjB0ZXN0JTIwdG8lMjBjb25maXJtJTBBJTBBMS4lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEyLiUyME1ha2UlMjBzdXJlJTIweW91ciUyMG5ldyUyMFBCQSUyMGlzJTIwZW5hYmxlZCUyMGJ5JTIwZGVmYXVsdCUyMGluJTIwdGhlJTIwY29uZmlnJTIwLSUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEzLiUyMFJ1biUyME1vbmtleSUwQTQuJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBzZWN1cml0eSUyMHJlcG9ydCUwQTUlMkMlMjBTZWUlMjB0aGUlMjBQQkElMjBpbiUyMHRoZSUyME1JVFJFJTIwcmVwb3J0JTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHRlY2huaXF1ZSUwQQ==", - "summary": "VGFrZSUyMGElMjBsb29rJTIwYXQlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb2YlMjB0aGUlMjBpc2xhbmQlMjBhZ2FpbiUyMC0lMjBzZWUlMjB0aGUlMjAlMjJjb21tYW5kJTIwdG8lMjBydW4lMjBhZnRlciUyMGJyZWFjaCUyMiUyMG9wdGlvbiUyMHdlJTIwb2ZmZXIlMjB0aGUlMjB1c2VyJTNGJTIwSXQncyUyMGltcGxlbWVudGVkJTIwZXhhY3RseSUyMGxpa2UlMjB5b3UlMjBkaWQlMjByaWdodCUyMG5vdyUyMGJ1dCUyMGVhY2glMjB1c2VyJTIwY2FuJTIwZG8lMjBpdCUyMGZvciUyMHRoZW1zZWx2ZXMuJTIwJTBBJTBBSG93ZXZlciUyQyUyMHdoYXQlMjBpZiUyMHRoZSUyMFBCQSUyMG5lZWRzJTIwdG8lMjBkbyUyMHN0dWZmJTIwd2hpY2glMjBpcyUyMG1vcmUlMjBjb21wbGV4JTIwdGhhbiUyMGp1c3QlMjBydW5uaW5nJTIwYSUyMGZldyUyMGNvbW1hbmRzJTNGJTIwSW4lMjB0aGF0JTIwY2FzZS4uLiUyMA==", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLjAzMWY5YWQwJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTJCJTIzJTIwU3dpbW1lciUzQSUyMFBVVCUyMFRIRSUyME5FVyUyMENPTlNUJTIwSEVSRSElMEElMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCUyMkZpbGUlMjBleGVjdXRpb24lMjIlMEElMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSUyMiUwQSUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTIyJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEFpbmRleCUyMDU4YmU4OWExLi5kODQ3NmE5NyUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBJTQwJTQwJTIwLTElMkMxNSUyMCUyQjElMkM3JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkucG9zdF9icmVhY2gucGJhJTIwaW1wb3J0JTIwUEJBJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkudXRpbHMudXNlcnMlMjBpbXBvcnQlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIlMEElMjAlMEElMjAlMEElMjBjbGFzcyUyMEJhY2tkb29yVXNlcihQQkEpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kcyUyQyUyMHdpbmRvd3NfY21kcyUyMCUzRCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciglMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24udXNlcl90b19hZGQlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24ucmVtb3RlX3VzZXJfcGFzcyklMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwYXNzJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEltcGwlMjBoZXJlISUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uZGE5OWU4NmMlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMCglMEEtJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyQiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUwQSUyMCUwQSU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwdW5zY2FubmVkX21zZyUyMCUzRCUyMCUyMk1vbmtleSUyMGRpZG4ndCUyMHRyeSUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTIwdXNlZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBjcmVhdGVkJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBLSUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiU1RCUwQSUyQiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYzZTJhOWJmLi4yYzRhYTY2NCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTQlMkMxNSUyMCUyQjQlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pZ2h0JTIwZG8lMjBhZnRlciUyMGJyZWFjaGluZyUyMGElMjBuZXclMjBtYWNoaW5lLiUyMFVzZWQlMjBpbiUyMEFUVCUyNkNLJTIwYW5kJTIwWmVybyUyMHRydXN0JTIwcmVwb3J0cy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIyYW55T2YlMjIlM0ElMjAlNUIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJCYWNrZG9vclVzZXIlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQWRkJTIwbmV3JTIwUEJBJTIwaGVyZSUyMHRvJTIwY29uZmlnISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add a new PBA to the Monkey which creates a new user on the machine.", + "description": "Read [our documentation about adding a new PBA](https://www.guardicore.com/infectionmonkey/docs/development/adding-post-breach-actions/).\n\nAfter that we want you to add the BackdoorUser PBA. The commands that add users for Win and Linux can be retrieved from `get_commands_to_add_user` - make sure you see how to use this function correctly. \n\nNote that the PBA should impact the T1136 MITRE technique as well! \n\n# Manual test to confirm\n\n1. Run the Monkey Island\n2. Make sure your new PBA is enabled by default in the config - for this test, disable network scanning, exploiting, and all other PBAs\n3. Run Monkey\n4. See the PBA in the security report\n5, See the PBA in the MITRE report in the relevant technique\n", + "summary": "Take a look at the configuration of the island again - see the \"command to run after breach\" option we offer the user? It's implemented exactly like you did right now but each user can do it for themselves. \n\nHowever, what if the PBA needs to do stuff which is more complex than just running a few commands? In that case... ", + "diff": "diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py\nindex c3bba995..031f9ad0 100644\n--- a/monkey/common/data/post_breach_consts.py\n+++ b/monkey/common/data/post_breach_consts.py\n@@ -1,5 +1,5 @@\n POST_BREACH_COMMUNICATE_AS_NEW_USER = \"Communicate as new user\"\n-POST_BREACH_BACKDOOR_USER = \"Backdoor user\"\n+# Swimmer: PUT THE NEW CONST HERE!\n POST_BREACH_FILE_EXECUTION = \"File execution\"\n POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = \"Modify shell startup file\"\n POST_BREACH_HIDDEN_FILES = \"Hide files and directories\"\ndiff --git a/monkey/infection_monkey/post_breach/actions/add_user.py b/monkey/infection_monkey/post_breach/actions/add_user.py\nindex 58be89a1..d8476a97 100644\n--- a/monkey/infection_monkey/post_breach/actions/add_user.py\n+++ b/monkey/infection_monkey/post_breach/actions/add_user.py\n@@ -1,15 +1,7 @@\n-from common.data.post_breach_consts import POST_BREACH_BACKDOOR_USER\n-from infection_monkey.config import WormConfiguration\n from infection_monkey.post_breach.pba import PBA\n from infection_monkey.utils.users import get_commands_to_add_user\n \n \n class BackdoorUser(PBA):\n def __init__(self):\n- linux_cmds, windows_cmds = get_commands_to_add_user(\n+ pass # Swimmer: Impl here!\n- WormConfiguration.user_to_add,\n- WormConfiguration.remote_user_pass)\n- super(BackdoorUser, self).__init__(\n- POST_BREACH_BACKDOOR_USER,\n- linux_cmd=' '.join(linux_cmds),\n- windows_cmd=windows_cmds)\ndiff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\nindex 086a1c13..da99e86c 100644\n--- a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n@@ -1,5 +1,5 @@\n from common.data.post_breach_consts import (\n- POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER)\n+ POST_BREACH_COMMUNICATE_AS_NEW_USER)\n from monkey_island.cc.services.attack.technique_reports.pba_technique import \\\n PostBreachTechnique\n \n@@ -11,4 +11,4 @@\n unscanned_msg = \"Monkey didn't try creating a new user on the network's systems.\"\n scanned_msg = \"Monkey tried creating a new user on the network's systems, but failed.\"\n used_msg = \"Monkey created a new user on the network's systems.\"\n- pba_names = [POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER]\n+ pba_names = [POST_BREACH_COMMUNICATE_AS_NEW_USER]\ndiff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f3e2a9bf..2c4aa664 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n@@ -4,16 +4,7 @@\n \"might do after breaching a new machine. Used in ATT&CK and Zero trust reports.\",\n \"type\": \"string\",\n \"anyOf\": [\n- {\n+ # Swimmer: Add new PBA here to config!\n- \"type\": \"string\",\n- \"enum\": [\n- \"BackdoorUser\"\n- ],\n- \"title\": \"Back door user\",\n- \"safe\": True,\n- \"info\": \"Attempts to create a new user on the system and delete it afterwards.\",\n- \"attack_techniques\": [\"T1136\"]\n- },\n {\n \"type\": \"string\",\n \"enum\": [\n", "tests": [], "hints": [ "See `ScheduleJobs` PBA for an example of a PBA which only uses shell commands.", "Make sure to add the PBA to the configuration as well.", "MITRE ATT&CK technique T1136 articulates that adversaries may create an account to maintain access to victim systems, therefore, the BackdoorUser PBA is relevant to it. Make sure to map this PBA to the MITRE ATT&CK configuration and report." ], - "files": { + "app_version": "0.3.2", + "file_version": "1.0.4", + "swimmPatch": { "monkey/common/data/post_breach_consts.py": { - "index": [ - "c3bba995..031f9ad0", - "100644" - ], - "fileA": "monkey/common/data/post_breach_consts.py", - "fileB": "monkey/common/data/post_breach_consts.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTd2ltbWVyJTNBJTIwUFVUJTIwVEhFJTIwTkVXJTIwQ09OU1QlMjBIRVJFISUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCU1QyUyMkZpbGUlMjBleGVjdXRpb24lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTVDJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCU1QyUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E1JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py\nindex c3bba995..031f9ad0 100644\n--- a/monkey/common/data/post_breach_consts.py\n+++ b/monkey/common/data/post_breach_consts.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " POST_BREACH_COMMUNICATE_AS_NEW_USER = \"Communicate as new user\"", + "-POST_BREACH_BACKDOOR_USER = \"Backdoor user\"", + "+# Swimmer: PUT THE NEW CONST HERE!", + " POST_BREACH_FILE_EXECUTION = \"File execution\"", + " POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = \"Modify shell startup file\"", + " POST_BREACH_HIDDEN_FILES = \"Hide files and directories\"" + ] + } ] }, "monkey/infection_monkey/post_breach/actions/add_user.py": { - "index": [ - "58be89a1..d8476a97", - "100644" - ], - "fileA": "monkey/infection_monkey/post_breach/actions/add_user.py", - "fileB": "monkey/infection_monkey/post_breach/actions/add_user.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOCUyQyUyMmIlMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwSW1wbCUyMGhlcmUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/post_breach/actions/add_user.py b/monkey/infection_monkey/post_breach/actions/add_user.py\nindex 58be89a1..d8476a97 100644\n--- a/monkey/infection_monkey/post_breach/actions/add_user.py\n+++ b/monkey/infection_monkey/post_breach/actions/add_user.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,15 +1,7 @@", + "-from common.data.post_breach_consts import POST_BREACH_BACKDOOR_USER", + "-from infection_monkey.config import WormConfiguration", + " from infection_monkey.post_breach.pba import PBA", + " from infection_monkey.utils.users import get_commands_to_add_user", + " ", + " ", + " class BackdoorUser(PBA):", + " def __init__(self):", + "- linux_cmds, windows_cmds = get_commands_to_add_user(", + "+ pass # Swimmer: Impl here!", + "- WormConfiguration.user_to_add,", + "- WormConfiguration.remote_user_pass)", + "- super(BackdoorUser, self).__init__(", + "- POST_BREACH_BACKDOOR_USER,", + "- linux_cmd=' '.join(linux_cmds),", + "- windows_cmd=windows_cmds)" + ] + } ] }, "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py": { - "index": [ - "086a1c13..da99e86c", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "fileB": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "status": "MODIFIED", - "numLineDeletions": 2, - "numLineAdditions": 2, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSUyQyUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTExJTJDJTIybGluZXNDb3VudCUyMiUzQTQlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\nindex 086a1c13..da99e86c 100644\n--- a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " from common.data.post_breach_consts import (", + "- POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER)", + "+ POST_BREACH_COMMUNICATE_AS_NEW_USER)", + " from monkey_island.cc.services.attack.technique_reports.pba_technique import \\", + " PostBreachTechnique", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -11,4 +11,4 @@", + " unscanned_msg = \"Monkey didn't try creating a new user on the network's systems.\"", + " scanned_msg = \"Monkey tried creating a new user on the network's systems, but failed.\"", + " used_msg = \"Monkey created a new user on the network's systems.\"", + "- pba_names = [POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER]", + "+ pba_names = [POST_BREACH_COMMUNICATE_AS_NEW_USER]" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f3e2a9bf..2c4aa664", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00JTJDMTUlMjAlMkI0JTJDNyUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIybWlnaHQlMjBkbyUyMGFmdGVyJTIwYnJlYWNoaW5nJTIwYSUyMG5ldyUyMG1hY2hpbmUuJTIwVXNlZCUyMGluJTIwQVRUJTI2Q0slMjBhbmQlMjBaZXJvJTIwdHJ1c3QlMjByZXBvcnRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjJhbnlPZiU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkJhY2tkb29yVXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFjayUyMGRvb3IlMjB1c2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMkF0dGVtcHRzJTIwdG8lMjBjcmVhdGUlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwZGVsZXRlJTIwaXQlMjBhZnRlcndhcmRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmF0dGFja190ZWNobmlxdWVzJTVDJTIyJTNBJTIwJTVCJTVDJTIyVDExMzYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFN3aW1tZXIlM0ElMjBBZGQlMjBuZXclMjBQQkElMjBoZXJlJTIwdG8lMjBjb25maWchJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2JTJDJTIyYiUyMiUzQTglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTclMkMlMjJiJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCUyQyUyMmIlMjIlM0ExMCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQlMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f3e2a9bf..2c4aa664 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -4,16 +4,7 @@", + " \"might do after breaching a new machine. Used in ATT&CK and Zero trust reports.\",", + " \"type\": \"string\",", + " \"anyOf\": [", + "- {", + "+ # Swimmer: Add new PBA here to config!", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"BackdoorUser\"", + "- ],", + "- \"title\": \"Back door user\",", + "- \"safe\": True,", + "- \"info\": \"Attempts to create a new user on the system and delete it afterwards.\",", + "- \"attack_techniques\": [\"T1136\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "hunksOrder": [ + "monkey/common/data/post_breach_consts.py_0", + "monkey/infection_monkey/post_breach/actions/add_user.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_1", + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], + "last_commit_sha_for_swimm_patch": "9d9e8168fb2c23367b9947273aa1a041687b3e2e" } \ No newline at end of file From 6806e715f78eb55fb75c5d7b83c446613914855e Mon Sep 17 00:00:00 2001 From: Swimm <swimm@swimm.io> Date: Thu, 28 Jan 2021 19:24:17 +0200 Subject: [PATCH 23/38] =?UTF-8?q?Swimm:=20update=20unit=20Add=20a=20new=20?= =?UTF-8?q?configuration=20setting=20to=20the=20Agent=20=E2=9A=99=20(id:?= =?UTF-8?q?=20AzD8XysWg1BBXCjCDkfq).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .swm/AzD8XysWg1BBXCjCDkfq.swm | 114 ++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 40 deletions(-) diff --git a/.swm/AzD8XysWg1BBXCjCDkfq.swm b/.swm/AzD8XysWg1BBXCjCDkfq.swm index 9594d72d9..83958e466 100644 --- a/.swm/AzD8XysWg1BBXCjCDkfq.swm +++ b/.swm/AzD8XysWg1BBXCjCDkfq.swm @@ -1,58 +1,92 @@ { "id": "AzD8XysWg1BBXCjCDkfq", "name": "Add a new configuration setting to the Agent âš™", - "dod": "TWFrZSUyMHRoZSUyMG1heCUyMHZpY3RpbSUyMG51bWJlciUyMHRoYXQlMjBNb25rZXklMjB3aWxsJTIwZmluZCUyMGJlZm9yZSUyMHN0b3BwaW5nJTIwY29uZmlndXJhYmxlJTIwYnklMjB0aGUlMjB1c2VyJTIwaW5zdGVhZCUyMG9mJTIwY29uc3RhbnQu", - "description": "JTIzJTIwTWFrZSUyMHNvbWV0aGluZyUyMGNvbmZpZ3VyYWJsZSUwQSUwQUluJTIwdGhpcyUyMHVuaXQlMkMlMjB5b3UlMjB3aWxsJTIwbGVhcm4lMjBob3clMjB0byUyMGFkZCUyMGElMjBjb25maWd1cmF0aW9uJTIwb3B0aW9uJTIwdG8lMjBNb25rZXklMjBhbmQlMjBob3clMjB0byUyMHVzZSUyMGl0JTIwaW4lMjB0aGUlMjBNb25rZXklMjBBZ2VudCUyMGNvZGUuJTIwJTBBJTBBISU1QmNvbXB1dGVyJTIwZmlyZSU1RChodHRwcyUzQSUyRiUyRm1lZGlhLmdpcGh5LmNvbSUyRm1lZGlhJTJGN0o0UDdjVXVyMkRsRXJpanAzJTJGZ2lwaHkuZ2lmJTIwJTIyY29tcHV0ZXIlMjBmaXJlJTIyKSUwQSUwQSUyMyUyMyUyMFdoeSUyMGlzJTIwdGhpcyUyMGltcG9ydGFudCUzRiUwQSUwQUVuYWJsaW5nJTIwdXNlcnMlMjB0byUyMGNvbmZpZ3VyZSUyMHRoZSUyME1vbmtleSdzJTIwYmVoYXZpb3VyJTIwZ2l2ZXMlMjB0aGVtJTIwYSUyMGxvdCUyMG1vcmUlMjBmcmVlZG9tJTIwaW4lMjBob3clMjB0aGV5JTIwd2FudCUyMHRvJTIwdXNlJTIwdGhlJTIwTW9ua2V5JTIwYW5kJTIwZW5hYmxlcyUyMG1vcmUlMjB1c2UlMjBjYXNlcy4lMEElMEElMjMlMjMlMjBXaGF0JTIwaXMlMjAlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBmaW5kJTIyJTNGJTBBJTBBVGhlJTIwTW9ua2V5JTIwaGFzJTIwYSUyMGZ1bmN0aW9uJTIwd2hpY2glMjBmaW5kcyUyMCUyMnZpY3RpbSUyMiUyMG1hY2hpbmVzJTIwb24lMjB0aGUlMjBuZXR3b3JrJTIwZm9yJTIwdGhlJTIwTW9ua2V5JTIwdG8lMjB0cnklMjBhbmQlMjBleHBsb2l0LiUyMEl0J3MlMjBjYWxsZWQlMjAlNjBnZXRfdmljdGltX21hY2hpbmVzJTYwLiUyMFRoaXMlMjBmdW5jdGlvbiUyMGFjY2VwdHMlMjBhbiUyMGFyZ3VtZW50JTIwd2hpY2glMjBsaW1pdHMlMjBob3clMjBtYW55JTIwbWFjaGluZXMlMjB0aGUlMjBNb25rZXklMjBzaG91bGQlMjBmaW5kLiUwQSUwQVdlJTIwd2FudCUyMHRvJTIwbWFrZSUyMHRoYXQlMjB2YWx1ZSUyMGVkaXRhYmxlJTIwYnklMjB0aGUlMjB1c2VyJTIwaW5zdGVhZCUyMG9mJTIwY29uc3RhbnQlMjBpbiUyMHRoZSUyMGNvZGUuJTBBJTBBJTIzJTIzJTIwTWFudWFsJTIwdGVzdGluZyUwQSUwQTEuJTIwQWZ0ZXIlMjB5b3UndmUlMjBwZXJmb3JtZWQlMjB0aGUlMjByZXF1aXJlZCUyMGNoYW5nZXMlMkMlMjByZWxvYWQlMjB0aGUlMjBTZXJ2ZXIlMjBhbmQlMjBjaGVjayUyMHlvdXIlMjB2YWx1ZSUyMGV4aXN0cyUyMGluJTIwdGhlJTIwSW50ZXJuYWwlMjB0YWIlMjBvZiUyMHRoZSUyMGNvbmZpZyUyMChzZWUlMjBpbWFnZSkuJTBBJTBBISU1QiU1RChodHRwcyUzQSUyRiUyRmkuaW1ndXIuY29tJTJGZTBYQXh1Vi5wbmcpJTBBJTBBMi4lMjBTZXQlMjB0aGUlMjBuZXclMjB2YWx1ZSUyMHRvJTIwMSUyQyUyMGFuZCUyMHJ1biUyME1vbmtleSUyMGxvY2FsbHklMjAoZnJvbSUyMHNvdXJjZSkuJTIwU2VlJTIwdGhhdCUyMHRoZSUyME1vbmtleSUyMG9ubHklMjBzY2FucyUyMG9uZSUyMG1hY2hpbmUu", - "summary": "KiUyMFdoZW4lMjBjaGFuZ2luZyUyMGNvbmZpZyUyMHNjaGVtYSUyMGJ5JTIwYWRkaW5nJTIwb3IlMjBkZWxldGluZyUyMGtleXMlMkMlMjB5b3UlMjBuZWVkJTIwdG8lMjB1cGRhdGUlMjB0aGUlMjBCbGFja2JveCUyMFRlc3QlMjBjb25maWd1cmF0aW9ucyUyMGFzJTIwd2VsbCUyMCU1QmhlcmUlNUQoaHR0cHMlM0ElMkYlMkZnaXRodWIuY29tJTJGZ3VhcmRpY29yZSUyRm1vbmtleSUyRnRyZWUlMkZkZXZlbG9wJTJGZW52cyUyRm1vbmtleV96b28lMkZibGFja2JveCUyRmlzbGFuZF9jb25maWdzKS4=", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQWluZGV4JTIwMWZiY2I4NzYuLjY3ZWQxOWRlJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZjb25maWcucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRmNvbmZpZy5weSUwQSU0MCU0MCUyMC0xMzElMkM5JTIwJTJCMTMxJTJDNiUyMCU0MCU0MCUyMGNsYXNzJTIwQ29uZmlndXJhdGlvbihvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZXhwbG9pdGVyX2NsYXNzZXMlMjAlM0QlMjAlNUIlNUQlMEElMjAlMjAlMjAlMjAlMjBzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3NlcyUyMCUzRCUyMCU1QiU1RCUwQSUyMCUwQS0lMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwbG9vayUyMGZvciUyMGluJTIwYSUyMHNpbmdsZSUyMHNjYW4lMjBpdGVyYXRpb24lMEEtJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZmluZCUyMCUzRCUyMDEwMCUwQS0lMEElMjAlMjAlMjAlMjAlMjAlMjMlMjBob3clMjBtYW55JTIwdmljdGltcyUyMHRvJTIwZXhwbG9pdCUyMGJlZm9yZSUyMHN0b3BwaW5nJTBBJTIwJTIwJTIwJTIwJTIwdmljdGltc19tYXhfZXhwbG9pdCUyMCUzRCUyMDEwMCUwQSUyMCUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEFpbmRleCUyMDQ0NGJkZTQ1Li5mZjIzZjY3MSUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZtb25rZXkucHklMEElNDAlNDAlMjAtMTU4JTJDNyUyMCUyQjE1OCUyQzclMjAlNDAlNDAlMjBjbGFzcyUyMEluZmVjdGlvbk1vbmtleShvYmplY3QpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBub3QlMjBzZWxmLl9rZWVwX3J1bm5pbmclMjBvciUyMG5vdCUyMFdvcm1Db25maWd1cmF0aW9uLmFsaXZlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMjAlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0RXb3JtQ29uZmlndXJhdGlvbi52aWN0aW1zX21heF9maW5kJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0QxMDAlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdG9wX2NhbGxiYWNrJTNEQ29udHJvbENsaWVudC5jaGVja19mb3Jfc3RvcCklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpc19lbXB0eSUyMCUzRCUyMFRydWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBmb3IlMjBtYWNoaW5lJTIwaW4lMjBtYWNoaW5lcyUzQSUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZpbnRlcm5hbC5weSUwQWluZGV4JTIwYmRiYWUyNDYuLmQ2MDQyZDM1JTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmludGVybmFsLnB5JTBBJTQwJTQwJTIwLTQwJTJDMTIlMjAlMkI0MCUyQzYlMjAlNDAlNDAlMjBJTlRFUk5BTCUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyTW9ua2V5JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMm9iamVjdCUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnByb3BlcnRpZXMlMjIlM0ElMjAlN0IlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydmljdGltc19tYXhfZmluZCUyMiUzQSUyMCU3QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0aXRsZSUyMiUzQSUyMCUyMk1heCUyMHZpY3RpbXMlMjB0byUyMGZpbmQlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZGVmYXVsdCUyMiUzQSUyMDEwMCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJkZXNjcmlwdGlvbiUyMiUzQSUyMCUyMkRldGVybWluZXMlMjB0aGUlMjBtYXhpbXVtJTIwbnVtYmVyJTIwb2YlMjBtYWNoaW5lcyUyMHRoZSUyMG1vbmtleSUyMGlzJTIwYWxsb3dlZCUyMHRvJTIwc2NhbiUyMiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ2aWN0aW1zX21heF9leHBsb2l0JTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydGl0bGUlMjIlM0ElMjAlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBleHBsb2l0JTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMmludGVnZXIlMjIlMkMlMEE=", + "dod": "Make the max victim number that Monkey will find before stopping configurable by the user instead of constant.", + "description": "# Make something configurable\n\nIn this unit, you will learn how to add a configuration option to Monkey and how to use it in the Monkey Agent code. \n\n![computer fire](https://media.giphy.com/media/7J4P7cUur2DlErijp3/giphy.gif \"computer fire\")\n\n## Why is this important?\n\nEnabling users to configure the Monkey's behaviour gives them a lot more freedom in how they want to use the Monkey and enables more use cases.\n\n## What is \"Max victims to find\"?\n\nThe Monkey has a function which finds \"victim\" machines on the network for the Monkey to try and exploit. It's called `get_victim_machines`. This function accepts an argument which limits how many machines the Monkey should find.\n\nWe want to make that value editable by the user instead of constant in the code.\n\n## Manual testing\n\n1. After you've performed the required changes, reload the Server and check your value exists in the Internal tab of the config (see image).\n\n![](https://i.imgur.com/e0XAxuV.png)\n\n2. Set the new value to 1, and run Monkey locally (from source). See that the Monkey only scans one machine.", + "summary": "* When changing config schema by adding or deleting keys, you need to update the Blackbox Test configurations as well [here](https://github.com/guardicore/monkey/tree/develop/envs/monkey_zoo/blackbox/island_configs).", + "hunksOrder": [ + "monkey/infection_monkey/config.py_0", + "monkey/infection_monkey/monkey.py_0", + "monkey/monkey_island/cc/services/config_schema/internal.py_0" + ], "tests": [], "hints": [ "Look for `victims_max_exploit` - it's rather similar." ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/infection_monkey/config.py": { - "index": [ - "1fbcb876..67ed19de", - "100644" - ], - "fileA": "monkey/infection_monkey/config.py", - "fileB": "monkey/infection_monkey/config.py", - "status": "MODIFIED", - "numLineDeletions": 3, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMzElMkM5JTIwJTJCMTMxJTJDNiUyMCU0MCU0MCUyMGNsYXNzJTIwQ29uZmlndXJhdGlvbihvYmplY3QpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGV4cGxvaXRlcl9jbGFzc2VzJTIwJTNEJTIwJTVCJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMxJTJDJTIyYiUyMiUzQTEzMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHN5c3RlbV9pbmZvX2NvbGxlY3Rvcl9jbGFzc2VzJTIwJTNEJTIwJTVCJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMyJTJDJTIyYiUyMiUzQTEzMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzMyUyQyUyMmIlMjIlM0ExMzMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIzJTIwaG93JTIwbWFueSUyMHZpY3RpbXMlMjB0byUyMGxvb2slMjBmb3IlMjBpbiUyMGElMjBzaW5nbGUlMjBzY2FuJTIwaXRlcmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHZpY3RpbXNfbWF4X2ZpbmQlMjAlM0QlMjAxMDAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMzUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIzJTIwaG93JTIwbWFueSUyMHZpY3RpbXMlMjB0byUyMGV4cGxvaXQlMjBiZWZvcmUlMjBzdG9wcGluZyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzNyUyQyUyMmIlMjIlM0ExMzQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB2aWN0aW1zX21heF9leHBsb2l0JTIwJTNEJTIwMTAwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTM4JTJDJTIyYiUyMiUzQTEzNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzOSUyQyUyMmIlMjIlM0ExMzYlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMzElMkMlMjJsaW5lc0NvdW50JTIyJTNBOSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMzElMkMlMjJsaW5lc0NvdW50JTIyJTNBNiU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/config.py b/monkey/infection_monkey/config.py\nindex 1fbcb876..67ed19de 100644\n--- a/monkey/infection_monkey/config.py\n+++ b/monkey/infection_monkey/config.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -131,8 +131,6 @@", + " exploiter_classes = []\r", + " system_info_collector_classes = []\r", + " \r", + "- # how many victims to look for in a single scan iteration\r", + "- victims_max_find = 100\r", + " \r", + " # how many victims to exploit before stopping\r", + " victims_max_exploit = 100\r" + ] + } ] }, "monkey/infection_monkey/monkey.py": { - "index": [ - "444bde45..ff23f671", - "100644" - ], - "fileA": "monkey/infection_monkey/monkey.py", - "fileB": "monkey/infection_monkey/monkey.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xNTglMkM3JTIwJTJCMTU4JTJDNyUyMCU0MCU0MCUyMGNsYXNzJTIwSW5mZWN0aW9uTW9ua2V5KG9iamVjdCklM0ElMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjBub3QlMjBzZWxmLl9rZWVwX3J1bm5pbmclMjBvciUyMG5vdCUyMFdvcm1Db25maWd1cmF0aW9uLmFsaXZlJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTU4JTJDJTIyYiUyMiUzQTE1OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJyZWFrJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTU5JTJDJTIyYiUyMiUzQTE1OSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2MCUyQyUyMmIlMjIlM0ExNjAlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0RXb3JtQ29uZmlndXJhdGlvbi52aWN0aW1zX21heF9maW5kJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYxJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbWFjaGluZXMlMjAlM0QlMjBzZWxmLl9uZXR3b3JrLmdldF92aWN0aW1fbWFjaGluZXMobWF4X2ZpbmQlM0QxMDAlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0ExNjElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdG9wX2NhbGxiYWNrJTNEQ29udHJvbENsaWVudC5jaGVja19mb3Jfc3RvcCklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNjIlMkMlMjJiJTIyJTNBMTYyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaXNfZW1wdHklMjAlM0QlMjBUcnVlJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYzJTJDJTIyYiUyMiUzQTE2MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGZvciUyMG1hY2hpbmUlMjBpbiUyMG1hY2hpbmVzJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTY0JTJDJTIyYiUyMiUzQTE2NCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTE1OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTE1OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/monkey.py b/monkey/infection_monkey/monkey.py\nindex 444bde45..ff23f671 100644\n--- a/monkey/infection_monkey/monkey.py\n+++ b/monkey/infection_monkey/monkey.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -159,8 +159,6 @@", + " if not self._keep_running or not WormConfiguration.alive:\r", + " break\r", + " \r", + "- machines = self._network.get_victim_machines(max_find=WormConfiguration.victims_max_find,\r", + "- stop_callback=ControlClient.check_for_stop)\r", + " is_empty = True\r", + " for machine in machines:\r", + " if ControlClient.check_for_stop():\r" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/internal.py": { - "index": [ - "bdbae246..d6042d35", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/internal.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/internal.py", - "status": "MODIFIED", - "numLineDeletions": 6, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00MCUyQzEyJTIwJTJCNDAlMkM2JTIwJTQwJTQwJTIwSU5URVJOQUwlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydGl0bGUlNUMlMjIlM0ElMjAlNUMlMjJNb25rZXklNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MCUyQyUyMmIlMjIlM0E0MCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJvYmplY3QlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MSUyQyUyMmIlMjIlM0E0MSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnByb3BlcnRpZXMlNUMlMjIlM0ElMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MiUyQyUyMmIlMjIlM0E0MiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ2aWN0aW1zX21heF9maW5kJTVDJTIyJTNBJTIwJTdCJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydGl0bGUlNUMlMjIlM0ElMjAlNUMlMjJNYXglMjB2aWN0aW1zJTIwdG8lMjBmaW5kJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMmludGVnZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJkZWZhdWx0JTVDJTIyJTNBJTIwMTAwJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZGVzY3JpcHRpb24lNUMlMjIlM0ElMjAlNUMlMjJEZXRlcm1pbmVzJTIwdGhlJTIwbWF4aW11bSUyMG51bWJlciUyMG9mJTIwbWFjaGluZXMlMjB0aGUlMjBtb25rZXklMjBpcyUyMGFsbG93ZWQlMjB0byUyMHNjYW4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnZpY3RpbXNfbWF4X2V4cGxvaXQlNUMlMjIlM0ElMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OSUyQyUyMmIlMjIlM0E0MyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyTWF4JTIwdmljdGltcyUyMHRvJTIwZXhwbG9pdCU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUwJTJDJTIyYiUyMiUzQTQ0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMmludGVnZXIlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1MSUyQyUyMmIlMjIlM0E0NSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQwJTJDJTIybGluZXNDb3VudCUyMiUzQTEyJTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQwJTJDJTIybGluZXNDb3VudCUyMiUzQTYlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/internal.py b/monkey/monkey_island/cc/services/config_schema/internal.py\nindex bdbae246..d6042d35 100644\n--- a/monkey/monkey_island/cc/services/config_schema/internal.py\n+++ b/monkey/monkey_island/cc/services/config_schema/internal.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -40,12 +40,6 @@", + " \"title\": \"Monkey\",\r", + " \"type\": \"object\",\r", + " \"properties\": {\r", + "- \"victims_max_find\": {\r", + "- \"title\": \"Max victims to find\",\r", + "- \"type\": \"integer\",\r", + "- \"default\": 100,\r", + "- \"description\": \"Determines the maximum number of machines the monkey is allowed to scan\"\r", + "- },\r", + " \"victims_max_exploit\": {\r", + " \"title\": \"Max victims to exploit\",\r", + " \"type\": \"integer\",\r" + ] + } ] } }, - "app_version": "0.1.80", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4", + "last_commit_sha_for_swimm_patch": "17ee823b086f0b027612e2d1864930d2c5593c3e" } \ No newline at end of file From 3daedd7a41b97f8395f382cf9f639e779fb451ce Mon Sep 17 00:00:00 2001 From: Swimm <swimm@swimm.io> Date: Thu, 28 Jan 2021 19:26:08 +0200 Subject: [PATCH 24/38] Swimm: update unit Add details about your new PBA (id: JFXftJml8DpmuCPBA9rL). --- .swm/JFXftJml8DpmuCPBA9rL.swm | 55 +++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/.swm/JFXftJml8DpmuCPBA9rL.swm b/.swm/JFXftJml8DpmuCPBA9rL.swm index 7c186126e..154c473bd 100644 --- a/.swm/JFXftJml8DpmuCPBA9rL.swm +++ b/.swm/JFXftJml8DpmuCPBA9rL.swm @@ -1,30 +1,49 @@ { "id": "JFXftJml8DpmuCPBA9rL", "name": "Add details about your new PBA", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIweW91ciUyMG5ldyUyMFBCQSdzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbi4=", - "description": "SW4lMjBvcmRlciUyMHRvJTIwbWFrZSUyMHN1cmUlMjB0aGF0JTIwdGhlJTIwbmV3JTIwJTYwU2NoZWR1bGVKb2JzJTYwJTIwUEJBJTIwaXMlMjBzaG93biUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTJDJTIweW91JTIwbmVlZCUyMHRvJTIwYWRkJTIwaXRzJTIwZGV0YWlscyUyMHRvJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGZpbGUocykuJTIwJTNDYnIlM0UlM0NiciUzRSUwQSUwQVNpbmNlJTIwdGhpcyUyMHBhcnRpY3VsYXIlMjBQQkElMjBpcyUyMHJlbGF0ZWQlMjB0byUyMHRoZSUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMCU1QlQxMTY4JTVEKGh0dHBzJTNBJTJGJTJGYXR0YWNrLm1pdHJlLm9yZyUyRnRlY2huaXF1ZXMlMkZUMTE2OCklMjBhbmQlMjAlNUJUMTA1MyU1RChodHRwcyUzQSUyRiUyRmF0dGFjay5taXRyZS5vcmclMkZ0ZWNobmlxdWVzJTJGVDEwNTMpJTJDJTIwbWFrZSUyMHN1cmUlMjB0byUyMGxpbmslMjB0aGUlMjBQQkElMjB3aXRoJTIwdGhlc2UlMjB0ZWNobmlxdWVzJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwYXMlMjB3ZWxsLiUyMCUzQ2JyJTNFJTNDYnIlM0UlMEElMEFFYWNoJTIwcGFydCUyMG9mJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMGhhcyUyMGFuJTIwaW1wb3J0YW50JTIwcm9sZSUyMCUyMCUwQS0lMjAqZW51bSolMjAlRTIlODAlOTQlMjBjb250YWlucyUyMHRoZSUyMHJlbGV2YW50JTIwUEJBJ3MlMjBjbGFzcyUyMG5hbWUocyklMEEtJTIwKnRpdGxlKiUyMCVFMiU4MCU5NCUyMGhvbGRzJTIwdGhlJTIwbmFtZSUyMG9mJTIwdGhlJTIwUEJBJTIwd2hpY2glMjBpcyUyMGRpc3BsYXllZCUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMG9uJTIwdGhlJTIwTW9ua2V5JTIwSXNsYW5kJTBBLSUyMCppbmZvKiUyMCVFMiU4MCU5NCUyMGNvbnNpc3RzJTIwb2YlMjBhbiUyMGVsYWJvcmF0aW9uJTIwb24lMjB0aGUlMjBQQkEncyUyMHdvcmtpbmclMjB3aGljaCUyMGlzJTIwZGlzcGxheWVkJTIwaW4lMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwKmF0dGFja190ZWNobmlxdWVzKiUyMCVFMiU4MCU5NCUyMGhhcyUyMHRoZSUyMElEcyUyMG9mJTIwdGhlJTIwTUlUUkUlMjB0ZWNobmlxdWVzJTIwYXNzb2NpYXRlZCUyMHdpdGglMjB0aGUlMjBQQkElMEElMEElMjMlMjMlMjBNYW51YWwlMjB0ZXN0JTIwJTIwJTBBT25jZSUyMHlvdSUyMHRoaW5rJTIweW91J3JlJTIwZG9uZS4uLiUwQS0lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEtJTIwWW91JTIwc2hvdWxkJTIwYmUlMjBhYmxlJTIwdG8lMjBzZWUlMjB5b3VyJTIwbmV3JTIwUEJBJTIwdW5kZXIlMjB0aGUlMjAlMjJNb25rZXklMjIlMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjBhbG9uZyUyMHdpdGglMjBpdHMlMjBpbmZvcm1hdGlvbiUyMHdoZW4lMjB5b3UlMjBjbGljayUyMG9uJTIwaXQlMEEtJTIwRnVydGhlciUyQyUyMHdoZW4lMjB5b3UlMjBlbmFibGUlMkZkaXNhYmxlJTIwdGhlJTIwYXNzb2NpYXRlZCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMHVuZGVyJTIwdGhlJTIwQVRUJTI2Q0slMjB0YWIlMjBpbiUyMHRoZSUyMGNvbmZpZ3VyYXRpb24lMkMlMjB0aGUlMjBQQkElMjBzaG91bGQlMjBhbHNvJTIwYmUlMjBlbmFibGVkJTJGZGlzYWJsZWQlMEElMEElM0NpbWclMjBzcmMlM0QlMjJodHRwcyUzQSUyRiUyRmkuaW1ndXIuY29tJTJGYTVWU2tMNS5naWYlMjIlMjBoZWlnaHQlM0Q0MDAlM0U=", - "summary": "LSUyMFRoZSUyMFBCQSUyMGRldGFpbHMlMjBpbiUyMHRoaXMlMjBmaWxlJTIwYXJlJTIwcmVmbGVjdGVkJTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMjBpbiUyMHRoZSUyMFBCQSUyMGNvbmZpZ3VyYXRpb24uJTBBLSUyMFBCQXMlMjBhcmUlMjBhbHNvJTIwbGlua2VkJTIwdG8lMjB0aGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlcyUyMGluJTIwdGhpcyUyMGZpbGUlMkMlMjB3aG9zZSUyMHJlc3VsdHMlMjBjYW4lMjB0aGVuJTIwYmUlMjBzZWVuJTIwaW4lMjB0aGUlMjBNSVRSRSUyMEFUVCUyNkNLJTIwcmVwb3J0JTIwb24lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQu", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYxZmUwZjZmLi5jY2UzN2IyNCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTYyJTJDMTUlMjAlMkI2MiUyQzclMjAlNDAlNDAlMjBQT1NUX0JSRUFDSF9BQ1RJT05TJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyUmVtb3ZlcyUyMHRoZSUyMGZpbGUlMjBhZnRlcndhcmRzLiUyMiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmF0dGFja190ZWNobmlxdWVzJTIyJTNBJTIwJTVCJTIyVDExNjYlMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJTY2hlZHVsZUpvYnMlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIySm9iJTIwc2NoZWR1bGluZyUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJpbmZvJTIyJTNBJTIwJTIyQXR0ZW1wdHMlMjB0byUyMGNyZWF0ZSUyMGElMjBzY2hlZHVsZWQlMjBqb2IlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMHJlbW92ZSUyMGl0LiUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJhdHRhY2tfdGVjaG5pcXVlcyUyMiUzQSUyMCU1QiUyMlQxMTY4JTIyJTJDJTIwJTIyVDEwNTMlMjIlNUQlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTBBJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEFERCUyMERFVEFJTFMlMjBIRVJFISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add your new PBA's details to the configuration.", + "description": "In order to make sure that the new `ScheduleJobs` PBA is shown in the configuration on the Monkey Island, you need to add its details to the configuration file(s). <br><br>\n\nSince this particular PBA is related to the MITRE techniques [T1168](https://attack.mitre.org/techniques/T1168) and [T1053](https://attack.mitre.org/techniques/T1053), make sure to link the PBA with these techniques in the configuration as well. <br><br>\n\nEach part of the configuration has an important role \n- *enum* — contains the relevant PBA's class name(s)\n- *title* — holds the name of the PBA which is displayed in the configuration on the Monkey Island\n- *info* — consists of an elaboration on the PBA's working which is displayed in the configuration on the Monkey Island\n- *attack_techniques* — has the IDs of the MITRE techniques associated with the PBA\n\n## Manual test \nOnce you think you're done...\n- Run the Monkey Island\n- You should be able to see your new PBA under the \"Monkey\" tab in the configuration, along with its information when you click on it\n- Further, when you enable/disable the associated MITRE techniques under the ATT&CK tab in the configuration, the PBA should also be enabled/disabled\n\n<img src=\"https://i.imgur.com/a5VSkL5.gif\" height=400>", + "summary": "- The PBA details in this file are reflected on the Monkey Island in the PBA configuration.\n- PBAs are also linked to the relevant MITRE techniques in this file, whose results can then be seen in the MITRE ATT&CK report on the Monkey Island.", + "hunksOrder": [ + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], "tests": [], "hints": [ "Have a look at the details of the other techniques." ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f1fe0f6f..cce37b24", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC02MiUyQzE1JTIwJTJCNjIlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJSZW1vdmVzJTIwdGhlJTIwZmlsZSUyMGFmdGVyd2FyZHMuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjIlMkMlMjJiJTIyJTNBNjIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMTY2JTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjMlMkMlMjJiJTIyJTNBNjMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NCUyQyUyMmIlMjIlM0E2NCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNjYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMlNjaGVkdWxlSm9icyU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTY5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIySm9iJTIwc2NoZWR1bGluZyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTcwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmluZm8lNUMlMjIlM0ElMjAlNUMlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMHNjaGVkdWxlZCUyMGpvYiUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwcmVtb3ZlJTIwaXQuJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyYXR0YWNrX3RlY2huaXF1ZXMlNUMlMjIlM0ElMjAlNUIlNUMlMjJUMTE2OCU1QyUyMiUyQyUyMCU1QyUyMlQxMDUzJTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNzMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQUREJTIwREVUQUlMUyUyMEhFUkUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNjUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NCUyQyUyMmIlMjIlM0E2NiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NSUyQyUyMmIlMjIlM0E2NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3NiUyQyUyMmIlMjIlM0E2OCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTE1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTYyJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..b231f96c 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -62,15 +62,7 @@", + " \"Removes the file afterwards.\",", + " \"attack_techniques\": [\"T1166\"]", + " },", + "- {", + "+ # Swimmer: ADD DETAILS HERE!\",", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"ScheduleJobs\"", + "- ],", + "- \"title\": \"Job scheduling\",", + "- \"info\": \"Attempts to create a scheduled job on the system and remove it.\",", + "- \"attack_techniques\": [\"T1168\", \"T1053\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From a76eacf2405d943172d614af9fe25e97893653ad Mon Sep 17 00:00:00 2001 From: Swimm <swimm@swimm.io> Date: Thu, 28 Jan 2021 19:29:21 +0200 Subject: [PATCH 25/38] Swimm: update unit Add a simple Post Breach action (id: tbxb2cGgUiJQ8Btma0fp). --- .swm/tbxb2cGgUiJQ8Btma0fp.swm | 167 +++++++++++++++++++++++----------- 1 file changed, 115 insertions(+), 52 deletions(-) diff --git a/.swm/tbxb2cGgUiJQ8Btma0fp.swm b/.swm/tbxb2cGgUiJQ8Btma0fp.swm index e3be3fb14..406ded500 100644 --- a/.swm/tbxb2cGgUiJQ8Btma0fp.swm +++ b/.swm/tbxb2cGgUiJQ8Btma0fp.swm @@ -1,75 +1,138 @@ { "id": "tbxb2cGgUiJQ8Btma0fp", "name": "Add a simple Post Breach action", - "dod": "WW91JTIwc2hvdWxkJTIwYWRkJTIwYSUyMG5ldyUyMFBCQSUyMHRvJTIwdGhlJTIwTW9ua2V5JTIwd2hpY2glMjBjcmVhdGVzJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG1hY2hpbmUu", - "description": "UmVhZCUyMCU1Qm91ciUyMGRvY3VtZW50YXRpb24lMjBhYm91dCUyMGFkZGluZyUyMGElMjBuZXclMjBQQkElNUQoaHR0cHMlM0ElMkYlMkZ3d3cuZ3VhcmRpY29yZS5jb20lMkZpbmZlY3Rpb25tb25rZXklMkZkb2NzJTJGZGV2ZWxvcG1lbnQlMkZhZGRpbmctcG9zdC1icmVhY2gtYWN0aW9ucyUyRikuJTBBJTBBQWZ0ZXIlMjB0aGF0JTIwd2UlMjB3YW50JTIweW91JTIwdG8lMjBhZGQlMjB0aGUlMjBCYWNrZG9vclVzZXIlMjBQQkEuJTIwVGhlJTIwY29tbWFuZHMlMjB0aGF0JTIwYWRkJTIwdXNlcnMlMjBmb3IlMjBXaW4lMjBhbmQlMjBMaW51eCUyMGNhbiUyMGJlJTIwcmV0cmlldmVkJTIwZnJvbSUyMCU2MGdldF9jb21tYW5kc190b19hZGRfdXNlciU2MCUyMC0lMjBtYWtlJTIwc3VyZSUyMHlvdSUyMHNlZSUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUyMCUwQSUwQU5vdGUlMjB0aGF0JTIwdGhlJTIwUEJBJTIwc2hvdWxkJTIwaW1wYWN0JTIwdGhlJTIwVDExMzYlMjBNSVRSRSUyMHRlY2huaXF1ZSUyMGFzJTIwd2VsbCElMjAlMEElMEElMjMlMjBNYW51YWwlMjB0ZXN0JTIwdG8lMjBjb25maXJtJTBBJTBBMS4lMjBSdW4lMjB0aGUlMjBNb25rZXklMjBJc2xhbmQlMEEyLiUyME1ha2UlMjBzdXJlJTIweW91ciUyMG5ldyUyMFBCQSUyMGlzJTIwZW5hYmxlZCUyMGJ5JTIwZGVmYXVsdCUyMGluJTIwdGhlJTIwY29uZmlnJTIwLSUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEzLiUyMFJ1biUyME1vbmtleSUwQTQuJTIwU2VlJTIwdGhlJTIwUEJBJTIwaW4lMjB0aGUlMjBzZWN1cml0eSUyMHJlcG9ydCUwQTUlMkMlMjBTZWUlMjB0aGUlMjBQQkElMjBpbiUyMHRoZSUyME1JVFJFJTIwcmVwb3J0JTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHRlY2huaXF1ZSUwQQ==", - "summary": "VGFrZSUyMGElMjBsb29rJTIwYXQlMjB0aGUlMjBjb25maWd1cmF0aW9uJTIwb2YlMjB0aGUlMjBpc2xhbmQlMjBhZ2FpbiUyMC0lMjBzZWUlMjB0aGUlMjAlMjJjb21tYW5kJTIwdG8lMjBydW4lMjBhZnRlciUyMGJyZWFjaCUyMiUyMG9wdGlvbiUyMHdlJTIwb2ZmZXIlMjB0aGUlMjB1c2VyJTNGJTIwSXQncyUyMGltcGxlbWVudGVkJTIwZXhhY3RseSUyMGxpa2UlMjB5b3UlMjBkaWQlMjByaWdodCUyMG5vdyUyMGJ1dCUyMGVhY2glMjB1c2VyJTIwY2FuJTIwZG8lMjBpdCUyMGZvciUyMHRoZW1zZWx2ZXMuJTIwJTBBJTBBSG93ZXZlciUyQyUyMHdoYXQlMjBpZiUyMHRoZSUyMFBCQSUyMG5lZWRzJTIwdG8lMjBkbyUyMHN0dWZmJTIwd2hpY2glMjBpcyUyMG1vcmUlMjBjb21wbGV4JTIwdGhhbiUyMGp1c3QlMjBydW5uaW5nJTIwYSUyMGZldyUyMGNvbW1hbmRzJTNGJTIwSW4lMjB0aGF0JTIwY2FzZS4uLiUyMA==", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQWluZGV4JTIwYzNiYmE5OTUuLjAzMWY5YWQwJTIwMTAwNjQ0JTBBLS0tJTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZwb3N0X2JyZWFjaF9jb25zdHMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnBvc3RfYnJlYWNoX2NvbnN0cy5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlMjAlM0QlMjAlMjJDb21tdW5pY2F0ZSUyMGFzJTIwbmV3JTIwdXNlciUyMiUwQS1QT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTIwJTNEJTIwJTIyQmFja2Rvb3IlMjB1c2VyJTIyJTBBJTJCJTIzJTIwU3dpbW1lciUzQSUyMFBVVCUyMFRIRSUyME5FVyUyMENPTlNUJTIwSEVSRSElMEElMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCUyMkZpbGUlMjBleGVjdXRpb24lMjIlMEElMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSUyMiUwQSUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTIyJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZhZGRfdXNlci5weSUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEFpbmRleCUyMDU4YmU4OWExLi5kODQ3NmE5NyUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGcG9zdF9icmVhY2glMkZhY3Rpb25zJTJGYWRkX3VzZXIucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRmFkZF91c2VyLnB5JTBBJTQwJTQwJTIwLTElMkMxNSUyMCUyQjElMkM3JTIwJTQwJTQwJTBBLWZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjBQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkucG9zdF9icmVhY2gucGJhJTIwaW1wb3J0JTIwUEJBJTBBJTIwZnJvbSUyMGluZmVjdGlvbl9tb25rZXkudXRpbHMudXNlcnMlMjBpbXBvcnQlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIlMEElMjAlMEElMjAlMEElMjBjbGFzcyUyMEJhY2tkb29yVXNlcihQQkEpJTNBJTBBJTIwJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kcyUyQyUyMHdpbmRvd3NfY21kcyUyMCUzRCUyMGdldF9jb21tYW5kc190b19hZGRfdXNlciglMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24udXNlcl90b19hZGQlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwV29ybUNvbmZpZ3VyYXRpb24ucmVtb3RlX3VzZXJfcGFzcyklMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwbGludXhfY21kJTNEJyUyMCcuam9pbihsaW51eF9jbWRzKSUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwYXNzJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMEltcGwlMjBoZXJlISUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmF0dGFjayUyRnRlY2huaXF1ZV9yZXBvcnRzJTJGVDExMzYucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBaW5kZXglMjAwODZhMWMxMy4uZGE5OWU4NmMlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZhdHRhY2slMkZ0ZWNobmlxdWVfcmVwb3J0cyUyRlQxMTM2LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGYXR0YWNrJTJGdGVjaG5pcXVlX3JlcG9ydHMlMkZUMTEzNi5weSUwQSU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMCglMEEtJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyQiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSKSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUwQSUyMCUwQSU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTBBJTIwJTIwJTIwJTIwJTIwdW5zY2FubmVkX21zZyUyMCUzRCUyMCUyMk1vbmtleSUyMGRpZG4ndCUyMHRyeSUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTIyJTBBJTIwJTIwJTIwJTIwJTIwdXNlZF9tc2clMjAlM0QlMjAlMjJNb25rZXklMjBjcmVhdGVkJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMuJTIyJTBBLSUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiU1RCUwQSUyQiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTBBZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRmRlZmluaXRpb25zJTJGcG9zdF9icmVhY2hfYWN0aW9ucy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEFpbmRleCUyMGYzZTJhOWJmLi4yYzRhYTY2NCUyMDEwMDY0NCUwQS0tLSUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnBvc3RfYnJlYWNoX2FjdGlvbnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZwb3N0X2JyZWFjaF9hY3Rpb25zLnB5JTBBJTQwJTQwJTIwLTQlMkMxNSUyMCUyQjQlMkM3JTIwJTQwJTQwJTIwUE9TVF9CUkVBQ0hfQUNUSU9OUyUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMm1pZ2h0JTIwZG8lMjBhZnRlciUyMGJyZWFjaGluZyUyMGElMjBuZXclMjBtYWNoaW5lLiUyMFVzZWQlMjBpbiUyMEFUVCUyNkNLJTIwYW5kJTIwWmVybyUyMHRydXN0JTIwcmVwb3J0cy4lMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIyYW55T2YlMjIlM0ElMjAlNUIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJCYWNrZG9vclVzZXIlMjIlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVEJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnRpdGxlJTIyJTNBJTIwJTIyQmFjayUyMGRvb3IlMjB1c2VyJTIyJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmluZm8lMjIlM0ElMjAlMjJBdHRlbXB0cyUyMHRvJTIwY3JlYXRlJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMHN5c3RlbSUyMGFuZCUyMGRlbGV0ZSUyMGl0JTIwYWZ0ZXJ3YXJkcy4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTEzNiUyMiU1RCUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwQWRkJTIwbmV3JTIwUEJBJTIwaGVyZSUyMHRvJTIwY29uZmlnISUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMnR5cGUlMjIlM0ElMjAlMjJzdHJpbmclMjIlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBB", + "dod": "You should add a new PBA to the Monkey which creates a new user on the machine.", + "description": "Read [our documentation about adding a new PBA](https://www.guardicore.com/infectionmonkey/docs/development/adding-post-breach-actions/).\n\nAfter that we want you to add the BackdoorUser PBA. The commands that add users for Win and Linux can be retrieved from `get_commands_to_add_user` - make sure you see how to use this function correctly. \n\nNote that the PBA should impact the T1136 MITRE technique as well! \n\n# Manual test to confirm\n\n1. Run the Monkey Island\n2. Make sure your new PBA is enabled by default in the config - for this test, disable network scanning, exploiting, and all other PBAs\n3. Run Monkey\n4. See the PBA in the security report\n5, See the PBA in the MITRE report in the relevant technique\n", + "summary": "Take a look at the configuration of the island again - see the \"command to run after breach\" option we offer the user? It's implemented exactly like you did right now but each user can do it for themselves. \n\nHowever, what if the PBA needs to do stuff which is more complex than just running a few commands? In that case... ", + "hunksOrder": [ + "monkey/common/data/post_breach_consts.py_0", + "monkey/infection_monkey/post_breach/actions/add_user.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_0", + "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py_1", + "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py_0" + ], "tests": [], "hints": [ "See `ScheduleJobs` PBA for an example of a PBA which only uses shell commands.", "Make sure to add the PBA to the configuration as well.", "MITRE ATT&CK technique T1136 articulates that adversaries may create an account to maintain access to victim systems, therefore, the BackdoorUser PBA is relevant to it. Make sure to map this PBA to the MITRE ATT&CK configuration and report." ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/common/data/post_breach_consts.py": { - "index": [ - "c3bba995..031f9ad0", - "100644" - ], - "fileA": "monkey/common/data/post_breach_consts.py", - "fileB": "monkey/common/data/post_breach_consts.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTIwJTNEJTIwJTVDJTIyQ29tbXVuaWNhdGUlMjBhcyUyMG5ldyUyMHVzZXIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyMCUzRCUyMCU1QyUyMkJhY2tkb29yJTIwdXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTd2ltbWVyJTNBJTIwUFVUJTIwVEhFJTIwTkVXJTIwQ09OU1QlMjBIRVJFISUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9GSUxFX0VYRUNVVElPTiUyMCUzRCUyMCU1QyUyMkZpbGUlMjBleGVjdXRpb24lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQT1NUX0JSRUFDSF9TSEVMTF9TVEFSVFVQX0ZJTEVfTU9ESUZJQ0FUSU9OJTIwJTNEJTIwJTVDJTIyTW9kaWZ5JTIwc2hlbGwlMjBzdGFydHVwJTIwZmlsZSU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMFBPU1RfQlJFQUNIX0hJRERFTl9GSUxFUyUyMCUzRCUyMCU1QyUyMkhpZGUlMjBmaWxlcyUyMGFuZCUyMGRpcmVjdG9yaWVzJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E1JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/common/data/post_breach_consts.py b/monkey/common/data/post_breach_consts.py\nindex 25e6679c..05980288 100644\n--- a/monkey/common/data/post_breach_consts.py\n+++ b/monkey/common/data/post_breach_consts.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " POST_BREACH_COMMUNICATE_AS_NEW_USER = \"Communicate as new user\"", + "-POST_BREACH_BACKDOOR_USER = \"Backdoor user\"", + "+# Swimmer: PUT THE NEW CONST HERE!", + " POST_BREACH_FILE_EXECUTION = \"File execution\"", + " POST_BREACH_SHELL_STARTUP_FILE_MODIFICATION = \"Modify shell startup file\"", + " POST_BREACH_HIDDEN_FILES = \"Hide files and directories\"" + ] + } ] }, "monkey/infection_monkey/post_breach/actions/add_user.py": { - "index": [ - "58be89a1..d8476a97", - "100644" - ], - "fileA": "monkey/infection_monkey/post_breach/actions/add_user.py", - "fileB": "monkey/infection_monkey/post_breach/actions/add_user.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTUlMjAlMkIxJTJDNyUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGNvbW1vbi5kYXRhLnBvc3RfYnJlYWNoX2NvbnN0cyUyMGltcG9ydCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LmNvbmZpZyUyMGltcG9ydCUyMFdvcm1Db25maWd1cmF0aW9uJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnBvc3RfYnJlYWNoLnBiYSUyMGltcG9ydCUyMFBCQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnV0aWxzLnVzZXJzJTIwaW1wb3J0JTIwZ2V0X2NvbW1hbmRzX3RvX2FkZF91c2VyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNCUyQyUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwY2xhc3MlMjBCYWNrZG9vclVzZXIoUEJBKSUzQSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOCUyQyUyMmIlMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZHMlMkMlMjB3aW5kb3dzX2NtZHMlMjAlM0QlMjBnZXRfY29tbWFuZHNfdG9fYWRkX3VzZXIoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBXb3JtQ29uZmlndXJhdGlvbi51c2VyX3RvX2FkZCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFdvcm1Db25maWd1cmF0aW9uLnJlbW90ZV91c2VyX3Bhc3MpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoQmFja2Rvb3JVc2VyJTJDJTIwc2VsZikuX19pbml0X18oJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQkFDS0RPT1JfVVNFUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwSW1wbCUyMGhlcmUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/post_breach/actions/add_user.py b/monkey/infection_monkey/post_breach/actions/add_user.py\nindex 58be89a1..d8476a97 100644\n--- a/monkey/infection_monkey/post_breach/actions/add_user.py\n+++ b/monkey/infection_monkey/post_breach/actions/add_user.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,15 +1,7 @@", + "-from common.data.post_breach_consts import POST_BREACH_BACKDOOR_USER", + "-from infection_monkey.config import WormConfiguration", + " from infection_monkey.post_breach.pba import PBA", + " from infection_monkey.utils.users import get_commands_to_add_user", + " ", + " ", + " class BackdoorUser(PBA):", + " def __init__(self):", + "- linux_cmds, windows_cmds = get_commands_to_add_user(", + "+ pass # Swimmer: Impl here!", + "- WormConfiguration.user_to_add,", + "- WormConfiguration.remote_user_pass)", + "- super(BackdoorUser, self).__init__(", + "- POST_BREACH_BACKDOOR_USER,", + "- linux_cmd=' '.join(linux_cmds),", + "- windows_cmd=windows_cmds)" + ] + } ] }, "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py": { - "index": [ - "086a1c13..da99e86c", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "fileB": "monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", - "status": "MODIFIED", - "numLineDeletions": 2, - "numLineAdditions": 2, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5wb3N0X2JyZWFjaF9jb25zdHMlMjBpbXBvcnQlMjAoJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSUyQyUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMFBPU1RfQlJFQUNIX0JBQ0tET09SX1VTRVIlMkMlMjBQT1NUX0JSRUFDSF9DT01NVU5JQ0FURV9BU19ORVdfVVNFUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLmF0dGFjay50ZWNobmlxdWVfcmVwb3J0cy5wYmFfdGVjaG5pcXVlJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwUG9zdEJyZWFjaFRlY2huaXF1ZSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMSUyQzQlMjAlMkIxMSUyQzQlMjAlNDAlNDAlMjBjbGFzcyUyMFQxMTM2KFBvc3RCcmVhY2hUZWNobmlxdWUpJTNBJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHVuc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjBkaWRuJ3QlMjB0cnklMjBjcmVhdGluZyUyMGElMjBuZXclMjB1c2VyJTIwb24lMjB0aGUlMjBuZXR3b3JrJ3MlMjBzeXN0ZW1zLiU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwc2Nhbm5lZF9tc2clMjAlM0QlMjAlNUMlMjJNb25rZXklMjB0cmllZCUyMGNyZWF0aW5nJTIwYSUyMG5ldyUyMHVzZXIlMjBvbiUyMHRoZSUyMG5ldHdvcmsncyUyMHN5c3RlbXMlMkMlMjBidXQlMjBmYWlsZWQuJTVDJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlMkMlMjJiJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjB1c2VkX21zZyUyMCUzRCUyMCU1QyUyMk1vbmtleSUyMGNyZWF0ZWQlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwbmV0d29yaydzJTIwc3lzdGVtcy4lNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyUyQyUyMmIlMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBwYmFfbmFtZXMlMjAlM0QlMjAlNUJQT1NUX0JSRUFDSF9CQUNLRE9PUl9VU0VSJTJDJTIwUE9TVF9CUkVBQ0hfQ09NTVVOSUNBVEVfQVNfTkVXX1VTRVIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMHBiYV9uYW1lcyUyMCUzRCUyMCU1QlBPU1RfQlJFQUNIX0NPTU1VTklDQVRFX0FTX05FV19VU0VSJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTExJTJDJTIybGluZXNDb3VudCUyMiUzQTQlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\nindex 086a1c13..9f23bb8d 100644\n--- a/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py\n+++ b/monkey/monkey_island/cc/services/attack/technique_reports/T1136.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " from common.data.post_breach_consts import (", + "- POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER)", + "+ POST_BREACH_BACKDOOR_USER)", + " from monkey_island.cc.services.attack.technique_reports.pba_technique import \\", + " PostBreachTechnique", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -11,4 +11,4 @@", + " unscanned_msg = \"Monkey didn't try creating a new user on the network's systems.\"", + " scanned_msg = \"Monkey tried creating a new user on the network's systems, but failed.\"", + " used_msg = \"Monkey created a new user on the network's systems.\"", + "- pba_names = [POST_BREACH_BACKDOOR_USER, POST_BREACH_COMMUNICATE_AS_NEW_USER]", + "+ pba_names = [POST_BREACH_BACKDOOR_USER]" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py": { - "index": [ - "f3e2a9bf..2c4aa664", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", - "status": "MODIFIED", - "numLineDeletions": 9, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC00JTJDMTUlMjAlMkI0JTJDNyUyMCU0MCU0MCUyMFBPU1RfQlJFQUNIX0FDVElPTlMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIybWlnaHQlMjBkbyUyMGFmdGVyJTIwYnJlYWNoaW5nJTIwYSUyMG5ldyUyMG1hY2hpbmUuJTIwVXNlZCUyMGluJTIwQVRUJTI2Q0slMjBhbmQlMjBaZXJvJTIwdHJ1c3QlMjByZXBvcnRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjJhbnlPZiU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTYlMkMlMjJiJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnR5cGUlNUMlMjIlM0ElMjAlNUMlMjJzdHJpbmclNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMkJhY2tkb29yVXNlciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIyQmFjayUyMGRvb3IlMjB1c2VyJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMkF0dGVtcHRzJTIwdG8lMjBjcmVhdGUlMjBhJTIwbmV3JTIwdXNlciUyMG9uJTIwdGhlJTIwc3lzdGVtJTIwYW5kJTIwZGVsZXRlJTIwaXQlMjBhZnRlcndhcmRzLiU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmF0dGFja190ZWNobmlxdWVzJTVDJTIyJTNBJTIwJTVCJTVDJTIyVDExMzYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFN3aW1tZXIlM0ElMjBBZGQlMjBuZXclMjBQQkElMjBoZXJlJTIwdG8lMjBjb25maWchJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE2JTJDJTIyYiUyMiUzQTglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTclMkMlMjJiJTIyJTNBOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMmVudW0lNUMlMjIlM0ElMjAlNUIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCUyQyUyMmIlMjIlM0ExMCU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTQlMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBNCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\nindex f1fe0f6f..39ebd33a 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/post_breach_actions.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -4,15 +4,7 @@", + " \"might do after breaching a new machine. Used in ATT&CK and Zero trust reports.\",", + " \"type\": \"string\",", + " \"anyOf\": [", + "- {", + "+ # Swimmer: Add new PBA here to config!", + "- \"type\": \"string\",", + "- \"enum\": [", + "- \"BackdoorUser\"", + "- ],", + "- \"title\": \"Back door user\",", + "- \"info\": \"Attempts to create a new user on the system and delete it afterwards.\",", + "- \"attack_techniques\": [\"T1136\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From 49d37664364f2df4e0ddfce679f9a78952b78788 Mon Sep 17 00:00:00 2001 From: Swimm <swimm@swimm.io> Date: Thu, 28 Jan 2021 19:30:48 +0200 Subject: [PATCH 26/38] =?UTF-8?q?Swimm:=20update=20unit=20Implement=20a=20?= =?UTF-8?q?new=20PBA=20=E2=80=94=20=20`ScheduleJobs`=20(id:=20VW4rf3AxRslf?= =?UTF-8?q?T7lwaug7).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .swm/VW4rf3AxRslfT7lwaug7.swm | 53 +++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/.swm/VW4rf3AxRslfT7lwaug7.swm b/.swm/VW4rf3AxRslfT7lwaug7.swm index 65090e905..c4e8df928 100644 --- a/.swm/VW4rf3AxRslfT7lwaug7.swm +++ b/.swm/VW4rf3AxRslfT7lwaug7.swm @@ -1,31 +1,48 @@ { "id": "VW4rf3AxRslfT7lwaug7", "name": "Implement a new PBA — `ScheduleJobs`", - "dod": "WW91JTIwc2hvdWxkJTIwaW1wbGVtZW50JTIwYSUyMG5ldyUyMFBCQSUyMGluJTIwTW9ua2V5JTIwd2hpY2glMjBzY2hlZHVsZXMlMjBqb2JzJTIwb24lMjB0aGUlMjBtYWNoaW5lLg==", - "description": "WW91JTIwbmVlZCUyMHRvJTIwaW1wbGVtZW50JTIwdGhlJTIwJTYwU2NoZWR1bGVKb2JzJTYwJTIwUEJBJTIwd2hpY2glMjBjcmVhdGVzJTIwc2NoZWR1bGVkJTIwam9icyUyMG9uJTIwdGhlJTIwbWFjaGluZS4lMjAlM0NiciUzRSUzQ2JyJTNFJTBBJTNDaW1nJTIwc3JjJTNEJTIyaHR0cHMlM0ElMkYlMkZtZWRpYS5naXBoeS5jb20lMkZtZWRpYSUyRmwwSzRtVkU1YjVXWjFzY3RXJTJGZ2lwaHkuZ2lmJTIyJTIwaGVpZ2h0JTNEMTc1JTNFJTNDYnIlM0UlM0NiciUzRSUwQVRoZSUyMGNvbW1hbmRzJTIwdGhhdCUyMGFkZCUyMHNjaGVkdWxlZCUyMGpvYnMlMjBmb3IlMjBXaW5kb3dzJTIwYW5kJTIwTGludXglMjBjYW4lMjBiZSUyMHJldHJpZXZlZCUyMGZyb20lMjAlNjBnZXRfY29tbWFuZHNfdG9fc2NoZWR1bGVfam9icyU2MCUyMCVFMiU4MCU5NCUyMG1ha2UlMjBzdXJlJTIweW91JTIwdW5kZXJzdGFuZCUyMGhvdyUyMHRvJTIwdXNlJTIwdGhpcyUyMGZ1bmN0aW9uJTIwY29ycmVjdGx5LiUwQSUwQSUyMyUyMyUyME1hbnVhbCUyMHRlc3QlMjAlMjAlMEFPbmNlJTIweW91JTIwdGhpbmslMjB5b3UncmUlMjBkb25lLi4uJTBBLSUyMFJ1biUyMHRoZSUyME1vbmtleSUyMElzbGFuZCUwQS0lMjBNYWtlJTIwc3VyZSUyMHRoZSUyMCUyMkpvYiUyMHNjaGVkdWxpbmclMjIlMjBQQkElMjBpcyUyMGVuYWJsZWQlMjBpbiUyMHRoZSUyMCUyMk1vbmtleSUyMiUyMHRhYiUyMGluJTIwdGhlJTIwY29uZmlndXJhdGlvbiUyMCVFMiU4MCU5NCUyMGZvciUyMHRoaXMlMjB0ZXN0JTJDJTIwZGlzYWJsZSUyMG5ldHdvcmslMjBzY2FubmluZyUyQyUyMGV4cGxvaXRpbmclMkMlMjBhbmQlMjBhbGwlMjBvdGhlciUyMFBCQXMlMEEtJTIwUnVuJTIwdGhlJTIwTW9ua2V5JTBBLSUyME1ha2UlMjBzdXJlJTIweW91JTIwc2VlJTIwdGhlJTIwUEJBJTIwd2l0aCUyMGl0cyUyMHJlc3VsdHMlMjBpbiUyMHRoZSUyMFNlY3VyaXR5JTIwcmVwb3J0JTIwYXMlMjB3ZWxsJTIwYXMlMjBpbiUyMHRoZSUyMEFUVCUyNkNLJTIwcmVwb3J0JTIwdW5kZXIlMjB0aGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlJTBBJTBBJTNDaW1nJTIwc3JjJTNEJTIyaHR0cHMlM0ElMkYlMkZmaXJlYmFzZXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20lMkZ2MCUyRmIlMkZzd2ltbWlvLWNvbnRlbnQlMkZvJTJGcmVwb3NpdG9yaWVzJTI1MkY2TmxiOTlOdFk1RmMzYlNkOHN1SCUyNTJGaW1nJTI1MkZmMGU1M2U2Yy05ZGJlLTQxZDgtOTQ1NC0yYjU3NjFjM2Y1M2EucG5nJTNGYWx0JTNEbWVkaWElMjZ0b2tlbiUzRDIxYWE0YmI4LTdlYmUtNGRhYi1hNzM5LWM3N2UwNTkxNDRkZCUyMiUyMGhlaWdodCUzRDQwMCUzRSUwQSUzQ2JyJTNFJTNDYnIlM0UlMEElM0NpbWclMjBzcmMlM0QlMjJodHRwcyUzQSUyRiUyRmZpcmViYXNlc3RvcmFnZS5nb29nbGVhcGlzLmNvbSUyRnYwJTJGYiUyRnN3aW1taW8tY29udGVudCUyRm8lMkZyZXBvc2l0b3JpZXMlMjUyRjZObGI5OU50WTVGYzNiU2Q4c3VIJTI1MkZpbWclMjUyRjUyODM4OWEwLTM1YzgtNDM4MC1iNmUyLTM1MzA2OGVkMDFlNC5wbmclM0ZhbHQlM0RtZWRpYSUyNnRva2VuJTNEMDg3NjdmNTUtODZlMi00ZjUxLThlY2YtMTNmZDZjYzI1YWQ1JTIyJTIwaGVpZ2h0JTNENDAwJTNF", - "summary": "TWFueSUyMG90aGVyJTIwUEJBcyUyMGFyZSUyMGFzJTIwc2ltcGxlJTIwYXMlMjB0aGlzJTIwb25lJTJDJTIwdXNpbmclMjBzaGVsbCUyMGNvbW1hbmRzJTIwb3IlMjBzY3JpcHRzJTIwJUUyJTgwJTk0JTIwc2VlJTIwJTYwVGltZXN0b21waW5nJTYwJTIwYW5kJTIwJTYwQWNjb3VudERpc2NvdmVyeSU2MC4lMjAlM0NiciUzRSUzQ2JyJTNFJTBBJTBBSG93ZXZlciUyQyUyMGZvciUyMGxlc3MlMjBzdHJhaWdodGZvcndhcmQlMjBvbmVzJTJDJTIweW91JTIwY2FuJTIwb3ZlcnJpZGUlMjBmdW5jdGlvbnMlMjBhbmQlMjBpbXBsZW1lbnQlMjBuZXclMjBjbGFzc2VzJTIwZGVwZW5kaW5nJTIwb24lMjB3aGF0JTIwaXMlMjByZXF1aXJlZCUyMCVFMiU4MCU5NCUyMHNlZSUyMCU2MFNpZ25lZFNjcmlwdFByb3h5RXhlY3V0aW9uJTYwJTIwYW5kJTIwJTYwTW9kaWZ5U2hlbGxTdGFydHVwRmlsZXMlNjAuJTNDYnIlM0UlM0NiciUzRSUwQSUwQVRoaXMlMjBQQkElMkMlMjBhbG9uZyUyMHdpdGglMjBhbGwlMjB0aGUlMjBvdGhlciUyMFBCQXMlMkMlMjB3aWxsJTIwcnVuJTIwb24lMjBhJTIwc3lzdGVtJTIwYWZ0ZXIlMjBpdCUyMGhhcyUyMGJlZW4lMjBicmVhY2hlZC4lMjBUaGUlMjBwdXJwb3NlJTIwb2YlMjB0aGlzJTIwY29kZSUyMGlzJTIwdG8lMjB0ZXN0JTIwd2hldGhlciUyMHRhcmdldCUyMHN5c3RlbXMlMjBhbGxvdyUyMGF0dGFja2VycyUyMHRvJTIwc2NoZWR1bGUlMjBqb2JzJTJDJTIwd2hpY2glMjB0aGV5JTIwY291bGQlMjB1c2UlMjB0byUyMHJ1biUyMG1hbGljaW91cyUyMGNvZGUlMjBhdCUyMHNvbWUlMjBzcGVjaWZpZWQlMjBkYXRlJTIwYW5kJTIwdGltZS4=", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZzY2hlZHVsZV9qb2JzLnB5JTIwYiUyRm1vbmtleSUyRmluZmVjdGlvbl9tb25rZXklMkZwb3N0X2JyZWFjaCUyRmFjdGlvbnMlMkZzY2hlZHVsZV9qb2JzLnB5JTBBaW5kZXglMjBkNmNkZDI3Ni4uNzlhNzcyNGQlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRnNjaGVkdWxlX2pvYnMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnBvc3RfYnJlYWNoJTJGYWN0aW9ucyUyRnNjaGVkdWxlX2pvYnMucHklMEElNDAlNDAlMjAtMTAlMkMxMCUyMCUyQjEwJTJDNSUyMCU0MCU0MCUyMGNsYXNzJTIwU2NoZWR1bGVKb2JzKFBCQSklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMEElMjAlMjAlMjAlMjAlMjBkZWYlMjBfX2luaXRfXyhzZWxmKSUzQSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX3NjaGVkdWxlX2pvYnMoKSUwQS0lMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwc3VwZXIoU2NoZWR1bGVKb2JzJTJDJTIwc2VsZikuX19pbml0X18obmFtZSUzRFBPU1RfQlJFQUNIX0pPQl9TQ0hFRFVMSU5HJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwd2luZG93c19jbWQlM0R3aW5kb3dzX2NtZHMpJTBBLSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZW1vdmVfc2NoZWR1bGVkX2pvYnMoKSUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHBhc3MlMEElMkIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBTd2ltbWVyJTNBJTIwSU1QTEVNRU5UJTIwSEVSRSElMEE=", + "dod": "You should implement a new PBA in Monkey which schedules jobs on the machine.", + "description": "You need to implement the `ScheduleJobs` PBA which creates scheduled jobs on the machine. <br><br>\n<img src=\"https://media.giphy.com/media/l0K4mVE5b5WZ1sctW/giphy.gif\" height=175><br><br>\nThe commands that add scheduled jobs for Windows and Linux can be retrieved from `get_commands_to_schedule_jobs` — make sure you understand how to use this function correctly.\n\n## Manual test \nOnce you think you're done...\n- Run the Monkey Island\n- Make sure the \"Job scheduling\" PBA is enabled in the \"Monkey\" tab in the configuration — for this test, disable network scanning, exploiting, and all other PBAs\n- Run the Monkey\n- Make sure you see the PBA with its results in the Security report as well as in the ATT&CK report under the relevant MITRE technique\n\n<img src=\"https://firebasestorage.googleapis.com/v0/b/swimmio-content/o/repositories%2F6Nlb99NtY5Fc3bSd8suH%2Fimg%2Ff0e53e6c-9dbe-41d8-9454-2b5761c3f53a.png?alt=media&token=21aa4bb8-7ebe-4dab-a739-c77e059144dd\" height=400>\n<br><br>\n<img src=\"https://firebasestorage.googleapis.com/v0/b/swimmio-content/o/repositories%2F6Nlb99NtY5Fc3bSd8suH%2Fimg%2F528389a0-35c8-4380-b6e2-353068ed01e4.png?alt=media&token=08767f55-86e2-4f51-8ecf-13fd6cc25ad5\" height=400>", + "summary": "Many other PBAs are as simple as this one, using shell commands or scripts — see `Timestomping` and `AccountDiscovery`. <br><br>\n\nHowever, for less straightforward ones, you can override functions and implement new classes depending on what is required — see `SignedScriptProxyExecution` and `ModifyShellStartupFiles`.<br><br>\n\nThis PBA, along with all the other PBAs, will run on a system after it has been breached. The purpose of this code is to test whether target systems allow attackers to schedule jobs, which they could use to run malicious code at some specified date and time.", + "hunksOrder": [ + "monkey/infection_monkey/post_breach/actions/schedule_jobs.py_0" + ], "tests": [], "hints": [ "Check out the `Timestomping` PBA to get an idea about the implementation.", "Don't forget to add code to remove the scheduled jobs!" ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/infection_monkey/post_breach/actions/schedule_jobs.py": { - "index": [ - "d6cdd276..79a7724d", - "100644" - ], - "fileA": "monkey/infection_monkey/post_breach/actions/schedule_jobs.py", - "fileB": "monkey/infection_monkey/post_breach/actions/schedule_jobs.py", - "status": "MODIFIED", - "numLineDeletions": 7, - "numLineAdditions": 2, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xMCUyQzEwJTIwJTJCMTAlMkM1JTIwJTQwJTQwJTIwY2xhc3MlMjBTY2hlZHVsZUpvYnMoUEJBKSUzQSUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlNUMlMjIlNUMlMjIlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCUyQyUyMmIlMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTExJTJDJTIyYiUyMiUzQTExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMiUyQyUyMmIlMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBsaW51eF9jbWRzJTJDJTIwd2luZG93c19jbWRzJTIwJTNEJTIwZ2V0X2NvbW1hbmRzX3RvX3NjaGVkdWxlX2pvYnMoKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKFNjaGVkdWxlSm9icyUyQyUyMHNlbGYpLl9faW5pdF9fKG5hbWUlM0RQT1NUX0JSRUFDSF9KT0JfU0NIRURVTElORyUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE1JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGxpbnV4X2NtZCUzRCclMjAnLmpvaW4obGludXhfY21kcyklMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB3aW5kb3dzX2NtZCUzRHdpbmRvd3NfY21kcyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZW1vdmVfc2NoZWR1bGVkX2pvYnMoKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcGFzcyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTEzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwU3dpbW1lciUzQSUyMElNUExFTUVOVCUyMEhFUkUhJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMTQlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMCUyQyUyMmxpbmVzQ291bnQlMjIlM0ExMCU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExMCUyQyUyMmxpbmVzQ291bnQlMjIlM0E1JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/post_breach/actions/schedule_jobs.py b/monkey/infection_monkey/post_breach/actions/schedule_jobs.py\nindex f7d8d805..06839463 100644\n--- a/monkey/infection_monkey/post_breach/actions/schedule_jobs.py\n+++ b/monkey/infection_monkey/post_breach/actions/schedule_jobs.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -10,12 +10,6 @@", + " \"\"\"", + " ", + " def __init__(self):", + "- linux_cmds, windows_cmds = get_commands_to_schedule_jobs()", + "+ pass", + " ", + "- super(ScheduleJobs, self).__init__(name=POST_BREACH_JOB_SCHEDULING,", + "+ # Swimmer: IMPLEMENT HERE!", + "- linux_cmd=' '.join(linux_cmds),", + "- windows_cmd=windows_cmds)", + "- ", + "- def run(self):", + "- super(ScheduleJobs, self).run()", + "- remove_scheduled_jobs()" + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From 98e26b0be139b82641c4b8ed612e0c88e6bba225 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 11:23:24 -0500 Subject: [PATCH 27/38] ui: refactor getHideResetState() to use isSafe() --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 955aec509..834dcec3f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -108,7 +108,7 @@ class AdvancedMultiSelect extends React.Component { } getHideResetState(selectValues) { - return selectValues.every((value) => this.defaultValues.includes(value)); + return selectValues.every((value) => this.isSafe(value)); } setPaneInfo = (itemKey) => { From e43c91e87e68ca67317ba727f862752db4882ca4 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 13:06:21 -0500 Subject: [PATCH 28/38] ui: Show warning message when master checkbox selected with unsafe --- .../ui-components/AdvancedMultiSelect.js | 37 ++++++++++------ .../src/components/ui-components/InfoPane.js | 43 +++++++++++++------ 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 834dcec3f..575dbae8e 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -3,7 +3,7 @@ import {Button, Card} from 'react-bootstrap'; import {cloneDeep} from 'lodash'; -import {getDefaultPaneParams, InfoPane} from './InfoPane'; +import {getDefaultPaneParams, InfoPane, WarningType} from './InfoPane'; import {MasterCheckbox, MasterCheckboxState} from './MasterCheckbox'; import ChildCheckboxContainer from './ChildCheckbox'; import {getFullDefinitionByKey} from './JsonSchemaHelpers'; @@ -41,7 +41,11 @@ class AdvancedMultiSelect extends React.Component { this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), hideReset: this.getHideResetState(props.value), - infoPaneParams: getDefaultPaneParams(this.infoPaneRefString, this.registry) + infoPaneParams: getDefaultPaneParams( + this.infoPaneRefString, + this.registry, + this.unsafeOptionsSelected(this.props.value) + ) }; } @@ -55,6 +59,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(newValues); this.setMasterCheckboxState(newValues); this.setHideResetState(newValues); + this.setPaneInfoToDefault(this.unsafeOptionsSelected(newValues)); } onChildCheckboxClick = (value) => { @@ -98,7 +103,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(this.defaultValues); this.setHideResetState(this.defaultValues); this.setMasterCheckboxState(this.defaultValues); - this.setPaneInfoToDefault(); + this.setPaneInfoToDefault(this.unsafeOptionsSelected(this.defaultValues)); } setHideResetState(selectValues) { @@ -108,7 +113,15 @@ class AdvancedMultiSelect extends React.Component { } getHideResetState(selectValues) { - return selectValues.every((value) => this.isSafe(value)); + return !(this.unsafeOptionsSelected(selectValues)) + } + + unsafeOptionsSelected(selectValues) { + return !(selectValues.every((value) => this.isSafe(value))); + } + + isSafe = (itemKey) => { + return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; } setPaneInfo = (itemKey) => { @@ -119,22 +132,22 @@ class AdvancedMultiSelect extends React.Component { title: definitionObj.title, content: definitionObj.info, link: definitionObj.link, - showWarning: !(this.isSafe(itemKey)) + warningType: !(this.isSafe(itemKey)) ? WarningType.SINGLE : WarningType.NONE } } ); } - setPaneInfoToDefault() { + setPaneInfoToDefault(unsafeOptionsSelected) { this.setState(() => ({ - infoPaneParams: getDefaultPaneParams(this.props.schema.items.$ref, this.props.registry) + infoPaneParams: getDefaultPaneParams( + this.props.schema.items.$ref, + this.props.registry, + unsafeOptionsSelected + ) })); } - isSafe = (itemKey) => { - return getFullDefinitionByKey(this.infoPaneRefString, this.registry, itemKey).safe; - } - render() { const { schema, @@ -161,7 +174,7 @@ class AdvancedMultiSelect extends React.Component { <InfoPane title={this.state.infoPaneParams.title} body={this.state.infoPaneParams.content} link={this.state.infoPaneParams.link} - showWarning={this.state.infoPaneParams.showWarning}/> + warningType={this.state.infoPaneParams.warningType}/> </div> ); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index f0545a5c6..841eafe16 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -6,13 +6,19 @@ import {faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; import {getObjectFromRegistryByRef} from './JsonSchemaHelpers'; import WarningIcon from './WarningIcon'; -function getDefaultPaneParams(refString, registry) { +const WarningType = { + NONE: 0, + SINGLE: 1, + MULTIPLE: 2 +} + +function getDefaultPaneParams(refString, registry, unsafeOptionsSelected) { let configSection = getObjectFromRegistryByRef(refString, registry); return ( { title: configSection.title, content: configSection.description, - showWarning: false + warningType: unsafeOptionsSelected ? WarningType.Multiple : WarningType.NONE }); } @@ -56,8 +62,8 @@ function getSubtitle(props) { function getBody(props) { let body = [<span key={'body'}>{props.body}</span>]; - if (props.showWarning) { - body.push(getWarning()); + if (props.warningType != WarningType.NONE) { + body.push(getWarning(props.warningType)); } return ( @@ -67,14 +73,25 @@ function getBody(props) { ) } -function getWarning() { - return ( - <div className={'info-pane-warning'} key={'warning'}> - <WarningIcon/>This option may cause a system to become unstable or - change the system's state in undesirable ways. Therefore, this option - is not recommended for use in production or other sensitive environments. - </div> - ); +function getWarning(warningType) { + if (warningType == WarningType.SINGLE) { + return ( + <div className={'info-pane-warning'} key={'warning'}> + <WarningIcon/>This option may cause a system to become unstable or may + change a system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive environments. + </div> + ); + } else { + return ( + <div className={'info-pane-warning'} key={'warning'}> + <WarningIcon/>Some options have been selected that may cause a system + to become unstable or may change a system's state in undesirable ways. + Running Infection Monkey in a production or other sensitive environment + with this configuration is not recommended. + </div> + ); + } } -export {getDefaultPaneParams, InfoPane} +export {getDefaultPaneParams, InfoPane, WarningType} From 61eb9a7a23ee7a2dd05cab963669b5e04607c43c Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 13:23:04 -0500 Subject: [PATCH 29/38] ui: align warning text and icon --- monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss | 3 +++ .../cc/ui/src/styles/pages/ConfigurationPage.scss | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index 561e436cf..518757713 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -30,7 +30,10 @@ .info-pane-warning { margin-top: 1em; + display: flex; } .info-pane-warning .warning-icon { + margin-top: .188em; margin-left: 0em; + margin-right: .75em; } diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index 98e598c81..6bda238ea 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -62,5 +62,4 @@ color: #ffc107; font-weight: 900; margin-left: .75em; - margin-right: .75em; } From 08926d778b4b2f8c1f8384acb0fab403e4db7081 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 13:27:36 -0500 Subject: [PATCH 30/38] ui: refactor duplicate code in getWarning() --- .../src/components/ui-components/InfoPane.js | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 841eafe16..21686b468 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -75,23 +75,22 @@ function getBody(props) { function getWarning(warningType) { if (warningType == WarningType.SINGLE) { - return ( - <div className={'info-pane-warning'} key={'warning'}> - <WarningIcon/>This option may cause a system to become unstable or may - change a system's state in undesirable ways. Therefore, this option - is not recommended for use in production or other sensitive environments. - </div> - ); + var warning = <span>This option may cause a system to become unstable or + may change a system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive + environments.</span>; } else { - return ( - <div className={'info-pane-warning'} key={'warning'}> - <WarningIcon/>Some options have been selected that may cause a system - to become unstable or may change a system's state in undesirable ways. - Running Infection Monkey in a production or other sensitive environment - with this configuration is not recommended. - </div> - ); + warning = <span>Some options have been selected that may cause a system + to become unstable or may change a system's state in undesirable ways. + Running Infection Monkey in a production or other sensitive environment + with this configuration is not recommended.</span>; } + + return ( + <div className={'info-pane-warning'} key={'warning'}> + <WarningIcon/>{warning} + </div> + ); } export {getDefaultPaneParams, InfoPane, WarningType} From f41f896aefa83b240b8abb60c3b6d5d7d5b4cb8a Mon Sep 17 00:00:00 2001 From: Swimm <swimm@swimm.io> Date: Thu, 28 Jan 2021 20:42:14 +0200 Subject: [PATCH 31/38] Swimm: update unit Add a new System Info Collector (id: OwcKMnALpn7tuBaJY1US). --- .swm/OwcKMnALpn7tuBaJY1US.swm | 278 ++++++++++++++++++++++++---------- 1 file changed, 202 insertions(+), 76 deletions(-) diff --git a/.swm/OwcKMnALpn7tuBaJY1US.swm b/.swm/OwcKMnALpn7tuBaJY1US.swm index 4e446cb48..a243319d2 100644 --- a/.swm/OwcKMnALpn7tuBaJY1US.swm +++ b/.swm/OwcKMnALpn7tuBaJY1US.swm @@ -1,10 +1,20 @@ { "id": "OwcKMnALpn7tuBaJY1US", "name": "Add a new System Info Collector", - "dod": "QWRkJTIwYSUyMHN5c3RlbSUyMGluZm8lMjBjb2xsZWN0b3IlMjB0aGF0JTIwY29sbGVjdHMlMjB0aGUlMjBtYWNoaW5lJTIwaG9zdG5hbWUu", - "description": "JTIzJTIwV2hhdCUyMGFyZSUyMHN5c3RlbSUyMGluZm8lMjBjb2xsZWN0b3JzJTNGJTBBJTBBV2VsbCUyQyUyMHRoZSUyMG5hbWUlMjBwcmV0dHklMjBtdWNoJTIwZXhwbGFpbnMlMjBpdC4lMjBUaGV5JTIwYXJlJTIwTW9ua2V5JTIwY2xhc3NlcyUyMHdoaWNoJTIwY29sbGVjdCUyMHZhcmlvdXMlMjBpbmZvcm1hdGlvbiUyMHJlZ2FyZGluZyUyMHRoZSUyMHZpY3RpbSUyMHN5c3RlbSUyQyUyMHN1Y2glMjBhcyUyMEVudmlyb25tZW50JTJDJTIwU1NIJTIwSW5mbyUyQyUyMFByb2Nlc3MlMjBMaXN0JTJDJTIwTmV0c3RhdCUyMGFuZCUyMG1vcmUuJTIwJTBBJTBBJTIzJTIzJTIwV2hhdCUyMHNob3VsZCUyMEklMjBhZGQlM0YlMjAlMEElMEFBJTIwc3lzdGVtJTIwaW5mbyUyMGNvbGxlY3RvciUyMHdoaWNoJTIwY29sbGVjdHMlMjB0aGUlMjBob3N0bmFtZSUyMG9mJTIwdGhlJTIwc3lzdGVtLiUwQSUwQSUyMyUyMyUyMFRlc3QlMjBtYW51YWxseSUwQSUwQU9uY2UlMjB5b3UncmUlMjBkb25lJTJDJTIwbWFrZSUyMHN1cmUlMjB0aGF0JTIweW91ciUyMGNvbGxlY3RvciUzQSUwQSolMjBBcHBlYXJzJTIwaW4lMjB0aGUlMjBJc2xhbmQlMjBjb25maWd1cmF0aW9uJTJDJTIwYW5kJTIwaXMlMjBlbmFibGVkJTIwYnklMjBkZWZhdWx0JTBBKiUyMFRoZSUyMGNvbGxlY3RvciUyMGFjdHVhbGx5JTIwcnVucyUyMHdoZW4lMjBleGVjdXRpbmclMjBhJTIwTW9ua2V5LiUwQSolMjBSZXN1bHRzJTIwc2hvdyUyMHVwJTIwaW4lMjB0aGUlMjByZWxldmFudCUyMHBsYWNlcyUzQSUwQSUyMCUyMColMjBUaGUlMjBpbmZlY3Rpb24lMjBtYXAuJTBBJTIwJTIwKiUyMFRoZSUyMHNlY3VyaXR5JTIwcmVwb3J0LiUwQSUyMCUyMColMjBUaGUlMjByZWxldmFudCUyME1JVFJFJTIwdGVjaG5pcXVlcy4lMEElMEEqKlRoZXJlJTIwYXJlJTIwYSUyMGxvdCUyMG9mJTIwaGludHMlMjBmb3IlMjB0aGlzJTIwdW5pdCUyMC0lMjBkb24ndCUyMGJlJTIwYWZyYWlkJTIwdG8lMjB1c2UlMjB0aGVtISoq", - "summary": "U3lzdGVtJTIwaW5mbyUyMGNvbGxlY3RvcnMlMjBhcmUlMjB1c2VmdWwlMjB0byUyMGdldCUyMG1vcmUlMjBkYXRhJTIwZm9yJTIwdmFyaW91cyUyMHRoaW5ncyUyQyUyMHN1Y2glMjBhcyUyMFpUJTIwdGVzdHMlMjBvciUyME1JVFJFJTIwdGVjaG5pcXVlcy4lMjBUYWtlJTIwYSUyMGxvb2slMjBhdCUyMHNvbWUlMjBvdGhlciUyMHRlY2huaXF1ZXMh", - "diff": "ZGlmZiUyMC0tZ2l0JTIwYSUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzLnB5JTIwYiUyRm1vbmtleSUyRmNvbW1vbiUyRmRhdGElMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzLnB5JTBBaW5kZXglMjAxNzVhMDU0ZS4uM2I0NzhkYzklMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMucHklMEElMkIlMkIlMkIlMjBiJTJGbW9ua2V5JTJGY29tbW9uJTJGZGF0YSUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMucHklMEElNDAlNDAlMjAtMSUyQzUlMjAlMkIxJTJDNSUyMCU0MCU0MCUwQSUyMEFXU19DT0xMRUNUT1IlMjAlM0QlMjAlMjJBd3NDb2xsZWN0b3IlMjIlMEEtSE9TVE5BTUVfQ09MTEVDVE9SJTIwJTNEJTIwJTIySG9zdG5hbWVDb2xsZWN0b3IlMjIlMEElMkIlMjMlMjBTV0lNTUVSJTNBJTIwQ29sbGVjdG9yJTIwbmFtZSUyMGdvZXMlMjBoZXJlLiUwQSUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyMCUzRCUyMCUyMkVudmlyb25tZW50Q29sbGVjdG9yJTIyJTBBJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiUyMCUzRCUyMCUyMlByb2Nlc3NMaXN0Q29sbGVjdG9yJTIyJTBBJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTIwJTNEJTIwJTIyTWltaWthdHpDb2xsZWN0b3IlMjIlMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnN5c3RlbV9pbmZvJTJGY29sbGVjdG9ycyUyRmhvc3RuYW1lX2NvbGxlY3Rvci5weSUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGc3lzdGVtX2luZm8lMkZjb2xsZWN0b3JzJTJGaG9zdG5hbWVfY29sbGVjdG9yLnB5JTBBaW5kZXglMjBhZTk1NjA4MS4uNGRjNjcwMWElMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGaW5mZWN0aW9uX21vbmtleSUyRnN5c3RlbV9pbmZvJTJGY29sbGVjdG9ycyUyRmhvc3RuYW1lX2NvbGxlY3Rvci5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZpbmZlY3Rpb25fbW9ua2V5JTJGc3lzdGVtX2luZm8lMkZjb2xsZWN0b3JzJTJGaG9zdG5hbWVfY29sbGVjdG9yLnB5JTBBJTQwJTQwJTIwLTElMkMxNiUyMCUyQjElMkM1JTIwJTQwJTQwJTBBJTIwaW1wb3J0JTIwbG9nZ2luZyUwQS1pbXBvcnQlMjBzb2NrZXQlMEEtJTBBLWZyb20lMjBjb21tb24uZGF0YS5zeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzJTIwaW1wb3J0JTIwSE9TVE5BTUVfQ09MTEVDVE9SJTBBLWZyb20lMjBpbmZlY3Rpb25fbW9ua2V5LnN5c3RlbV9pbmZvLnN5c3RlbV9pbmZvX2NvbGxlY3RvciUyMGltcG9ydCUyMCU1QyUwQS0lMjAlMjAlMjAlMjBTeXN0ZW1JbmZvQ29sbGVjdG9yJTBBJTIwJTBBJTIwbG9nZ2VyJTIwJTNEJTIwbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pJTBBJTIwJTBBLSUwQS1jbGFzcyUyMEhvc3RuYW1lQ29sbGVjdG9yKFN5c3RlbUluZm9Db2xsZWN0b3IpJTNBJTBBLSUyMCUyMCUyMCUyMGRlZiUyMF9faW5pdF9fKHNlbGYpJTNBJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHN1cGVyKCkuX19pbml0X18obmFtZSUzREhPU1ROQU1FX0NPTExFQ1RPUiklMEEtJTBBLSUyMCUyMCUyMCUyMGRlZiUyMGNvbGxlY3Qoc2VsZiklMjAtJTNFJTIwZGljdCUzQSUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlN0IlMjJob3N0bmFtZSUyMiUzQSUyMHNvY2tldC5nZXRmcWRuKCklN0QlMEElMkIlMjMlMjBTV0lNTUVSJTNBJTIwVGhlJTIwY29sbGVjdG9yJTIwY2xhc3MlMjBnb2VzJTIwaGVyZS4lMEFkaWZmJTIwLS1naXQlMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3Nlcy5weSUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnN5c3RlbV9pbmZvX2NvbGxlY3Rvcl9jbGFzc2VzLnB5JTBBaW5kZXglMjA1ZjExM2Y0YS4uNzA0M2UyMjclMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGZGVmaW5pdGlvbnMlMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JfY2xhc3Nlcy5weSUwQSUyQiUyQiUyQiUyMGIlMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZkZWZpbml0aW9ucyUyRnN5c3RlbV9pbmZvX2NvbGxlY3Rvcl9jbGFzc2VzLnB5JTBBJTQwJTQwJTIwLTElMkM3JTIwJTJCMSUyQzYlMjAlNDAlNDAlMEElMjBmcm9tJTIwY29tbW9uLmRhdGEuc3lzdGVtX2luZm9fY29sbGVjdG9yc19uYW1lcyUyMGltcG9ydCUyMChBV1NfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwQVpVUkVfQ1JFRF9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBFTlZJUk9OTUVOVF9DT0xMRUNUT1IlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwSE9TVE5BTUVfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMEElMjAlMEElNDAlNDAlMjAtMzclMkMxNSUyMCUyQjM2JTJDNyUyMCU0MCU0MCUyMFNZU1RFTV9JTkZPX0NPTExFQ1RPUl9DTEFTU0VTJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyaW5mbyUyMiUzQSUyMCUyMklmJTIwb24lMjBBV1MlMkMlMjBjb2xsZWN0cyUyMG1vcmUlMjBpbmZvcm1hdGlvbiUyMGFib3V0JTIwdGhlJTIwQVdTJTIwaW5zdGFuY2UlMjBjdXJyZW50bHklMjBydW5uaW5nJTIwb24uJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTA4MiUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3RCUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydHlwZSUyMiUzQSUyMCUyMnN0cmluZyUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJlbnVtJTIyJTNBJTIwJTVCJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUQlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIydGl0bGUlMjIlM0ElMjAlMjJIb3N0bmFtZSUyMGNvbGxlY3RvciUyMiUyQyUwQS0lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJpbmZvJTIyJTNBJTIwJTIyQ29sbGVjdHMlMjBtYWNoaW5lJ3MlMjBob3N0bmFtZS4lMjIlMkMlMEEtJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyYXR0YWNrX3RlY2huaXF1ZXMlMjIlM0ElMjAlNUIlMjJUMTA4MiUyMiUyQyUyMCUyMlQxMDE2JTIyJTVEJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3RCUyQyUwQSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFNXSU1NRVIlM0ElMjBDb2xsZWN0b3IlMjBjb25maWclMjBnb2VzJTIwaGVyZS4lMjBUaXAlM0ElMjBIb3N0bmFtZSUyMGNvbGxlY3Rpb24lMjByZWxhdGVzJTIwdG8lMjB0aGUlMjBUMTA4MiUyMGFuZCUyMFQxMDE2JTIwdGVjaG5pcXVlcy4lMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIyc3RyaW5nJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIyZW51bSUyMiUzQSUyMCU1QiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRmNvbmZpZ19zY2hlbWElMkZtb25rZXkucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBaW5kZXglMjBiNDdkNmExNS4uMWIxOTYyYTQlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZjb25maWdfc2NoZW1hJTJGbW9ua2V5LnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGY29uZmlnX3NjaGVtYSUyRm1vbmtleS5weSUwQSU0MCU0MCUyMC0xJTJDNyUyMCUyQjElMkM2JTIwJTQwJTQwJTBBJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMlMjBpbXBvcnQlMjAoQVdTX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEFaVVJFX0NSRURfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME1JTUlLQVRaX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBST0NFU1NfTElTVF9DT0xMRUNUT1IpJTBBJTIwJTBBJTQwJTQwJTIwLTg4JTJDNyUyMCUyQjg3JTJDNiUyMCU0MCU0MCUyME1PTktFWSUyMCUzRCUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmRlZmF1bHQlMjIlM0ElMjAlNUIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBFTlZJUk9OTUVOVF9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBV1NfQ09MTEVDVE9SJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBST0NFU1NfTElTVF9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBNSU1JS0FUWl9DT0xMRUNUT1IlMkMlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBWlVSRV9DUkVEX0NPTExFQ1RPUiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRnRlbGVtZXRyeSUyRnByb2Nlc3NpbmclMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzJTJGaG9zdG5hbWUucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRmhvc3RuYW1lLnB5JTBBaW5kZXglMjBlMmRlNDUxOS4uMDRiYzM1NTYlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRmhvc3RuYW1lLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGdGVsZW1ldHJ5JTJGcHJvY2Vzc2luZyUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnMlMkZob3N0bmFtZS5weSUwQSU0MCU0MCUyMC0xJTJDOSUyMCUyQjElMkM5JTIwJTQwJTQwJTBBJTIwaW1wb3J0JTIwbG9nZ2luZyUwQSUyMCUwQS1mcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5tb2RlbHMubW9ua2V5JTIwaW1wb3J0JTIwTW9ua2V5JTBBJTJCJTIzJTIwU1dJTU1FUiUzQSUyMFRoaXMlMjB3aWxsJTIwYmUlMjB1c2VmdWwlMjAlM0EpJTIwbW9ua2V5X2lzbGFuZC5jYy5tb2RlbHMubW9ua2V5Lk1vbmtleSUyMGhhcyUyMHRoZSUyMHVzZWZ1bCUwQSUyQiUyMyUyMCUyMmdldF9zaW5nbGVfbW9ua2V5X2J5X2d1aWQlMjIlMjBhbmQlMjAlMjJzZXRfaG9zdG5hbWUlMjIlMjBtZXRob2RzLiUwQSUyMCUwQSUyMGxvZ2dlciUyMCUzRCUyMGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKSUwQSUyMCUwQSUyMCUwQS1kZWYlMjBwcm9jZXNzX2hvc3RuYW1lX3RlbGVtZXRyeShjb2xsZWN0b3JfcmVzdWx0cyUyQyUyMG1vbmtleV9ndWlkKSUzQSUwQS0lMjAlMjAlMjAlMjBNb25rZXkuZ2V0X3NpbmdsZV9tb25rZXlfYnlfZ3VpZChtb25rZXlfZ3VpZCkuc2V0X2hvc3RuYW1lKGNvbGxlY3Rvcl9yZXN1bHRzJTVCJTIyaG9zdG5hbWUlMjIlNUQpJTBBJTJCJTIzJTIwU1dJTU1FUiUzQSUyMFByb2Nlc3NpbmclMjBmdW5jdGlvbiUyMGdvZXMlMjBoZXJlLiUwQWRpZmYlMjAtLWdpdCUyMGElMkZtb25rZXklMkZtb25rZXlfaXNsYW5kJTJGY2MlMkZzZXJ2aWNlcyUyRnRlbGVtZXRyeSUyRnByb2Nlc3NpbmclMkZzeXN0ZW1faW5mb19jb2xsZWN0b3JzJTJGc3lzdGVtX2luZm9fdGVsZW1ldHJ5X2Rpc3BhdGNoZXIucHklMjBiJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRnN5c3RlbV9pbmZvX3RlbGVtZXRyeV9kaXNwYXRjaGVyLnB5JTBBaW5kZXglMjA2MzlhMzkyYy4uN2FhNmQzYTYlMjAxMDA2NDQlMEEtLS0lMjBhJTJGbW9ua2V5JTJGbW9ua2V5X2lzbGFuZCUyRmNjJTJGc2VydmljZXMlMkZ0ZWxlbWV0cnklMkZwcm9jZXNzaW5nJTJGc3lzdGVtX2luZm9fY29sbGVjdG9ycyUyRnN5c3RlbV9pbmZvX3RlbGVtZXRyeV9kaXNwYXRjaGVyLnB5JTBBJTJCJTJCJTJCJTIwYiUyRm1vbmtleSUyRm1vbmtleV9pc2xhbmQlMkZjYyUyRnNlcnZpY2VzJTJGdGVsZW1ldHJ5JTJGcHJvY2Vzc2luZyUyRnN5c3RlbV9pbmZvX2NvbGxlY3RvcnMlMkZzeXN0ZW1faW5mb190ZWxlbWV0cnlfZGlzcGF0Y2hlci5weSUwQSU0MCU0MCUyMC0zJTJDMTQlMjAlMkIzJTJDMTElMjAlNDAlNDAlMjBpbXBvcnQlMjB0eXBpbmclMEElMjAlMEElMjBmcm9tJTIwY29tbW9uLmRhdGEuc3lzdGVtX2luZm9fY29sbGVjdG9yc19uYW1lcyUyMGltcG9ydCUyMChBV1NfQ09MTEVDVE9SJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTJDJTBBLSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFBST0NFU1NfTElTVF9DT0xMRUNUT1IpJTBBJTIwZnJvbSUyMG1vbmtleV9pc2xhbmQuY2Muc2VydmljZXMudGVsZW1ldHJ5LnByb2Nlc3Npbmcuc3lzdGVtX2luZm9fY29sbGVjdG9ycy5hd3MlMjBpbXBvcnQlMjAlNUMlMEElMjAlMjAlMjAlMjAlMjBwcm9jZXNzX2F3c190ZWxlbWV0cnklMEElMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy50ZWxlbWV0cnkucHJvY2Vzc2luZy5zeXN0ZW1faW5mb19jb2xsZWN0b3JzLmVudmlyb25tZW50JTIwaW1wb3J0JTIwJTVDJTBBJTIwJTIwJTIwJTIwJTIwcHJvY2Vzc19lbnZpcm9ubWVudF90ZWxlbWV0cnklMEEtZnJvbSUyMG1vbmtleV9pc2xhbmQuY2Muc2VydmljZXMudGVsZW1ldHJ5LnByb2Nlc3Npbmcuc3lzdGVtX2luZm9fY29sbGVjdG9ycy5ob3N0bmFtZSUyMGltcG9ydCUyMCU1QyUwQS0lMjAlMjAlMjAlMjBwcm9jZXNzX2hvc3RuYW1lX3RlbGVtZXRyeSUwQSUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLnRlbGVtZXRyeS56ZXJvX3RydXN0X3Rlc3RzLmFudGl2aXJ1c19leGlzdGVuY2UlMjBpbXBvcnQlMjAlNUMlMEElMjAlMjAlMjAlMjAlMjB0ZXN0X2FudGl2aXJ1c19leGlzdGVuY2UlMEElMjAlMEElNDAlNDAlMjAtMTklMkM3JTIwJTJCMTYlMkM2JTIwJTQwJTQwJTIwbG9nZ2VyJTIwJTNEJTIwbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pJTBBJTIwU1lTVEVNX0lORk9fQ09MTEVDVE9SX1RPX1RFTEVNRVRSWV9QUk9DRVNTT1JTJTIwJTNEJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwQVdTX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfYXdzX3RlbGVtZXRyeSU1RCUyQyUwQSUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfZW52aXJvbm1lbnRfdGVsZW1ldHJ5JTVEJTJDJTBBLSUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfaG9zdG5hbWVfdGVsZW1ldHJ5JTVEJTJDJTBBJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiUzQSUyMCU1QnRlc3RfYW50aXZpcnVzX2V4aXN0ZW5jZSU1RCUwQSUyMCU3RCUwQSUyMCUwQQ==", + "dod": "Add a system info collector that collects the machine hostname.", + "description": "# What are system info collectors?\n\nWell, the name pretty much explains it. They are Monkey classes which collect various information regarding the victim system, such as Environment, SSH Info, Process List, Netstat and more. \n\n## What should I add? \n\nA system info collector which collects the hostname of the system.\n\n## Test manually\n\nOnce you're done, make sure that your collector:\n* Appears in the Island configuration, and is enabled by default\n* The collector actually runs when executing a Monkey.\n* Results show up in the relevant places:\n * The infection map.\n * The security report.\n * The relevant MITRE techniques.\n\n**There are a lot of hints for this unit - don't be afraid to use them!**", + "summary": "System info collectors are useful to get more data for various things, such as ZT tests or MITRE techniques. Take a look at some other techniques!", + "hunksOrder": [ + "monkey/common/data/system_info_collectors_names.py_0", + "monkey/infection_monkey/system_info/collectors/hostname_collector.py_0", + "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py_0", + "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py_1", + "monkey/monkey_island/cc/services/config_schema/monkey.py_0", + "monkey/monkey_island/cc/services/config_schema/monkey.py_1", + "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py_0", + "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py_0", + "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py_1" + ], "tests": [], "hints": [ "First thing you should do is take a look at a different collector (like EnvironmentCollector) and 100% understand how it runs, how results are relayed back to the server, and how the server processes the data.", @@ -12,95 +22,211 @@ "Take a look at SystemInfoCollector - that's the base class you'll need to implement.", "Make sure you add the new collector to the configuration in all relevant places, including making it ON by default!" ], - "files": { + "play_mode": "all", + "swimmPatch": { "monkey/common/data/system_info_collectors_names.py": { - "index": [ - "175a054e..3b478dc9", - "100644" - ], - "fileA": "monkey/common/data/system_info_collectors_names.py", - "fileB": "monkey/common/data/system_info_collectors_names.py", - "status": "MODIFIED", - "numLineDeletions": 1, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNSUyMCUyQjElMkM1JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMEFXU19DT0xMRUNUT1IlMjAlM0QlMjAlNUMlMjJBd3NDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIySE9TVE5BTUVfQ09MTEVDVE9SJTIwJTNEJTIwJTVDJTIySG9zdG5hbWVDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIzJTIwU1dJTU1FUiUzQSUyMENvbGxlY3RvciUyMG5hbWUlMjBnb2VzJTIwaGVyZS4lMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0EyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTIwJTNEJTIwJTVDJTIyRW52aXJvbm1lbnRDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzJTJDJTIyYiUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBQUk9DRVNTX0xJU1RfQ09MTEVDVE9SJTIwJTNEJTIwJTVDJTIyUHJvY2Vzc0xpc3RDb2xsZWN0b3IlNUMlMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTJDJTIyYiUyMiUzQTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBNSU1JS0FUWl9DT0xMRUNUT1IlMjAlM0QlMjAlNUMlMjJNaW1pa2F0ekNvbGxlY3RvciU1QyUyMiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCU1RCUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTElMkMlMjJsaW5lc0NvdW50JTIyJTNBNSU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/common/data/system_info_collectors_names.py b/monkey/common/data/system_info_collectors_names.py\nindex 175a054e..3b478dc9 100644\n--- a/monkey/common/data/system_info_collectors_names.py\n+++ b/monkey/common/data/system_info_collectors_names.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,5 +1,5 @@", + " AWS_COLLECTOR = \"AwsCollector\"", + "-HOSTNAME_COLLECTOR = \"HostnameCollector\"", + "+# SWIMMER: Collector name goes here.", + " ENVIRONMENT_COLLECTOR = \"EnvironmentCollector\"", + " PROCESS_LIST_COLLECTOR = \"ProcessListCollector\"", + " MIMIKATZ_COLLECTOR = \"MimikatzCollector\"" + ] + } ] }, "monkey/infection_monkey/system_info/collectors/hostname_collector.py": { - "index": [ - "ae956081..4dc6701a", - "100644" - ], - "fileA": "monkey/infection_monkey/system_info/collectors/hostname_collector.py", - "fileB": "monkey/infection_monkey/system_info/collectors/hostname_collector.py", - "status": "MODIFIED", - "numLineDeletions": 12, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDMTYlMjAlMkIxJTJDNSUyMCU0MCU0MCUyMiUyQyUyMmNoYW5nZXMlMjIlM0ElNUIlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBpbXBvcnQlMjBsb2dnaW5nJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMSUyQyUyMmIlMjIlM0ExJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMmltcG9ydCUyMHNvY2tldCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwY29tbW9uLmRhdGEuc3lzdGVtX2luZm9fY29sbGVjdG9yc19uYW1lcyUyMGltcG9ydCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMGluZmVjdGlvbl9tb25rZXkuc3lzdGVtX2luZm8uc3lzdGVtX2luZm9fY29sbGVjdG9yJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjBTeXN0ZW1JbmZvQ29sbGVjdG9yJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTclMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGxvZ2dlciUyMCUzRCUyMGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTglMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTklMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJjbGFzcyUyMEhvc3RuYW1lQ29sbGVjdG9yKFN5c3RlbUluZm9Db2xsZWN0b3IpJTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwZGVmJTIwX19pbml0X18oc2VsZiklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdXBlcigpLl9faW5pdF9fKG5hbWUlM0RIT1NUTkFNRV9DT0xMRUNUT1IpJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwZGVmJTIwY29sbGVjdChzZWxmKSUyMC0lM0UlMjBkaWN0JTNBJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwJTdCJTVDJTIyaG9zdG5hbWUlNUMlMjIlM0ElMjBzb2NrZXQuZ2V0ZnFkbigpJTdEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTV0lNTUVSJTNBJTIwVGhlJTIwY29sbGVjdG9yJTIwY2xhc3MlMjBnb2VzJTIwaGVyZS4lMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0E1JTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0ExNiU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTUlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/infection_monkey/system_info/collectors/hostname_collector.py b/monkey/infection_monkey/system_info/collectors/hostname_collector.py\nindex ae956081..bdeb5033 100644\n--- a/monkey/infection_monkey/system_info/collectors/hostname_collector.py\n+++ b/monkey/infection_monkey/system_info/collectors/hostname_collector.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,16 +1,5 @@", + " import logging", + "-import socket", + "-", + "-from common.data.system_info_collectors_names import HOSTNAME_COLLECTOR", + "-from infection_monkey.system_info.system_info_collector import \\", + "- SystemInfoCollector", + " ", + " logger = logging.getLogger(__name__)", + " ", + "-", + "+# SWIMMER: The collector class goes here.", + "-class HostnameCollector(SystemInfoCollector):", + "- def __init__(self):", + "- super().__init__(name=HOSTNAME_COLLECTOR)", + "-", + "- def collect(self) -> dict:", + "- return {\"hostname\": socket.getfqdn()}" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py": { - "index": [ - "5f113f4a..7043e227", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py", - "status": "MODIFIED", - "numLineDeletions": 10, - "numLineAdditions": 1, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNyUyMCUyQjElMkM2JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5zeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzJTIwaW1wb3J0JTIwKEFXU19DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBWlVSRV9DUkVEX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBIT1NUTkFNRV9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E2JTdEJTdEJTdEJTdE", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0zNyUyQzE1JTIwJTJCMzYlMkM3JTIwJTQwJTQwJTIwU1lTVEVNX0lORk9fQ09MTEVDVE9SX0NMQVNTRVMlMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyaW5mbyU1QyUyMiUzQSUyMCU1QyUyMklmJTIwb24lMjBBV1MlMkMlMjBjb2xsZWN0cyUyMG1vcmUlMjBpbmZvcm1hdGlvbiUyMGFib3V0JTIwdGhlJTIwQVdTJTIwaW5zdGFuY2UlMjBjdXJyZW50bHklMjBydW5uaW5nJTIwb24uJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMzclMkMlMjJiJTIyJTNBMzYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMDgyJTVDJTIyJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMzglMkMlMjJiJTIyJTNBMzclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EzOSUyQyUyMmIlMjIlM0EzOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0IlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0MCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJ0eXBlJTVDJTIyJTNBJTIwJTVDJTIyc3RyaW5nJTVDJTIyJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNDElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQ0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU1QyUyMnRpdGxlJTVDJTIyJTNBJTIwJTVDJTIySG9zdG5hbWUlMjBjb2xsZWN0b3IlNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJpbmZvJTVDJTIyJTNBJTIwJTVDJTIyQ29sbGVjdHMlMjBtYWNoaW5lJ3MlMjBob3N0bmFtZS4lNUMlMjIlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlNUMlMjJhdHRhY2tfdGVjaG5pcXVlcyU1QyUyMiUzQSUyMCU1QiU1QyUyMlQxMDgyJTVDJTIyJTJDJTIwJTVDJTIyVDEwMTYlNUMlMjIlNUQlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0NyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0QlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0OCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMFNXSU1NRVIlM0ElMjBDb2xsZWN0b3IlMjBjb25maWclMjBnb2VzJTIwaGVyZS4lMjBUaXAlM0ElMjBIb3N0bmFtZSUyMGNvbGxlY3Rpb24lMjByZWxhdGVzJTIwdG8lMjB0aGUlMjBUMTA4MiUyMGFuZCUyMFQxMDE2JTIwdGVjaG5pcXVlcy4lMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmIlMjIlM0EzOSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQ5JTJDJTIyYiUyMiUzQTQwJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIydHlwZSU1QyUyMiUzQSUyMCU1QyUyMnN0cmluZyU1QyUyMiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUwJTJDJTIyYiUyMiUzQTQxJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZW51bSU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUxJTJDJTIyYiUyMiUzQTQyJTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMzclMkMlMjJsaW5lc0NvdW50JTIyJTNBMTUlN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMzYlMkMlMjJsaW5lc0NvdW50JTIyJTNBNyU3RCU3RCU3RCU3RA==" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py\nindex 174133f4..de961fbd 100644\n--- a/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py\n+++ b/monkey/monkey_island/cc/services/config_schema/definitions/system_info_collector_classes.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,7 +1,6 @@", + " from common.data.system_info_collectors_names import (AWS_COLLECTOR,", + " AZURE_CRED_COLLECTOR,", + " ENVIRONMENT_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " MIMIKATZ_COLLECTOR,", + " PROCESS_LIST_COLLECTOR)", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -40,16 +39,7 @@", + " \"info\": \"If on AWS, collects more information about the AWS instance currently running on.\",", + " \"attack_techniques\": [\"T1082\"]", + " },", + "- {", + "+ # SWIMMER: Collector config goes here. Tip: Hostname collection relates to the T1082 and T1016 techniques.", + "- \"type\": \"string\",", + "- \"enum\": [", + "- HOSTNAME_COLLECTOR", + "- ],", + "- \"title\": \"Hostname collector\",", + "- \"safe\": True,", + "- \"info\": \"Collects machine's hostname.\",", + "- \"attack_techniques\": [\"T1082\", \"T1016\"]", + "- },", + " {", + " \"type\": \"string\",", + " \"enum\": [" + ] + } ] }, "monkey/monkey_island/cc/services/config_schema/monkey.py": { - "index": [ - "b47d6a15..1b1962a4", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/config_schema/monkey.py", - "fileB": "monkey/monkey_island/cc/services/config_schema/monkey.py", - "status": "MODIFIED", - "numLineDeletions": 2, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDNyUyMCUyQjElMkM2JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBjb21tb24uZGF0YS5zeXN0ZW1faW5mb19jb2xsZWN0b3JzX25hbWVzJTIwaW1wb3J0JTIwKEFXU19DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBWlVSRV9DUkVEX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIlMkMlMjJiJTIyJTNBMiU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlMkMlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBIT1NUTkFNRV9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwTUlNSUtBVFpfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBNSUyQyUyMmIlMjIlM0E0JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTclN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E2JTdEJTdEJTdEJTdE", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC04OCUyQzclMjAlMkI4NyUyQzYlMjAlNDAlNDAlMjBNT05LRVklMjAlM0QlMjAlN0IlMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTVDJTIyZGVmYXVsdCU1QyUyMiUzQSUyMCU1QiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTg4JTJDJTIyYiUyMiUzQTg3JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwRU5WSVJPTk1FTlRfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBODklMkMlMjJiJTIyJTNBODglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBBV1NfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTAlMkMlMjJiJTIyJTNBODklN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwSE9TVE5BTUVfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBQUk9DRVNTX0xJU1RfQ09MTEVDVE9SJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTIlMkMlMjJiJTIyJTNBOTAlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBNSU1JS0FUWl9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5MyUyQyUyMmIlMjIlM0E5MSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEFaVVJFX0NSRURfQ09MTEVDVE9SJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBOTQlMkMlMjJiJTIyJTNBOTIlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0E4OCUyQyUyMmxpbmVzQ291bnQlMjIlM0E3JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTg3JTJDJTIybGluZXNDb3VudCUyMiUzQTYlN0QlN0QlN0QlN0Q=" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/config_schema/monkey.py b/monkey/monkey_island/cc/services/config_schema/monkey.py\nindex b47d6a15..1b1962a4 100644\n--- a/monkey/monkey_island/cc/services/config_schema/monkey.py\n+++ b/monkey/monkey_island/cc/services/config_schema/monkey.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,7 +1,6 @@", + " from common.data.system_info_collectors_names import (AWS_COLLECTOR,", + " AZURE_CRED_COLLECTOR,", + " ENVIRONMENT_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " MIMIKATZ_COLLECTOR,", + " PROCESS_LIST_COLLECTOR)", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -88,7 +87,6 @@", + " \"default\": [", + " ENVIRONMENT_COLLECTOR,", + " AWS_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " PROCESS_LIST_COLLECTOR,", + " MIMIKATZ_COLLECTOR,", + " AZURE_CRED_COLLECTOR" + ] + } ] }, "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py": { - "index": [ - "e2de4519..04bc3556", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py", - "fileB": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py", - "status": "MODIFIED", - "numLineDeletions": 3, - "numLineAdditions": 3, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xJTJDOSUyMCUyQjElMkM5JTIwJTQwJTQwJTIyJTJDJTIyY2hhbmdlcyUyMiUzQSU1QiU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGltcG9ydCUyMGxvZ2dpbmclMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExJTJDJTIyYiUyMiUzQTElN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyJTJDJTIyYiUyMiUzQTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZnJvbSUyMG1vbmtleV9pc2xhbmQuY2MubW9kZWxzLm1vbmtleSUyMGltcG9ydCUyME1vbmtleSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTMlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyYWRkJTIyJTJDJTIybWFyayUyMiUzQSUyMiUyQiUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjMlMjBTV0lNTUVSJTNBJTIwVGhpcyUyMHdpbGwlMjBiZSUyMHVzZWZ1bCUyMCUzQSklMjBtb25rZXlfaXNsYW5kLmNjLm1vZGVscy5tb25rZXkuTW9ua2V5JTIwaGFzJTIwdGhlJTIwdXNlZnVsJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJiJTIyJTNBMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJhZGQlMjIlMkMlMjJtYXJrJTIyJTNBJTIyJTJCJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMyUyMCU1QyUyMmdldF9zaW5nbGVfbW9ua2V5X2J5X2d1aWQlNUMlMjIlMjBhbmQlMjAlNUMlMjJzZXRfaG9zdG5hbWUlNUMlMjIlMjBtZXRob2RzLiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTQlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E0JTJDJTIyYiUyMiUzQTUlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBsb2dnZXIlMjAlM0QlMjBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXyklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E1JTJDJTIyYiUyMiUzQTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTJDJTIyYiUyMiUzQTclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTglN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyZGVmJTIwcHJvY2Vzc19ob3N0bmFtZV90ZWxlbWV0cnkoY29sbGVjdG9yX3Jlc3VsdHMlMkMlMjBtb25rZXlfZ3VpZCklM0ElMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyME1vbmtleS5nZXRfc2luZ2xlX21vbmtleV9ieV9ndWlkKG1vbmtleV9ndWlkKS5zZXRfaG9zdG5hbWUoY29sbGVjdG9yX3Jlc3VsdHMlNUIlNUMlMjJob3N0bmFtZSU1QyUyMiU1RCklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmFkZCUyMiUyQyUyMm1hcmslMjIlM0ElMjIlMkIlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIzJTIwU1dJTU1FUiUzQSUyMFByb2Nlc3NpbmclMjBmdW5jdGlvbiUyMGdvZXMlMjBoZXJlLiUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYiUyMiUzQTklN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExJTJDJTIybGluZXNDb3VudCUyMiUzQTklN0QlMkMlMjJiJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMSUyQyUyMmxpbmVzQ291bnQlMjIlM0E5JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py\nindex e2de4519..04bc3556 100644\n--- a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py\n+++ b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/hostname.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -1,9 +1,9 @@", + " import logging", + " ", + "-from monkey_island.cc.models.monkey import Monkey", + "+# SWIMMER: This will be useful :) monkey_island.cc.models.monkey.Monkey has the useful", + "+# \"get_single_monkey_by_guid\" and \"set_hostname\" methods.", + " ", + " logger = logging.getLogger(__name__)", + " ", + " ", + "-def process_hostname_telemetry(collector_results, monkey_guid):", + "+# SWIMMER: Processing function goes here.", + "- Monkey.get_single_monkey_by_guid(monkey_guid).set_hostname(collector_results[\"hostname\"])" + ] + } ] }, "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py": { - "index": [ - "639a392c..7aa6d3a6", - "100644" - ], - "fileA": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py", - "fileB": "monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py", - "status": "MODIFIED", - "numLineDeletions": 4, - "numLineAdditions": 0, - "hunkContainers": [ - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0zJTJDMTQlMjAlMkIzJTJDMTElMjAlNDAlNDAlMjBpbXBvcnQlMjB0eXBpbmclMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMyUyQyUyMmIlMjIlM0EzJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwZnJvbSUyMGNvbW1vbi5kYXRhLnN5c3RlbV9pbmZvX2NvbGxlY3RvcnNfbmFtZXMlMjBpbXBvcnQlMjAoQVdTX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTQlMkMlMjJiJTIyJTNBNCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMEVOVklST05NRU5UX0NPTExFQ1RPUiUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTUlMkMlMjJiJTIyJTNBNSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBIT1NUTkFNRV9DT0xMRUNUT1IlMkMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E2JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUFJPQ0VTU19MSVNUX0NPTExFQ1RPUiklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0E3JTJDJTIyYiUyMiUzQTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjBmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy50ZWxlbWV0cnkucHJvY2Vzc2luZy5zeXN0ZW1faW5mb19jb2xsZWN0b3JzLmF3cyUyMGltcG9ydCUyMCU1QyU1QyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTglMkMlMjJiJTIyJTNBNyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHByb2Nlc3NfYXdzX3RlbGVtZXRyeSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTklMkMlMjJiJTIyJTNBOCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLnRlbGVtZXRyeS5wcm9jZXNzaW5nLnN5c3RlbV9pbmZvX2NvbGxlY3RvcnMuZW52aXJvbm1lbnQlMjBpbXBvcnQlMjAlNUMlNUMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMCUyQyUyMmIlMjIlM0E5JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwJTIwcHJvY2Vzc19lbnZpcm9ubWVudF90ZWxlbWV0cnklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMSUyQyUyMmIlMjIlM0ExMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJkZWwlMjIlMkMlMjJtYXJrJTIyJTNBJTIyLSUyMiUyQyUyMmRhdGElMjIlM0ElMjJmcm9tJTIwbW9ua2V5X2lzbGFuZC5jYy5zZXJ2aWNlcy50ZWxlbWV0cnkucHJvY2Vzc2luZy5zeXN0ZW1faW5mb19jb2xsZWN0b3JzLmhvc3RuYW1lJTIwaW1wb3J0JTIwJTVDJTVDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyZGVsJTIyJTJDJTIybWFyayUyMiUzQSUyMi0lMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIwJTIwJTIwcHJvY2Vzc19ob3N0bmFtZV90ZWxlbWV0cnklMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExMyU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMGZyb20lMjBtb25rZXlfaXNsYW5kLmNjLnNlcnZpY2VzLnRlbGVtZXRyeS56ZXJvX3RydXN0X3Rlc3RzLmFudGl2aXJ1c19leGlzdGVuY2UlMjBpbXBvcnQlMjAlNUMlNUMlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ExNCUyQyUyMmIlMjIlM0ExMSU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMCUyMHRlc3RfYW50aXZpcnVzX2V4aXN0ZW5jZSUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTE1JTJDJTIyYiUyMiUzQTEyJTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTYlMkMlMjJiJTIyJTNBMTMlN0QlN0QlNUQlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0EzJTJDJTIybGluZXNDb3VudCUyMiUzQTE0JTdEJTJDJTIyYiUyMiUzQSU3QiUyMnN0YXJ0TGluZSUyMiUzQTMlMkMlMjJsaW5lc0NvdW50JTIyJTNBMTElN0QlN0QlN0QlN0Q=", - "JTdCJTIyaHVuayUyMiUzQSU3QiUyMmhlYWRlciUyMiUzQSUyMiU0MCU0MCUyMC0xOSUyQzclMjAlMkIxNiUyQzYlMjAlNDAlNDAlMjBsb2dnZXIlMjAlM0QlMjBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXyklMjIlMkMlMjJjaGFuZ2VzJTIyJTNBJTVCJTdCJTIydHlwZSUyMiUzQSUyMmNvbnRleHQlMjIlMkMlMjJkYXRhJTIyJTNBJTIyJTIwU1lTVEVNX0lORk9fQ09MTEVDVE9SX1RPX1RFTEVNRVRSWV9QUk9DRVNTT1JTJTIwJTNEJTIwJTdCJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMTklMkMlMjJiJTIyJTNBMTYlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBBV1NfQ09MTEVDVE9SJTNBJTIwJTVCcHJvY2Vzc19hd3NfdGVsZW1ldHJ5JTVEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMjAlMkMlMjJiJTIyJTNBMTclN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBFTlZJUk9OTUVOVF9DT0xMRUNUT1IlM0ElMjAlNUJwcm9jZXNzX2Vudmlyb25tZW50X3RlbGVtZXRyeSU1RCUyQyUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTIxJTJDJTIyYiUyMiUzQTE4JTdEJTdEJTJDJTdCJTIydHlwZSUyMiUzQSUyMmRlbCUyMiUyQyUyMm1hcmslMjIlM0ElMjItJTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMCUyMCUyMEhPU1ROQU1FX0NPTExFQ1RPUiUzQSUyMCU1QnByb2Nlc3NfaG9zdG5hbWVfdGVsZW1ldHJ5JTVEJTJDJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMjIlN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlMjAlMjAlMjAlMjBQUk9DRVNTX0xJU1RfQ09MTEVDVE9SJTNBJTIwJTVCdGVzdF9hbnRpdmlydXNfZXhpc3RlbmNlJTVEJTIyJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBMjMlMkMlMjJiJTIyJTNBMTklN0QlN0QlMkMlN0IlMjJ0eXBlJTIyJTNBJTIyY29udGV4dCUyMiUyQyUyMmRhdGElMjIlM0ElMjIlMjAlN0QlMjIlMkMlMjJsaW5lTnVtYmVycyUyMiUzQSU3QiUyMmElMjIlM0EyNCUyQyUyMmIlMjIlM0EyMCU3RCU3RCUyQyU3QiUyMnR5cGUlMjIlM0ElMjJjb250ZXh0JTIyJTJDJTIyZGF0YSUyMiUzQSUyMiUyMCUyMiUyQyUyMmxpbmVOdW1iZXJzJTIyJTNBJTdCJTIyYSUyMiUzQTI1JTJDJTIyYiUyMiUzQTIxJTdEJTdEJTVEJTJDJTIybGluZU51bWJlcnMlMjIlM0ElN0IlMjJhJTIyJTNBJTdCJTIyc3RhcnRMaW5lJTIyJTNBMTklMkMlMjJsaW5lc0NvdW50JTIyJTNBNyU3RCUyQyUyMmIlMjIlM0ElN0IlMjJzdGFydExpbmUlMjIlM0ExNiUyQyUyMmxpbmVzQ291bnQlMjIlM0E2JTdEJTdEJTdEJTdE" + "diffType": "MODIFIED", + "fileDiffHeader": "diff --git a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py\nindex 639a392c..7aa6d3a6 100644\n--- a/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py\n+++ b/monkey/monkey_island/cc/services/telemetry/processing/system_info_collectors/system_info_telemetry_dispatcher.py", + "hunks": [ + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -3,14 +3,11 @@", + " ", + " from common.data.system_info_collectors_names import (AWS_COLLECTOR,", + " ENVIRONMENT_COLLECTOR,", + "- HOSTNAME_COLLECTOR,", + " PROCESS_LIST_COLLECTOR)", + " from monkey_island.cc.services.telemetry.processing.system_info_collectors.aws import \\", + " process_aws_telemetry", + " from monkey_island.cc.services.telemetry.processing.system_info_collectors.environment import \\", + " process_environment_telemetry", + "-from monkey_island.cc.services.telemetry.processing.system_info_collectors.hostname import \\", + "- process_hostname_telemetry", + " from monkey_island.cc.services.telemetry.zero_trust_tests.antivirus_existence import \\", + " test_antivirus_existence", + " " + ] + }, + { + "swimmHunkMetadata": { + "hunkComments": [] + }, + "hunkDiffLines": [ + "@@ -19,7 +16,6 @@", + " SYSTEM_INFO_COLLECTOR_TO_TELEMETRY_PROCESSORS = {", + " AWS_COLLECTOR: [process_aws_telemetry],", + " ENVIRONMENT_COLLECTOR: [process_environment_telemetry],", + "- HOSTNAME_COLLECTOR: [process_hostname_telemetry],", + " PROCESS_LIST_COLLECTOR: [test_antivirus_existence]", + " }", + " " + ] + } ] } }, - "app_version": "0.1.90", - "file_version": "1.0.2" + "app_version": "0.3.5-1", + "file_version": "1.0.4" } \ No newline at end of file From e77868b656b40d904fc5cc2d5bd7a2c48abbb2d8 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 13:44:14 -0500 Subject: [PATCH 32/38] ui: sort checkbox options alphabetically Alphabetically sort options in AdvancedMultiSelect to improve usability. Float "unsafe" options to the bottom so they are grouped together. --- .../ui-components/AdvancedMultiSelect.js | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 575dbae8e..6398e85db 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -33,10 +33,10 @@ class AdvancedMultiSelect extends React.Component { constructor(props) { super(props); - this.enumOptions = props.options.enumOptions; this.defaultValues = props.schema.default; this.infoPaneRefString = props.schema.items.$ref; this.registry = props.registry; + this.enumOptions = props.options.enumOptions.sort(this.compareOptions); this.state = { masterCheckboxState: this.getMasterCheckboxState(props.value), @@ -49,6 +49,27 @@ class AdvancedMultiSelect extends React.Component { }; } + // Sort options alphabetically. "Unsafe" options float to the bottom" + compareOptions = (a, b) => { + if (!this.isSafe(a.value) && this.isSafe(b.value)) { + return 1; + } + + if (this.isSafe(a.value) && !this.isSafe(b.value)) { + return -1; + } + + if (a.value < b.value) { + return -1 + } + + if (a.value > b.value) { + return 1 + } + + return 0; + } + onMasterCheckboxClick = () => { if (this.state.masterCheckboxState === MasterCheckboxState.ALL) { var newValues = []; From 117678f91a5a69a6d4d84db574cb6042692cc66c Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Thu, 28 Jan 2021 14:06:05 -0500 Subject: [PATCH 33/38] ui: fix minor css formatting issues --- .../cc/ui/src/styles/components/AdvancedMultiSelect.scss | 2 +- monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss | 1 + .../cc/ui/src/styles/pages/ConfigurationPage.scss | 3 +-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss index de3d5d542..cd1297f54 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/AdvancedMultiSelect.scss @@ -19,7 +19,7 @@ } .advanced-multi-select .card-header .master-checkbox span { - padding-bottom: 0.188rem; + padding-bottom: 0.188rem; } .advanced-multi-select .card-header .header-title { diff --git a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss index 518757713..976246cb6 100644 --- a/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss +++ b/monkey/monkey_island/cc/ui/src/styles/components/InfoPane.scss @@ -32,6 +32,7 @@ margin-top: 1em; display: flex; } + .info-pane-warning .warning-icon { margin-top: .188em; margin-left: 0em; diff --git a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss index 6bda238ea..18e09d37b 100644 --- a/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss +++ b/monkey/monkey_island/cc/ui/src/styles/pages/ConfigurationPage.scss @@ -59,7 +59,6 @@ .warning-icon { text-transform: uppercase; - color: #ffc107; - font-weight: 900; + color: #FFC107; margin-left: .75em; } From 06685b14cfc10f97b3fd08333fe616b6443c7274 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Fri, 29 Jan 2021 10:52:14 -0500 Subject: [PATCH 34/38] ui: simplify compareOptions() with boolean arithmetic --- .../ui-components/AdvancedMultiSelect.js | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 6398e85db..5a6cc6fcd 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -51,23 +51,14 @@ class AdvancedMultiSelect extends React.Component { // Sort options alphabetically. "Unsafe" options float to the bottom" compareOptions = (a, b) => { - if (!this.isSafe(a.value) && this.isSafe(b.value)) { - return 1; + // Apparently, you can use additive operators with boolean types. Ultimately, + // the ToNumber() abstraction operation is called to convert the booleans to + // numbers: https://tc39.es/ecma262/#sec-tonumeric + if (this.isSafe(b.value) - this.isSafe(a.value) !== 0) { + return this.isSafe(b.value) - this.isSafe(a.value); } - if (this.isSafe(a.value) && !this.isSafe(b.value)) { - return -1; - } - - if (a.value < b.value) { - return -1 - } - - if (a.value > b.value) { - return 1 - } - - return 0; + return a.value.localeCompare(b.value); } onMasterCheckboxClick = () => { From 57554ca4357c1229d6089d7d0eaa0bad6f76c0e1 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Fri, 29 Jan 2021 11:02:54 -0500 Subject: [PATCH 35/38] ui: fix some code cleanliness issues --- .../cc/ui/src/components/ui-components/AdvancedMultiSelect.js | 4 ++-- .../cc/ui/src/components/ui-components/InfoPane.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 5a6cc6fcd..4963aca7c 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -104,7 +104,7 @@ class AdvancedMultiSelect extends React.Component { return MasterCheckboxState.NONE; } - if (selectValues.length != this.enumOptions.length) { + if (selectValues.length !== this.enumOptions.length) { return MasterCheckboxState.MIXED; } @@ -144,7 +144,7 @@ class AdvancedMultiSelect extends React.Component { title: definitionObj.title, content: definitionObj.info, link: definitionObj.link, - warningType: !(this.isSafe(itemKey)) ? WarningType.SINGLE : WarningType.NONE + warningType: this.isSafe(itemKey) ? WarningType.NONE : WarningType.SINGLE } } ); diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 21686b468..902646068 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -62,7 +62,7 @@ function getSubtitle(props) { function getBody(props) { let body = [<span key={'body'}>{props.body}</span>]; - if (props.warningType != WarningType.NONE) { + if (props.warningType !== WarningType.NONE) { body.push(getWarning(props.warningType)); } @@ -74,7 +74,7 @@ function getBody(props) { } function getWarning(warningType) { - if (warningType == WarningType.SINGLE) { + if (warningType === WarningType.SINGLE) { var warning = <span>This option may cause a system to become unstable or may change a system's state in undesirable ways. Therefore, this option is not recommended for use in production or other sensitive From 1440121aeff3d042984be265e5951aacdec96eb2 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Fri, 29 Jan 2021 11:04:46 -0500 Subject: [PATCH 36/38] ui: rename unsafeOptionsSelected() -> isUnsafeOptionSelected() --- .../ui-components/AdvancedMultiSelect.js | 14 +++++++------- .../cc/ui/src/components/ui-components/InfoPane.js | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 4963aca7c..0dc813dc6 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -44,7 +44,7 @@ class AdvancedMultiSelect extends React.Component { infoPaneParams: getDefaultPaneParams( this.infoPaneRefString, this.registry, - this.unsafeOptionsSelected(this.props.value) + this.isUnsafeOptionSelected(this.props.value) ) }; } @@ -71,7 +71,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(newValues); this.setMasterCheckboxState(newValues); this.setHideResetState(newValues); - this.setPaneInfoToDefault(this.unsafeOptionsSelected(newValues)); + this.setPaneInfoToDefault(this.isUnsafeOptionSelected(newValues)); } onChildCheckboxClick = (value) => { @@ -115,7 +115,7 @@ class AdvancedMultiSelect extends React.Component { this.props.onChange(this.defaultValues); this.setHideResetState(this.defaultValues); this.setMasterCheckboxState(this.defaultValues); - this.setPaneInfoToDefault(this.unsafeOptionsSelected(this.defaultValues)); + this.setPaneInfoToDefault(this.isUnsafeOptionSelected(this.defaultValues)); } setHideResetState(selectValues) { @@ -125,10 +125,10 @@ class AdvancedMultiSelect extends React.Component { } getHideResetState(selectValues) { - return !(this.unsafeOptionsSelected(selectValues)) + return !(this.isUnsafeOptionSelected(selectValues)) } - unsafeOptionsSelected(selectValues) { + isUnsafeOptionSelected(selectValues) { return !(selectValues.every((value) => this.isSafe(value))); } @@ -150,12 +150,12 @@ class AdvancedMultiSelect extends React.Component { ); } - setPaneInfoToDefault(unsafeOptionsSelected) { + setPaneInfoToDefault(isUnsafeOptionSelected) { this.setState(() => ({ infoPaneParams: getDefaultPaneParams( this.props.schema.items.$ref, this.props.registry, - unsafeOptionsSelected + isUnsafeOptionSelected ) })); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index 902646068..e6476d3a2 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -12,13 +12,13 @@ const WarningType = { MULTIPLE: 2 } -function getDefaultPaneParams(refString, registry, unsafeOptionsSelected) { +function getDefaultPaneParams(refString, registry, isUnsafeOptionSelected) { let configSection = getObjectFromRegistryByRef(refString, registry); return ( { title: configSection.title, content: configSection.description, - warningType: unsafeOptionsSelected ? WarningType.Multiple : WarningType.NONE + warningType: isUnsafeOptionSelected ? WarningType.Multiple : WarningType.NONE }); } From 9f12702c3e835f90171a0d474d760015fb71ca53 Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Mon, 1 Feb 2021 06:57:04 -0500 Subject: [PATCH 37/38] ui: code readability improvements --- .../components/ui-components/ChildCheckbox.js | 9 +--- .../src/components/ui-components/InfoPane.js | 41 ++++++++++--------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 47a86dab6..6ebe69985 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -52,18 +52,13 @@ function ChildCheckbox(props) { safe } = props; - let displayLabel = [<span key={'label'} className={'option-text'}>{label}</span>]; - - if (!safe) { - displayLabel.push(<WarningIcon key="warning-icon"/>) - } - return ( <Form.Group onClick={() => onPaneClick(value)}> <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> </Button> - {displayLabel} + <span key={'label'} className={'option-text'}>{label}</span> + {!safe && <WarningIcon key="warning-icon"/>} </Form.Group> ); } diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js index e6476d3a2..21e71e29f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/InfoPane.js @@ -60,37 +60,38 @@ function getSubtitle(props) { } function getBody(props) { - let body = [<span key={'body'}>{props.body}</span>]; - - if (props.warningType !== WarningType.NONE) { - body.push(getWarning(props.warningType)); - } - return ( <Card.Body className={'pane-body'}> - {body} + <span key={'body'}>{props.body}</span> + {props.warningType !== WarningType.NONE && getWarning(props.warningType)} </Card.Body> ) } function getWarning(warningType) { - if (warningType === WarningType.SINGLE) { - var warning = <span>This option may cause a system to become unstable or - may change a system's state in undesirable ways. Therefore, this option - is not recommended for use in production or other sensitive - environments.</span>; - } else { - warning = <span>Some options have been selected that may cause a system - to become unstable or may change a system's state in undesirable ways. - Running Infection Monkey in a production or other sensitive environment - with this configuration is not recommended.</span>; - } - return ( <div className={'info-pane-warning'} key={'warning'}> - <WarningIcon/>{warning} + <WarningIcon/>{warningType === WarningType.SINGLE ? getSingleOptionWarning() : getMultipleOptionsWarning()} </div> ); } +function getSingleOptionWarning() { + return ( + <span>This option may cause a system to become unstable or + may change a system's state in undesirable ways. Therefore, this option + is not recommended for use in production or other sensitive + environments.</span> + ); +} + +function getMultipleOptionsWarning() { + return ( + <span>Some options have been selected that may cause a system + to become unstable or may change a system's state in undesirable ways. + Running Infection Monkey in a production or other sensitive environment + with this configuration is not recommended.</span> + ); +} + export {getDefaultPaneParams, InfoPane, WarningType} From 09a8415aec98963aa575d04f0de8950d185398da Mon Sep 17 00:00:00 2001 From: Mike Salvatore <mike.s.salvatore@gmail.com> Date: Mon, 1 Feb 2021 07:14:15 -0500 Subject: [PATCH 38/38] ui: remove disabled/readonly from AdvancedMultiSelect --- .../src/components/ui-components/AdvancedMultiSelect.js | 9 +++------ .../cc/ui/src/components/ui-components/ChildCheckbox.js | 8 +++----- .../cc/ui/src/components/ui-components/MasterCheckbox.js | 3 +-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js index 0dc813dc6..670b99cd7 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/AdvancedMultiSelect.js @@ -11,7 +11,6 @@ import {getFullDefinitionByKey} from './JsonSchemaHelpers'; function AdvancedMultiSelectHeader(props) { const { title, - disabled, onCheckboxClick, checkboxState, hideReset, @@ -20,7 +19,7 @@ function AdvancedMultiSelectHeader(props) { return ( <Card.Header className="d-flex justify-content-between"> - <MasterCheckbox title={title} disabled={disabled} onClick={onCheckboxClick} checkboxState={checkboxState}/> + <MasterCheckbox title={title} onClick={onCheckboxClick} checkboxState={checkboxState}/> <Button className={'reset-safe-defaults'} type={'reset'} variant={'warning'} hidden={hideReset} onClick={onResetClick}> Reset to safe defaults @@ -165,8 +164,6 @@ class AdvancedMultiSelect extends React.Component { schema, id, required, - disabled, - readonly, multiple, autofocus } = this.props; @@ -174,12 +171,12 @@ class AdvancedMultiSelect extends React.Component { return ( <div className={'advanced-multi-select'}> <AdvancedMultiSelectHeader title={schema.title} - disabled={disabled} onCheckboxClick={this.onMasterCheckboxClick} + onCheckboxClick={this.onMasterCheckboxClick} checkboxState={this.state.masterCheckboxState} hideReset={this.state.hideReset} onResetClick={this.onResetClick}/> <ChildCheckboxContainer id={id} multiple={multiple} required={required} - disabled={disabled || readonly} autoFocus={autofocus} isSafe={this.isSafe} + autoFocus={autofocus} isSafe={this.isSafe} onPaneClick={this.setPaneInfo} onCheckboxClick={this.onChildCheckboxClick} selectedValues={this.props.value} enumOptions={this.enumOptions}/> diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js index 6ebe69985..055087e42 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/ChildCheckbox.js @@ -14,7 +14,6 @@ function ChildCheckboxContainer(props) { id, multiple, required, - disabled, autofocus, onPaneClick, onCheckboxClick, @@ -26,13 +25,13 @@ function ChildCheckboxContainer(props) { <Form.Group style={{height: `${getComponentHeight(enumOptions.length)}px`}} id={id} multiple={multiple} className='choice-block form-control' - required={required} disabled={disabled} autoFocus={autofocus}> + required={required} autoFocus={autofocus}> { enumOptions.map(({value, label}, i) => { return ( <ChildCheckbox key={i} onPaneClick={onPaneClick} onClick={onCheckboxClick} value={value} - disabled={disabled} label={label} checkboxState={selectedValues.includes(value)} + label={label} checkboxState={selectedValues.includes(value)} safe={isSafe(value)}/> ); } @@ -46,7 +45,6 @@ function ChildCheckbox(props) { onPaneClick, onClick, value, - disabled, label, checkboxState, safe @@ -54,7 +52,7 @@ function ChildCheckbox(props) { return ( <Form.Group onClick={() => onPaneClick(value)}> - <Button value={value} variant={'link'} disabled={disabled} onClick={() => onClick(value)}> + <Button value={value} variant={'link'} onClick={() => onClick(value)}> <FontAwesomeIcon icon={checkboxState ? faCheckSquare : faSquare}/> </Button> <span key={'label'} className={'option-text'}>{label}</span> diff --git a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js index b5a646aca..907ccf08f 100644 --- a/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js +++ b/monkey/monkey_island/cc/ui/src/components/ui-components/MasterCheckbox.js @@ -15,7 +15,6 @@ const MasterCheckboxState = { function MasterCheckbox(props) { const { title, - disabled, onClick, checkboxState } = props; @@ -30,7 +29,7 @@ function MasterCheckbox(props) { return ( <div className={'master-checkbox'}> - <Button key={`${title}-button`} variant={'link'} disabled={disabled} onClick={onClick}> + <Button key={`${title}-button`} variant={'link'} onClick={onClick}> <FontAwesomeIcon icon={newCheckboxIcon}/> </Button> <span className={'header-title'}>{title}</span>