// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

export default {
  INIT_REPLICATION: 'INIT_REPLICATION',
  CHANGE_REPLICATION_SOURCE: 'CHANGE_REPLICATION_SOURCE',
  REPLICATION_DATABASES_LOADED: 'REPLICATION_DATABASES_LOADED',
  REPLICATION_UPDATE_FORM_FIELD: 'REPLICATION_UPDATE_FORM_FIELD',
  REPLICATION_CLEAR_FORM: 'REPLICATION_CLEAR_FORM',
  REPLICATION_STARTING: 'REPLICATION_STARTING',
  REPLICATION_STATUS: 'REPLICATION_STATUS',
  REPLICATION_FETCHING_STATUS: 'REPLICATION_FETCHING_STATUS',
  REPLICATION_FILTER_DOCS: 'REPLICATION_FILTER_DOCS',
  REPLICATION_TOGGLE_ALL_DOCS: 'REPLICATION_TOGGLE_ALL_DOCS',
  REPLICATION_TOGGLE_DOC: 'REPLICATION_TOGGLE_DOC',
  REPLICATION_DELETE_DOCS: 'REPLICATION_DELETE_DOCS',
  REPLICATION_SET_STATE_FROM_DOC: 'REPLICATION_SET_STATE_FROM_DOC',
  REPLICATION_SHOW_CONFLICT_MODAL: 'REPLICATION_SHOW_CONFLICT_MODAL',
  REPLICATION_HIDE_CONFLICT_MODAL: 'REPLICATION_HIDE_CONFLICT_MODAL',
  REPLICATION_CHANGE_ACTIVITY_SORT: 'REPLICATION_CHANGE_ACTIVITY_SORT',
  REPLICATION_CLEAR_SELECTED_DOCS: 'REPLICATION_CLEAR_SELECTED_DOCS',
  REPLICATION_CHANGE_TAB_SECTION: 'REPLICATION_CHANGE_TAB_SECTION',
  REPLICATION_FETCHING_REPLICATE_STATUS: 'REPLICATION_FETCHING_REPLICATE_STATUS',
  REPLICATION_REPLICATE_STATUS: 'REPLICATION_REPLICATE_STATUS',
  REPLICATION_SUPPORT_NEW_API: 'REPLICATION_SUPPORT_NEW_API',
  REPLICATION_FILTER_REPLICATE: 'REPLICATION_FILTER_REPLICATE',
  REPLICATION_TOGGLE_ALL_REPLICATE: 'REPLICATION_TOGGLE_ALL_REPLICATE',
  REPLICATION_TOGGLE_REPLICATE: 'REPLICATION_TOGGLE_REPLICATE',
  REPLICATION_CLEAR_SELECTED_REPLICATES: 'REPLICATION_CLEAR_SELECTED_REPLICATES',
  REPLICATION_FETCHING_FORM_STATE: 'REPLICATION_FETCHING_FORM_STATE',
  REPLICATION_HIDE_PASSWORD_MODAL: 'REPLICATION_HIDE_PASSWORD_MODAL',
  REPLICATION_SHOW_PASSWORD_MODAL: 'REPLICATION_SHOW_PASSWORD_MODAL',
  REPLICATION_SET_PAGE_LIMIT: 'REPLICATION_SET_PAGE_LIMIT'
};
