if ($this->_action & CRM_Core_Action::VIEW) {
// Get the tree of custom fields.
- $this->_groupTree = CRM_Core_BAO_CustomGroup::getTree('Activity', $this,
+ $this->_groupTree = CRM_Core_BAO_CustomGroup::getTree('Activity', NULL,
$this->_activityId, 0, $this->_activityTypeId
);
}
$entitySubType = !empty($values['case_type_id']) ? $values['case_type_id'] : NULL;
$this->assign('caseTypeID', $entitySubType);
$groupTree = CRM_Core_BAO_CustomGroup::getTree('Case',
- $this,
+ NULL,
$this->_caseID,
NULL,
$entitySubType
$this->_contactID = CRM_Utils_Request::retrieve('cid', 'Positive', $this, TRUE);
$groupTree = CRM_Core_BAO_CustomGroup::getTree('Case',
- $this,
+ NULL,
$this->_entityID,
$this->_groupID,
$this->_subTypeID
if ($this->_copyValueId) {
// cached tree is fetched
$groupTree = CRM_Core_BAO_CustomGroup::getTree($this->_type,
- $this,
+ NULL,
$this->_entityId,
$this->_groupID,
array(),
}
$groupTree = CRM_Core_BAO_CustomGroup::getTree($this->_contactType,
- $this,
+ NULL,
$this->_tableID,
$this->_groupID,
$this->_contactSubType
if (empty($_POST['hidden_custom_group_count'])) {
// custom data building in edit mode (required to handle multi-value)
- $groupTree = CRM_Core_BAO_CustomGroup::getTree($this->_contactType, $this, $this->_tableID,
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree($this->_contactType, NULL, $this->_tableID,
$this->_groupID, $this->_contactSubType
);
$customValueCount = CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, TRUE, $this->_groupID, NULL, NULL, $this->_tableID);
$form->assign('geoCode', $geoCode);
// Process any address custom data -
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Address',
- $form,
- $entityId
- );
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Address', NULL, $entityId);
if (isset($groupTree) && is_array($groupTree)) {
// use simplified formatted groupTree
public function __construct(&$formValues) {
parent::__construct($formValues);
- $this->_groupTree = CRM_Core_BAO_CustomGroup::getTree("'Contact', 'Individual', 'Organization', 'Household'",
- CRM_Core_DAO::$_nullObject,
- NULL, -1
- );
+ $this->_groupTree = CRM_Core_BAO_CustomGroup::getTree("'Contact', 'Individual', 'Organization', 'Household'", NULL, NULL, -1);
$this->_group = CRM_Utils_Array::value('group', $this->_formValues);
$modeFill = TRUE;
}
- $groupTree = CRM_Core_BAO_CustomGroup::getTree($params['contact_type'], CRM_Core_DAO::$_nullObject, $cid, 0, NULL);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree($params['contact_type'], NULL, $cid, 0, NULL);
CRM_Core_BAO_CustomGroup::setDefaults($groupTree, $defaults, FALSE, FALSE);
$locationFields = array(
}
// add custom data of type address
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Address',
- $this, $idValue
- );
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Address', NULL, $idValue);
// we setting the prefix to dnc_ below so that we don't overwrite smarty's grouptree var.
$currentAddressBlock['address'][$locBlockNo]['custom'] = CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, "dnc_");
//custom groups Inline
$entityType = CRM_Contact_BAO_Contact::getContactType($contactId);
$entitySubType = CRM_Contact_BAO_Contact::getContactSubType($contactId);
- $groupTree = CRM_Core_BAO_CustomGroup::getTree($entityType, $this, $contactId,
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree($entityType, NULL, $contactId,
$cgId, $entitySubType
);
$details = CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $contactId);
if ($this->_multiRecordDisplay == 'single') {
$groupTitle = CRM_Core_BAO_CustomGroup::getTitle($this->_groupId);
CRM_Utils_System::setTitle(ts('View %1 Record', array(1 => $groupTitle)));
- $groupTree = CRM_Core_BAO_CustomGroup::getTree($entityType, $this, $this->_contactId,
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree($entityType, NULL, $this->_contactId,
$this->_groupId, $entitySubType, NULL, TRUE, NULL, FALSE, TRUE, $this->_cgcount
);
$this->assign('skipTitle', 1);
}
else {
- $groupTree = CRM_Core_BAO_CustomGroup::getTree($entityType, $this, $this->_contactId,
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree($entityType, NULL, $this->_contactId,
$this->_groupId, $entitySubType
);
}
$viewNote = CRM_Core_BAO_Note::getNote($this->_id);
$this->assign('viewNote', $viewNote);
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Relationship', $this, $this->_id, 0, $relType);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Relationship', NULL, $this->_id, 0, $relType);
CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_id);
$rType = CRM_Utils_Array::value('rtype', $viewRelationship[$this->_id]);
);
}
$groupTree = CRM_Core_BAO_CustomGroup::getTree($entityType,
- $this,
+ NULL,
$this->_contactId,
NULL,
$entitySubType
$idValue = $blockVal['master_id'];
}
}
- $groupTree = CRM_Core_BAO_CustomGroup::getTree(ucfirst($key),
- $this,
- $idValue
- );
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree(ucfirst($key), NULL, $idValue);
// we setting the prefix to dnc_ below so that we don't overwrite smarty's grouptree var.
$defaults[$key][$blockId]['custom'] = CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, "dnc_");
}
CRM_Event_BAO_Event::retrieve($eventParams, $values['event']);
// add custom fields for event
- $eventGroupTree = CRM_Core_BAO_CustomGroup::getTree('Event', $this->_relatedObjects['event'], $this->_relatedObjects['event']->id);
+ $eventGroupTree = CRM_Core_BAO_CustomGroup::getTree('Event', NULL, $this->_relatedObjects['event']->id);
$eventCustomGroup = array();
foreach ($eventGroupTree as $key => $group) {
CRM_Event_BAO_Participant::getValues($participantParams, $values['participant'], $participantIds);
// add custom fields for event
- $participantGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', $this->_relatedObjects['participant'], $this->_relatedObjects['participant']->id);
+ $participantGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', NULL, $this->_relatedObjects['participant']->id);
$participantCustomGroup = array();
foreach ($participantGroupTree as $key => $group) {
if ($key === 'info') {
}
}
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Contribution', $this, $this->id);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Contribution', NULL, $this->id);
$customGroup = array();
foreach ($groupTree as $key => $group) {
}
}
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Contribution', $this, $id, 0, CRM_Utils_Array::value('financial_type_id', $values));
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Contribution', NULL, $id, 0, CRM_Utils_Array::value('financial_type_id', $values));
CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $id);
$premiumId = NULL;
*
* @param string $entityType
* Of the contact whose contact type is needed.
- * @param CRM_Core_Form $deprecated
- * Not used.
+ * @param array $toReturn
+ * What data should be returned. ['custom_group' => ['id', 'name', etc.], 'custom_field' => ['id', 'label', etc.]]
* @param int $entityID
* @param int $groupID
* @param array $subTypes
* api - through which it is properly tested - so can be refactored with some comfort.)
*
* @param bool $checkPermission
- * @param varchar $singleRecord
+ * @param string|int $singleRecord
* holds 'new' or id if view/edit/copy form for a single record is being loaded.
* @param bool $showPublicOnly
*
*/
public static function getTree(
$entityType,
- $deprecated = NULL,
+ $toReturn = array(),
$entityID = NULL,
$groupID = NULL,
$subTypes = array(),
// create a new tree
$strWhere = $orderBy = '';
- // using tableData to build the queryString
+ // legacy hardcoded list of data to return
$tableData = array(
- 'civicrm_custom_field' => array(
+ 'custom_field' => array(
'id',
'name',
'label',
'option_group_id',
'in_selector',
),
- 'civicrm_custom_group' => array(
+ 'custom_group' => array(
'id',
'name',
'table_name',
'is_public',
),
);
+ if (!$toReturn || !is_array($toReturn)) {
+ $toReturn = $tableData;
+ }
+ else {
+ $toReturn = array_filter($toReturn) + $tableData;
+ // Merge in required fields that we must have
+ $toReturn['custom_field'] = array_unique(array_merge($toReturn['custom_field'], array('id', 'column_name', 'data_type')));
+ $toReturn['custom_group'] = array_unique(array_merge($toReturn['custom_group'], array('id', 'is_multiple', 'table_name', 'name')));
+ // Validate return fields
+ $toReturn['custom_field'] = array_intersect($toReturn['custom_field'], array_keys(CRM_Core_DAO_CustomField::fieldKeys()));
+ $toReturn['custom_group'] = array_intersect($toReturn['custom_group'], array_keys(CRM_Core_DAO_CustomGroup::fieldKeys()));
+ }
// create select
$select = array();
- foreach ($tableData as $tableName => $tableColumn) {
+ foreach ($toReturn as $tableName => $tableColumn) {
foreach ($tableColumn as $columnName) {
- $alias = $tableName . "_" . $columnName;
- $select[] = "{$tableName}.{$columnName} as {$tableName}_{$columnName}";
+ $select[] = "civicrm_{$tableName}.{$columnName} as civicrm_{$tableName}_{$columnName}";
}
}
$strSelect = "SELECT " . implode(', ', $select);
$groupTree[$groupID]['id'] = $groupID;
// populate the group information
- foreach ($tableData['civicrm_custom_group'] as $fieldName) {
+ foreach ($toReturn['custom_group'] as $fieldName) {
$fullFieldName = "civicrm_custom_group_$fieldName";
if ($fieldName == 'id' ||
is_null($crmDAO->$fullFieldName)
$customValueTables[$crmDAO->civicrm_custom_group_table_name][$crmDAO->civicrm_custom_field_column_name] = 1;
$groupTree[$groupID]['fields'][$fieldId]['id'] = $fieldId;
// populate information for a custom field
- foreach ($tableData['civicrm_custom_field'] as $fieldName) {
+ foreach ($toReturn['custom_field'] as $fieldName) {
$fullFieldName = "civicrm_custom_field_$fieldName";
if ($fieldName == 'id' ||
is_null($crmDAO->$fullFieldName)
//get the groupTree as per subTypes.
$groupTree = array();
foreach ($componentSubType as $subType) {
- $subTree = CRM_Core_BAO_CustomGroup::getTree($componentBAOName, CRM_Core_DAO::$_nullObject,
+ $subTree = CRM_Core_BAO_CustomGroup::getTree($componentBAOName, NULL,
$componentId, 0, $values[$subType]
);
$groupTree = CRM_Utils_Array::crmArrayMerge($groupTree, $subTree);
}
$groupTree = CRM_Core_BAO_CustomGroup::getTree($form->_type,
- $form,
+ NULL,
$form->_entityId,
$gid,
$subType,
}
}
// add custom data fields
- foreach (CRM_Core_BAO_CustomGroup::getTree($ctype, CRM_Core_DAO::$_nullObject, NULL, -1) as $key => $cg) {
+ foreach (CRM_Core_BAO_CustomGroup::getTree($ctype, NULL, NULL, -1) as $key => $cg) {
if (!is_int($key)) {
continue;
}
}
// handle custom data
- $tree = CRM_Core_BAO_CustomGroup::getTree($ctype, CRM_Core_DAO::$_nullObject, NULL, -1);
+ $tree = CRM_Core_BAO_CustomGroup::getTree($ctype, NULL, NULL, -1);
CRM_Core_BAO_CustomGroup::postProcess($tree, $fields, TRUE);
foreach ($tree as $key => $cg) {
if (!is_int($key)) {
$mainTree = CRM_Core_BAO_CustomGroup::getTree($main['contact_type'], NULL, $mainId, -1,
CRM_Utils_Array::value('contact_sub_type', $main), NULL, TRUE, NULL, TRUE, $checkPermissions
);
- $otherTree = CRM_Core_BAO_CustomGroup::getTree($main['contact_type'], CRM_Core_DAO::$_nullObject, $otherId, -1,
+ $otherTree = CRM_Core_BAO_CustomGroup::getTree($main['contact_type'], NULL, $otherId, -1,
CRM_Utils_Array::value('contact_sub_type', $other), NULL, TRUE, NULL, TRUE, $checkPermissions
);
CRM_Core_DAO::freeResult();
// fix custom fields so they're edible by createProfileContact()
static $treeCache = array();
if (!array_key_exists($migrationInfo['main_details']['contact_type'], $treeCache)) {
- $treeCache[$migrationInfo['main_details']['contact_type']] = CRM_Core_BAO_CustomGroup::getTree($migrationInfo['main_details']['contact_type'],
- CRM_Core_DAO::$_nullObject, NULL, -1
- );
+ $treeCache[$migrationInfo['main_details']['contact_type']] = CRM_Core_BAO_CustomGroup::getTree($migrationInfo['main_details']['contact_type'], NULL, NULL, -1);
}
$cFields = array();
$finalTree = array();
foreach ($allRoleIDs as $k => $v) {
- $roleGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', $this, $participantID, NULL, $v, $roleCustomDataTypeID);
- $eventGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', $this, $participantID, NULL,
+ $roleGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', NULL, $participantID, NULL, $v, $roleCustomDataTypeID);
+ $eventGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', NULL, $participantID, NULL,
$values[$participantID]['event_id'], $eventNameCustomDataTypeID
);
$eventTypeID = CRM_Core_DAO::getFieldValue("CRM_Event_DAO_Event", $values[$participantID]['event_id'], 'event_type_id', 'id');
- $eventTypeGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', $this, $participantID, NULL, $eventTypeID, $eventTypeCustomDataTypeID);
+ $eventTypeGroupTree = CRM_Core_BAO_CustomGroup::getTree('Participant', NULL, $participantID, NULL, $eventTypeID, $eventTypeCustomDataTypeID);
$groupTree = CRM_Utils_Array::crmArrayMerge($roleGroupTree, $eventGroupTree);
$groupTree = CRM_Utils_Array::crmArrayMerge($groupTree, $eventTypeGroupTree);
- $groupTree = CRM_Utils_Array::crmArrayMerge($groupTree, CRM_Core_BAO_CustomGroup::getTree('Participant', $this, $participantID));
+ $groupTree = CRM_Utils_Array::crmArrayMerge($groupTree, CRM_Core_BAO_CustomGroup::getTree('Participant', NULL, $participantID));
foreach ($groupTree as $treeId => $trees) {
$finalTree[$treeId] = $trees;
}
}
//get event custom field information
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Event', $this, $this->_eventId, 0, $this->_values['event']['event_type_id']);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Event', NULL, $this->_eventId, 0, $this->_values['event']['event_type_id']);
$primaryParticipant['eventCustomFields'] = $groupTree;
// call postprocess hook before leaving
}
//retrieve custom field information
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Event', $this, $this->_id, 0, $values['event']['event_type_id'], NULL, TRUE, NULL, FALSE, TRUE, NULL, TRUE);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Event', NULL, $this->_id, 0, $values['event']['event_type_id'], NULL, TRUE, NULL, FALSE, TRUE, NULL, TRUE);
CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_id);
$this->assign('action', CRM_Core_Action::VIEW);
//To show the event location on maps directly on event info page
$this->assign('attachment', $attachment);
$grantType = CRM_Core_DAO::getFieldValue("CRM_Grant_DAO_Grant", $this->_id, "grant_type_id");
- $groupTree = CRM_Core_BAO_CustomGroup::getTree("Grant", $this, $this->_id, 0, $grantType);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree("Grant", NULL, $this->_id, 0, $grantType);
CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $this->_id);
$this->assign('id', $this->_id);
$this->_params['paidBy'] = $paymentInstrument[$this->_params['payment_instrument_id']];
}
//get the group Tree
- $this->_groupTree = CRM_Core_BAO_CustomGroup::getTree('Membership', $this, $this->_id, FALSE, $this->_memType);
+ $this->_groupTree = CRM_Core_BAO_CustomGroup::getTree('Membership', NULL, $this->_id, FALSE, $this->_memType);
// retrieve custom data
$customFields = $customValues = $fo = array();
$memType = CRM_Core_DAO::getFieldValue("CRM_Member_DAO_Membership", $id, "membership_type_id");
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Membership', $this, $id, 0, $memType);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Membership', NULL, $id, 0, $memType);
CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $id);
$isRecur = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $id, 'contribution_recur_id');
// handle custom data.
if (!empty($params['hidden_custom'])) {
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Pledge', CRM_Core_DAO::$_nullObject, $params['id']);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Pledge', NULL, $params['id']);
$pledgeParams = array(array('pledge_id', '=', $params['id'], 0, 0));
$customGroup = array();
// retrieve custom data
}
// handle custom data.
- $groupTree = CRM_Core_BAO_CustomGroup::getTree('Pledge', $this, $params['id']);
+ $groupTree = CRM_Core_BAO_CustomGroup::getTree('Pledge', NULL, $params['id']);
CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree, FALSE, NULL, NULL, NULL, $params['id']);
if (!empty($values['contribution_page_id'])) {
'api.required' => 1,
'options' => array_combine($entities, $entities),
);
+ // Return params for custom group, field & value
+ foreach (CRM_Core_DAO_CustomGroup::fields() as $field) {
+ $name = 'custom_group.' . $field['name'];
+ $spec[$name] = array('name' => $name) + $field;
+ }
+ foreach (CRM_Core_DAO_CustomField::fields() as $field) {
+ $name = 'custom_field.' . $field['name'];
+ $spec[$name] = array('name' => $name) + $field;
+ }
+ $spec['custom_value.id'] = array(
+ 'title' => 'Custom Value Id',
+ 'description' => 'Id of record in custom value table',
+ 'type' => CRM_Utils_Type::T_INT,
+ );
+ $spec['custom_value.data'] = array(
+ 'title' => 'Custom Value (Raw)',
+ 'description' => 'Raw value as stored in the database',
+ 'type' => CRM_Utils_Type::T_STRING,
+ );
+ $spec['custom_value.display'] = array(
+ 'title' => 'Custom Value (Formatted)',
+ 'description' => 'Custom value formatted for display',
+ 'type' => CRM_Utils_Type::T_STRING,
+ );
}
/**
$toReturn[$type][] = $field;
}
}
+ // We must have a name if not indexing sequentially
+ if (empty($params['sequential']) && $toReturn['custom_field']) {
+ $toReturn['custom_field'][] = 'name';
+ }
switch ($params['entity_type']) {
case 'Contact':
$ret = array('entityType' => 'contact_type', 'subTypes' => 'contact_sub_type');
}
}
}
- $tree = CRM_Core_BAO_CustomGroup::getTree($treeParams['entityType'], NULL, $params['entity_id'], NULL, $treeParams['subTypes'], $treeParams['subName'], TRUE, NULL, FALSE, CRM_Utils_Array::value('check_permissions', $params, TRUE));
+ $tree = CRM_Core_BAO_CustomGroup::getTree($treeParams['entityType'], $toReturn, $params['entity_id'], NULL, $treeParams['subTypes'], $treeParams['subName'], TRUE, NULL, FALSE, CRM_Utils_Array::value('check_permissions', $params, TRUE));
unset($tree['info']);
$result = array();
foreach ($tree as $group) {
populateFields(fields, entity, action, '', required);
showFields(required);
renderJoinSelector();
- if (_.includes(['get', 'getsingle', 'getvalue', 'getstat'], action)) {
+ if (_.includes(['get', 'getsingle', 'getvalue', 'getstat', 'gettree'], action)) {
showReturn();
}
});
));
$fieldName = 'custom_' . $cf['id'];
$contact = $this->individualCreate(array($fieldName => array('2', '3')));
+
+ // Verify values are formatted correctly
$tree = $this->callAPISuccess('CustomValue', 'gettree', array('entity_type' => 'Contact', 'entity_id' => $contact));
$this->assertEquals(array('2', '3'), $tree['values']['TestGettree']['fields']['got_options']['value']['data']);
$this->assertEquals('Two, Three', $tree['values']['TestGettree']['fields']['got_options']['value']['display']);
+
+ // Try limiting the return params
+ $tree = $this->callAPISuccess('CustomValue', 'gettree', array(
+ 'entity_type' => 'Contact',
+ 'entity_id' => $contact,
+ 'return' => array(
+ 'custom_group.id',
+ 'custom_field.id',
+ ),
+ ));
+ $this->assertEquals(array('2', '3'), $tree['values']['TestGettree']['fields']['got_options']['value']['data']);
+ $this->assertEquals(array('id', 'fields'), array_keys($tree['values']['TestGettree']));
+
+ // Verify that custom set appears for individuals even who don't have any custom data
+ $contact2 = $this->individualCreate();
+ $tree = $this->callAPISuccess('CustomValue', 'gettree', array('entity_type' => 'Contact', 'entity_id' => $contact2));
+ $this->assertArrayHasKey('TestGettree', $tree['values']);
+
+ // Verify that custom set doesn't appear for other contact types
+ $org = $this->organizationCreate();
+ $tree = $this->callAPISuccess('CustomValue', 'gettree', array('entity_type' => 'Contact', 'entity_id' => $org));
+ $this->assertArrayNotHasKey('TestGettree', $tree['values']);
+
+ }
+
+ public function testGettree_getfields() {
+ $fields = $this->callAPISuccess('CustomValue', 'getfields', array('api_action' => 'gettree'));
+ $fields = $fields['values'];
+ $this->assertTrue((bool) $fields['entity_id']['api.required']);
+ $this->assertTrue((bool) $fields['entity_type']['api.required']);
+ $this->assertEquals('custom_group.id', $fields['custom_group.id']['name']);
+ $this->assertEquals('custom_field.id', $fields['custom_field.id']['name']);
+ $this->assertEquals('custom_value.id', $fields['custom_value.id']['name']);
}
}