text:
package com.google.sampling.experiential.server;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Logger;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.jdo.Transaction;

import org.apache.commons.codec.binary.Base64;
import org.datanucleus.store.appengine.query.JDOCursorHelper;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.appengine.api.datastore.Blob;
import com.google.appengine.api.datastore.Cursor;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.FilterPredicate;
import com.google.appengine.api.datastore.QueryResultList;
import com.google.appengine.api.modules.ModulesServiceFactory;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.utils.SystemProperty;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.sampling.experiential.dao.CSEventOutputDao;
import com.google.sampling.experiential.dao.CSFailedEventDao;
import com.google.sampling.experiential.dao.CSOldEventOutputDao;
import com.google.sampling.experiential.dao.impl.CSEventOutputDaoImpl;
import com.google.sampling.experiential.dao.impl.CSFailedEventDaoImpl;
import com.google.sampling.experiential.dao.impl.CSOldEventOutputDaoImpl;
import com.google.sampling.experiential.datastore.EventEntityConverter;
import com.google.sampling.experiential.model.Event;
import com.google.sampling.experiential.model.Experiment;
import com.google.sampling.experiential.model.PhotoBlob;
import com.google.sampling.experiential.model.What;
import com.google.sampling.experiential.server.stats.participation.ParticipationStatsService;
import com.google.sampling.experiential.shared.EventDAO;
import com.google.sampling.experiential.shared.WhatDAO;
import com.pacoapp.paco.shared.util.Constants;
import com.pacoapp.paco.shared.util.ErrorMessages;

/**
 * Retrieve Event objects from the JDO store.
 *
 * @author Bob Evans
 *
 */
public class EventRetriever {

  private static final int DEFAULT_FETCH_LIMIT = 20000;
  private static EventRetriever instance;
  private static final Logger log = Logger.getLogger(EventRetriever.class.getName());
  private CSFailedEventDao failedEventDaoImpl = new CSFailedEventDaoImpl();
  private CSEventOutputDao eventOutputDaoImpl = new CSEventOutputDaoImpl();
  private CSOldEventOutputDao oldEventOutputDaoImpl = new CSOldEventOutputDaoImpl();
  private static DateTimeFormatter dfMs = DateTimeFormat.forPattern(TimeUtil.DATETIME_FORMAT_MS).withOffsetParsed();

  @VisibleForTesting
  EventRetriever() {
  }

  public static synchronized EventRetriever getInstance() {
    if (instance == null) {
      instance = new EventRetriever();
    }
    return instance;
  }

  public void postEvent(boolean persistInCloudSqlOnly, JSONObject eventJson, String who, String lat, String lon,
                        Date whenDate, String appId, String pacoVersion, Set<What> whats, boolean shared,
                        String experimentId, String experimentName, Integer experimentVersion, DateTime responseTime,
                        DateTime scheduledTime, List<PhotoBlob> blobs, String groupName, Long actionTriggerId,
                        Long actionTriggerSpecId, Long actionId) {
    final String tz = responseTime != null
                      && responseTime.getZone() != null ? responseTime.getZone().toString()
                                                        : scheduledTime != null
                                                          && scheduledTime.getZone() != null ? scheduledTime.getZone()
                                                                                .toString()
                                                                                : null;

    postEvent(persistInCloudSqlOnly, eventJson, who, lat, lon, whenDate, appId, pacoVersion, whats, shared,
              experimentId, experimentName, experimentVersion, responseTime != null ? responseTime.toDate() : null,
              scheduledTime != null ? scheduledTime.toDate() : null, blobs, tz, groupName, actionTriggerId,
              actionTriggerSpecId, actionId);

  }

  public void postEvent(String who, String lat, String lon, Date whenDate, String appId, String pacoVersion,
                        Set<What> whats, boolean shared, String experimentId, String experimentName,
                        Integer experimentVersion, DateTime responseTime, DateTime scheduledTime, List<PhotoBlob> blobs,
                        String groupName, Long actionTriggerId, Long actionTriggerSpecId, Long actionId) {

    postEvent(true, null, who, lat, lon, whenDate, appId, pacoVersion, whats, shared, experimentId, experimentName,
              experimentVersion, responseTime, scheduledTime, blobs, groupName, actionTriggerId, actionTriggerSpecId,
              actionId);

  }

  public void postEvent(boolean persistInCloudSqlOnly, JSONObject eventJson, String who, String lat, String lon,
                        Date whenDate, String appId, String pacoVersion, Set<What> what, boolean shared,
                        String experimentId, String experimentName, Integer experimentVersion, Date responseTime,
                        Date scheduledTime, List<PhotoBlob> blobs, String tz, String groupName, Long actionTriggerId,
                        Long actionTriggerSpecId, Long actionId) {

    boolean isJoinEvent = false;
    for (What whatItem : what) {
      if (whatItem.getName().toLowerCase().equals("joined") && whatItem.getValue().equals("true")) {
        isJoinEvent = true;
      }
    }
    boolean isStopEvent = false;
    for (What whatItem : what) {
      if (whatItem.getName().toLowerCase().equals("joined") && whatItem.getValue().equals("false")) {
        isStopEvent = true;
      }
    }
    boolean isScheduleEvent = false;
    for (What whatItem : what) {
      if (whatItem.getName().toLowerCase().equals("schedule") && !Strings.isNullOrEmpty(whatItem.getValue())) {
        isScheduleEvent = true;
      }
    }

    PersistenceManager pm = PMF.get().getPersistenceManager();
    Event event = new Event(who, lat, lon, whenDate, appId, pacoVersion, what, shared, experimentId, experimentName,
                            experimentVersion, responseTime, scheduledTime, blobs, tz, groupName, actionTriggerId,
                            actionTriggerSpecId, actionId);

    // persistInCloudSql flag will determine which flow to go. Flow 1:persist in
    // data store and send event to the cloud sql queue
    // Flow 2: persist in cloud sql
    if (persistInCloudSqlOnly && eventJson != null) {
      try {
        event.setId(eventJson.getLong("id"));
        event.setPacoVersion(eventJson.getString("pacoVersion"));
        event.setAppId(eventJson.getString("appId"));
        event.setTimeZone(eventJson.getString("tz"));
        event.setWhen(dfMs.parseDateTime(eventJson.getString("whenDate")).toDate());
        event.setWho(eventJson.getString("who"));
        if (Constants.USE_OLD_FORMAT_FLAG) {
          log.info("in old way");
          oldEventOutputDaoImpl.insertEventAndOutputsInOldWay(event);
        } else {
          log.info("in new way");
          eventOutputDaoImpl.insertEventAndOutputs(event);
        }
      } catch (JSONException e) {
        failedEventDaoImpl.insertFailedEvent(eventJson.toString(), ErrorMessages.JSON_EXCEPTION.getDescription(), e.getMessage());
        log.warning(ErrorMessages.JSON_EXCEPTION.getDescription() + " for request: " + eventJson + " : " + ExceptionUtil.getStackTraceAsString(e));
      } catch (SQLException sqle) {
        failedEventDaoImpl.insertFailedEvent(eventJson.toString(), ErrorMessages.SQL_INSERT_EXCEPTION.getDescription(), sqle.getMessage());
        log.warning(ErrorMessages.SQL_INSERT_EXCEPTION.getDescription() + " for  request: " + eventJson + " : " + ExceptionUtil.getStackTraceAsString(sqle));
      } catch (ParseException e) {
        failedEventDaoImpl.insertFailedEvent(eventJson.toString(), ErrorMessages.TEXT_PARSE_EXCEPTION.getDescription(), e.getMessage());
        log.warning(ErrorMessages.TEXT_PARSE_EXCEPTION.getDescription() + " for request: " + eventJson + " : " + ExceptionUtil.getStackTraceAsString(e));
      } catch (Exception e) {
        failedEventDaoImpl.insertFailedEvent(eventJson.toString(), ErrorMessages.GENERAL_EXCEPTION.getDescription(), e.getMessage());
        log.warning(ErrorMessages.GENERAL_EXCEPTION.getDescription() + " for request: " + eventJson + " : " + ExceptionUtil.getStackTraceAsString(e));
      }
    } else {
      Transaction tx = null;
      try {
        tx = pm.currentTransaction();
        tx.begin();
        pm.makePersistent(event);
        event.setWhat(what);
        if (isJoinEvent) {
          ExperimentAccessManager.addJoinedExperimentFor(who, Long.valueOf(experimentId), responseTime);
        } else if (!isScheduleEvent && !isStopEvent) {
          new ParticipationStatsService().updateResponseCountWithEvent(event);
        }
        //replaceEachBlobInJsonWithTheWordBlob(eventJson, event);
        // TODO remove this so events can get posted to cloud sql while they are posted to data store
        sendToCloudSqlQueue(eventJson, event);
        tx.commit();
        log.info("Event saved in datastore");
      } finally {
        if (tx.isActive()) {
          log.info("Event rolled back");
          tx.rollback();
        }
        pm.close();
      }
    }
  }

  /**
   * A destructive method to replace blobs with the word "blob" so as not to
   * crash the task queue which has a 100k limit on task payload size.
   *
   * We will query for image and audio blob data in a different way.
   *
   * @param eventJson
   * @param event
   */
  private void replaceEachBlobInJsonWithTheWordBlob(JSONObject eventJson, Event event) {
    List<PhotoBlob> blobs = event.getBlobs();
    if (blobs == null || blobs.isEmpty()) {
      return;
    }

    if (!eventJson.has("responses")) {
      log.warning("We have blobs but no responses in an event: " + event.getId());
      return;
    }

    try {
      JSONArray responses = eventJson.getJSONArray("responses");

      for (PhotoBlob photoBlob : blobs) {
        String blobName = photoBlob.getName();

        for (int i = 0; i < responses.length(); i++) {
          JSONObject response = responses.getJSONObject(i);
          if (response.has("name") && response.get("name").equals(blobName)) {
            response.put("answer", "blob");
            break;
          }
        }
      }
    } catch (JSONException e) {
      log.severe("JSON Exception on event: " + event.getId() + ". " + e.getMessage());
    }

  }

  public void sendToCloudSqlQueue(JSONObject eventJson, Event event) {
    DateTimeFormatter fmt = DateTimeFormat.forPattern(TimeUtil.DATETIME_FORMAT_MS);
    Queue queue = QueueFactory.getQueue("cloud-sql");
    try {
      // In the flow of saving event data to data store, pacoversion and appid
      // comes in request header.
      // Adding these values to json, so that we can persist this data on to
      // cloud sql too.
      eventJson.put("id", event.getId());
      eventJson.put("pacoVersion", event.getPacoVersion());
      eventJson.put("appId", event.getAppId());
      eventJson.put("tz", event.getTimeZone());
      DateTime whenDate = new DateTime(event.getWhen());
      eventJson.put("whenDate", fmt.print(whenDate));
      eventJson.put("who", event.getWho());
    } catch (JSONException e) {
      log.severe("while sending to cloud sql queue" + e);
    }
    TaskOptions to = TaskOptions.Builder.withUrl("/csInsert").payload(eventJson.toString());
    if (EnvironmentUtil.isDevInstance()) {
      queue.add(to.header("Host", ModulesServiceFactory.getModulesService().getVersionHostname("mapreduce", null)));
    } else {
      queue.add(to);
    }
  }

  @SuppressWarnings("unchecked")
  public List<Event> getEvents(String loggedInUser) {
    PersistenceManager pm = PMF.get().getPersistenceManager();
    Query q = pm.newQuery(Event.class);
    q.setOrdering("when desc");
    q.setFilter("who == whoParam");
    q.declareParameters("String whoParam");
    long t11 = System.currentTimeMillis();
    List<Event> events = (List<Event>) q.execute(loggedInUser);
    adjustTimeZone(events);
    long t12 = System.currentTimeMillis();
    log.info("get execute time: " + (t12 - t11));
    return events;
  }

  public List<Event> getEvents(List<com.google.sampling.experiential.server.Query> queryFilters, String loggedInuser,
                               DateTimeZone clientTimeZone, int offset, int limit) {
    if (limit == 0) {
      limit = DEFAULT_FETCH_LIMIT;
    }

    Set<Event> allEvents = Sets.newHashSet();
    PersistenceManager pm = PMF.get().getPersistenceManager();
    EventJDOQuery eventJDOQuery = createJDOQueryFrom(pm, queryFilters, clientTimeZone);

    long t11 = System.currentTimeMillis();

    List<Long> adminExperiments = getExperimentsForAdmin(loggedInuser);
    log.info("Loggedin user's administered experiments: " + loggedInuser + " has ids: "
             + getIdsQuoted(adminExperiments));

    if (isDevMode() || isUserQueryingTheirOwnData(loggedInuser, eventJDOQuery)) {
      log.info("dev mode or user querying self");
      executeQuery(allEvents, eventJDOQuery);
    } else if (isAnAdministrator(adminExperiments)) {
      log.info("isAnAdmin");
      if (!hasAnExperimentIdFilter(queryFilters)) {
        log.info("No expeirmentfilter");
        eventJDOQuery.addFilters(":p.contains(experimentId)");
        eventJDOQuery.addParameterObjects("(" + getIdsQuoted(adminExperiments) + ")");
        executeQuery(allEvents, eventJDOQuery);
      } else if (hasAnExperimentIdFilter(queryFilters)
                 && !isAdminOfAllExperimentsInQuery(queryFilters, adminExperiments)) {
        if (!eventJDOQuery.hasAWho()) {
          addWhoQueryForLoggedInuser(loggedInuser, eventJDOQuery);
          executeQuery(allEvents, eventJDOQuery);
        } else if (!eventJDOQuery.who().equals(loggedInuser)) {
          addAllSharedEvents(queryFilters, clientTimeZone, allEvents, pm);
        }
      } else {
        executeQuery(allEvents, eventJDOQuery);
      }

    } else {
      addWhoQueryForLoggedInuser(loggedInuser, eventJDOQuery);
      executeQuery(allEvents, eventJDOQuery);
      // also get all shared data that matches the query
      addAllSharedEvents(queryFilters, clientTimeZone, allEvents, pm);
    }

    long t12 = System.currentTimeMillis();
    log.info("get execute time: " + (t12 - t11));

    ArrayList<Event> newArrayList = Lists.newArrayList(allEvents);
    sortList(newArrayList);
    return newArrayList;
  }

  private void addWhoQueryForLoggedInuser(String loggedInuser, EventJDOQuery eventJDOQuery) {
    eventJDOQuery.addFilters("who == whoParam");
    eventJDOQuery.declareParameters("String whoParam");
    eventJDOQuery.addParameterObjects(loggedInuser);
  }

  private void addWhoQueryFilterForLoggedInuser(String loggedInuser, EventDSQuery eventDSQuery) {
    eventDSQuery.addFilter(new FilterPredicate("who", FilterOperator.EQUAL, loggedInuser));
  }

  /**
   * @param queryFilters
   * @param adminExperiments
   * @return
   */
  private boolean isAdminOfAllExperimentsInQuery(List<com.google.sampling.experiential.server.Query> queryFilters,
                                                 List<Long> adminExperiments) {
    if (!isAnAdministrator(adminExperiments)) {
      return false;
    }
    boolean filteringForAdminedExperiment = false;
    for (com.google.sampling.experiential.server.Query query : queryFilters) {
      if (query.getKey().equals("experimentId")) {
        final String queryValue = query.getValue();

        try {
          Long experimentId = Long.parseLong(queryValue);
          filteringForAdminedExperiment = adminExperiments.contains(experimentId);
          if (!filteringForAdminedExperiment) { // All filters must be admin'ed
                                                // experiments for now.
            return false;
          }
        } catch (NumberFormatException e) {
          return false;
        }
      }
    }
    return filteringForAdminedExperiment;
  }

  private boolean isUserQueryingTheirOwnData(String loggedInuser, EventJDOQuery eventJDOQuery) {
    return (eventJDOQuery.hasAWho() && eventJDOQuery.who().equals(loggedInuser));
  }

  private boolean isUserQueryingTheirOwnData(String loggedInuser, EventDSQuery eventDSQuery) {
    return (eventDSQuery.hasAWho() && eventDSQuery.who().equals(loggedInuser));
  }

  private void executeQuery(Set<Event> allEvents, EventJDOQuery eventJDOQuery) {
    Query query = eventJDOQuery.getQuery();

    log.info("Query = " + query.toString());
    log.info("Query params = " + Joiner.on(",").join(eventJDOQuery.getParameters()));

    final Object[] params = eventJDOQuery.getParameters().toArray();
    List<Event> queryResults = null;
    if (params != null && params.length > 0) {
      queryResults = (List<Event>) query.executeWithArray(params);
    } else {
      queryResults = (List<Event>) query.execute();
    }
    allEvents.addAll(queryResults);
    adjustTimeZone(allEvents);
  }

  private void executeQuery(Set<Event> allEvents, EventDSQuery eventJDOQuery) {
    log.info("Starting to execute ds query");
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
    Cursor cursor = null;
    int count = 0;
    while (true) {
      log.info("entering query loop. Count = " + count);
      int pageSize = 1000;
      FetchOptions fetchOptions = FetchOptions.Builder.withLimit(pageSize);

      if (cursor != null) {
        fetchOptions.startCursor(cursor);
      }

      com.google.appengine.api.datastore.Query q = new com.google.appengine.api.datastore.Query("Event");
      eventJDOQuery.applyFiltersToQuery(q);

      PreparedQuery pq = datastore.prepare(q);
      log.info("execute query: " + q.toString());

      QueryResultList<Entity> results = pq.asQueryResultList(fetchOptions);
      count = count + results.size();
      if (results.isEmpty()) {
        log.info("empty results");
        break;
      }
      for (Entity entity : results) {
        Event event = createEventFromEntity(entity);
        Key key = entity.getKey();

        // todo async
        // already done with the keyslist and valueslist
        // Set<What> whats = fetchWhats(datastore, key);
        // event.setWhat(whats);
        //
        // todo async
        List<PhotoBlob> blobs = fetchBlobs(datastore, key);
        event.setBlobs(blobs);

        allEvents.add(event);
      }
      cursor = results.getCursor();
      if (cursor == null) {
        log.info("null cursor");
        break;
      }
    }
    adjustTimeZone(allEvents);
  }

  private Set<What> fetchWhats(DatastoreService datastore, Key key) {
    com.google.appengine.api.datastore.Query whatQuery = new com.google.appengine.api.datastore.Query("What", key);
    PreparedQuery whatPreparedQuery = datastore.prepare(whatQuery);
    // log.info("execute what query");
    QueryResultList<Entity> whatResults = whatPreparedQuery.asQueryResultList(FetchOptions.Builder.withDefaults());
    Set<What> whats = Sets.newHashSet();
    for (Entity whatEntity : whatResults) {
      whats.add(createWhatFromEntity(whatEntity));
    }
    return whats;
  }

  private List<PhotoBlob> fetchBlobs(DatastoreService datastore, Key key) {
    com.google.appengine.api.datastore.Query whatQuery = new com.google.appengine.api.datastore.Query("PhotoBlob", key);
    PreparedQuery whatPreparedQuery = datastore.prepare(whatQuery);
    // log.info("execute blob query");
    QueryResultList<Entity> whatResults = whatPreparedQuery.asQueryResultList(FetchOptions.Builder.withDefaults());
    List<PhotoBlob> whats = Lists.newArrayList();
    for (Entity whatEntity : whatResults) {
      whats.add(createPhotoBlobFromEntity(whatEntity));
    }
    return whats;
  }

  private What createWhatFromEntity(Entity whatEntity) {
    return new What((String) whatEntity.getProperty("name"), (String) whatEntity.getProperty("value"));
  }

  private PhotoBlob createPhotoBlobFromEntity(Entity entity) {
    final Object blobProperty = entity.getProperty("value");
    if (blobProperty instanceof Blob) {
      return new PhotoBlob((String) entity.getProperty("name"), ((Blob) blobProperty).getBytes());
    } else if (blobProperty instanceof byte[]) {
      return new PhotoBlob((String) entity.getProperty("name"), (byte[]) blobProperty);
    }
    return null;
  }

  private Event createEventFromEntity(Entity entity) {
    return EventEntityConverter.convertEntityToEvent(entity);
  }

  private void adjustTimeZone(Collection<Event> allEvents) {
    for (Event event : allEvents) {
      String tz = event.getTimeZone();
      event.setResponseTime(adjustTimeToTimezoneIfNecesssary(tz, event.getResponseTime()));
      event.setScheduledTime(adjustTimeToTimezoneIfNecesssary(tz, event.getScheduledTime()));
    }
  }

  public static Date adjustTimeToTimezoneIfNecesssary(String tz, Date responseTime) {
    if (responseTime == null) {
      return null;
    }
    DateTimeZone timezone = null;
    if (tz != null) {
      timezone = DateTimeZone.forID(tz);
    }

    if (timezone != null && responseTime.getTimezoneOffset() != timezone.getOffset(responseTime.getTime())) {
      responseTime = new DateTime(responseTime).withZone(timezone).toDate();
    }
    return responseTime;
  }

  private void addAllSharedEvents(List<com.google.sampling.experiential.server.Query> queryFilters,
                                  DateTimeZone clientTimeZone, Set<Event> allEvents, PersistenceManager pm) {
    EventJDOQuery sharedQ = createJDOQueryFrom(pm, queryFilters, clientTimeZone);
    sharedQ.addFilters("shared == true");
    Query queryShared = sharedQ.getQuery();
    List<Event> sharedEvents = (List<Event>) queryShared.executeWithArray(sharedQ.getParameters().toArray());
    allEvents.addAll(sharedEvents);
    adjustTimeZone(allEvents);
  }

  private boolean isAnAdministrator(List<Long> adminExperiments) {
    return adminExperiments != null && adminExperiments.size() > 0;
  }

  private boolean isDevMode() {
    return SystemProperty.environment.value() == SystemProperty.Environment.Value.Development;
  }

  private void sortList(ArrayList<Event> newArrayList) {
    Comparator<Event> dateComparator = new Comparator<Event>() {
      @Override
      public int compare(Event o1, Event o2) {
        Date when1 = o1.getWhen();
        Date when2 = o2.getWhen();
        if (when1 == null || when2 == null) {
          return 0;
        } else if (when1.after(when2)) {
          return -1;
        } else if (when2.after(when1)) {
          return 1;
        }
        return 0;
      }
    };
    Collections.sort(newArrayList, dateComparator);
  }

  /**
   * @param experimentIdList
   * @return
   */
  private List<String> getNames(List<Experiment> experimentsForAdmin) {
    List<String> ids = Lists.newArrayList();
    for (Experiment experiment : experimentsForAdmin) {
      ids.add("'" + experiment.getTitle() + "'");
    }
    return ids;

  }

  /**
   * @param q
   * @return
   */
  private boolean hasAnExperimentIdFilter(List<com.google.sampling.experiential.server.Query> queryFilters) {
    for (com.google.sampling.experiential.server.Query query : queryFilters) {
      if (query.getKey().equals("experimentId") || query.getKey().equals("experimentName")) {
        return true;
      }
    }
    return false;
  }

  private Long getExperimentIdFromFilter(List<com.google.sampling.experiential.server.Query> queryFilters) {
    for (com.google.sampling.experiential.server.Query query : queryFilters) {
      if (query.getKey().equals("experimentId")) {
        String value = query.getValue();
        if (value != null) {
          try {
            return Long.parseLong(value);
          } catch (NumberFormatException e) {
            return null;
          }
        }
      }
    }
    return null;
  }

  /**
   * @param adminExperiments
   * @return
   */
  private List<String> getIdsQuoted(List<Long> adminExperiments) {
    List<String> ids = Lists.newArrayList();
    for (Long long1 : adminExperiments) {
      ids.add("'" + long1 + "'");
    }
    return ids;
  }

  private List<String> getIds(List<Experiment> experimentsForAdmin) {
    List<String> ids = Lists.newArrayList();
    for (Experiment experiment : experimentsForAdmin) {
      ids.add(experiment.getId().toString());
    }
    return ids;
  }

  @SuppressWarnings("unchecked")
  private List<Long> getExperimentsForAdmin(String user) {
    return ExperimentAccessManager.getExistingExperimentIdsForAdmin(user, 0, null).getExperiments();
  }

  @SuppressWarnings("unchecked")
  private Experiment getExperimentById(Long experimentId, PersistenceManager pm) {
    if (experimentId == null) {
      return null;
    }
    return pm.getObjectById(Experiment.class, experimentId);
  }

  private EventJDOQuery createJDOQueryFrom(PersistenceManager pm,
                                           List<com.google.sampling.experiential.server.Query> queryFilters,
                                           DateTimeZone clientTimeZone) {
    Query newQuery = pm.newQuery(Event.class);
    JDOQueryBuilder queryBuilder = new JDOQueryBuilder(newQuery);
    queryBuilder.addFilters(queryFilters, clientTimeZone);
    return queryBuilder.getQuery();
  }

  public static void sortEvents(List<Event> greetings) {
    Comparator<Event> dateComparator = new Comparator<Event>() {
      @Override
      public int compare(Event o1, Event o2) {
        Date when1 = o1.getWhen();
        Date when2 = o2.getWhen();
        if (when1 == null || when2 == null) {
          return 0;
        } else if (when1.after(when2)) {
          return -1;
        } else if (when2.after(when1)) {
          return 1;
        }
        return 0;
      }
    };
    Collections.sort(greetings, dateComparator);
  }

  public static List<EventDAO> convertEventsToDAOs(List<Event> result) {
    List<EventDAO> eventDAOs = Lists.newArrayList();

    for (Event event : result) {
      eventDAOs.add(new EventDAO(event.getWho(), new DateTime(event.getWhen()), event.getExperimentName(), event.getLat(),
                                 event.getLon(), event.getAppId(), event.getPacoVersion(),
                                 convertToWhatDAOs(event.getWhat()), event.isShared(), event.getResponseTimeWithTimeZone(event.getTimeZone()),
                                 event.getScheduledTimeWithTimeZone(event.getTimeZone()), toBase64StringArray(event.getBlobs()),
                                 Long.parseLong(event.getExperimentId()), event.getExperimentVersion(),
                                 event.getTimeZone(), event.getExperimentGroupName(), event.getActionTriggerId(),
                                 event.getActionTriggerSpecId(), event.getActionId()));
    }
    return eventDAOs;
  }

  public static List<WhatDAO> convertToWhatDAOs(Set<What> what) {
    List<WhatDAO> daos = Lists.newArrayList();
    for (What currentWhat : what) {
      daos.add(new WhatDAO(currentWhat.getName(), currentWhat.getValue()));
    }
    return daos;
  }

  /**
   * @param blobs
   * @return
   */
  public static String[] toBase64StringArray(List<PhotoBlob> blobs) {
    if (blobs == null) {
      return new String[0];
    }
    String[] results = new String[blobs.size()];
    for (int i = 0; i < blobs.size(); i++) {
      results[i] = new String(Base64.encodeBase64(blobs.get(i).getValue()));
    }
    return results;
  }

  public EventQueryResultPair getEventsFromLowLevelDS(List<com.google.sampling.experiential.server.Query> query,
                                                      String requestorEmail, DateTimeZone timeZoneForClient) {
    log.info("Getting events from low level datastore");
    Set<Event> allEvents = Sets.newHashSet();
    EventDSQuery eventDSQuery = createDSQueryFrom(query, timeZoneForClient);

    long t11 = System.currentTimeMillis();

    List<Long> adminExperiments = getExperimentsForAdmin(requestorEmail);
//    log.info("Loggedin user's administered experiments: " + requestorEmail + " has ids: "
//             + getIdsQuoted(adminExperiments));

    if (isDevMode() || isUserQueryingTheirOwnData(requestorEmail, eventDSQuery)) {
      log.info("dev mode or user querying self data");
      executeQuery(allEvents, eventDSQuery);
    } else if (isAdminOfAllExperimentsInQuery(query, adminExperiments)) {
      log.info("isAnAdmin of experiment(s)");
      // if (!hasAnExperimentIdFilter(query)) {
      // log.info("No experimentfilter. Loading events for all admined
      // experiments");
      // Filter idFilter = new FilterPredicate("experimentId",
      // FilterOperator.IN, adminExperiments);
      // eventDSQuery.addFilter(idFilter);
      // executeQuery(allEvents, eventDSQuery);
      // } else if (hasAnExperimentIdFilter(query) &&
      // !isAdminOfAllExperimentsInQuery(query, adminExperiments) &&
      // !eventDSQuery.hasAWho()) {
      // addWhoQueryFilterForLoggedInuser(requestorEmail, eventDSQuery);
      // executeQuery(allEvents, eventDSQuery);
      // } else {
      executeQuery(allEvents, eventDSQuery);
      // }
    } else if (!eventDSQuery.hasAWho()) {
      log.info("No experiment specified, So querying for their own data");
      addWhoQueryFilterForLoggedInuser(requestorEmail, eventDSQuery);
      executeQuery(allEvents, eventDSQuery);
    } else {
      return new EventQueryResultPair(Collections.EMPTY_LIST, null);
    }

    long t12 = System.currentTimeMillis();
    log.info("get execute time: " + (t12 - t11));

    ArrayList<Event> newArrayList = Lists.newArrayList(allEvents);
    sortList(newArrayList);
    return new EventQueryResultPair(newArrayList, null);
  }

  public static boolean isExperimentAdministrator(String loggedInUserEmail, Experiment experiment) {
    return experiment.getCreator().getEmail().toLowerCase().equals(loggedInUserEmail)
           || experiment.getAdmins().contains(loggedInUserEmail);
  }

  private EventDSQuery createDSQueryFrom(List<com.google.sampling.experiential.server.Query> query,
                                         DateTimeZone timeZoneForClient) {
    com.google.appengine.api.datastore.Query newQuery = new com.google.appengine.api.datastore.Query(Event.class.getName());
    DSQueryBuilder queryBuilder = new DSQueryBuilder(newQuery);
    queryBuilder.addFilters(query, timeZoneForClient);
    return queryBuilder.getQuery();

  }

  public EventQueryResultPair getEventsInBatches(List<com.google.sampling.experiential.server.Query> queryFilters,
                                                 String loggedInuser, DateTimeZone clientTimeZone, int limit,
                                                 String cursor) {
    if (limit == 0) {
      limit = DEFAULT_FETCH_LIMIT;
    }
    Set<Event> allEvents = Sets.newHashSet();
    PersistenceManager pm = PMF.get().getPersistenceManager();
    EventJDOQuery eventJDOQuery = createJDOQueryFrom(pm, queryFilters, clientTimeZone);

    long t11 = System.currentTimeMillis();

    List<Long> adminExperiments = getExperimentsForAdmin(loggedInuser);
    log.info("Loggedin user's administered experiments: " + loggedInuser + " has ids: "
             + getIdsQuoted(adminExperiments));

    String nextCursor = null;
    if (isDevMode() || isUserQueryingTheirOwnData(loggedInuser, eventJDOQuery)) {
      log.info("dev mode or user querying self");
      nextCursor = executeQueryInBatches(allEvents, eventJDOQuery, limit, cursor);
    } else if (isAnAdministrator(adminExperiments)) {
      log.info("isAnAdmin");
      if (!hasAnExperimentIdFilter(queryFilters)) {
        log.info("No experimentfilter");
        eventJDOQuery.addFilters(":p.contains(experimentId)");
        eventJDOQuery.addParameterObjects("(" + getIdsQuoted(adminExperiments) + ")");
        nextCursor = executeQueryInBatches(allEvents, eventJDOQuery, limit, cursor);
      } else if (hasAnExperimentIdFilter(queryFilters)
                 && !isAdminOfAllExperimentsInQuery(queryFilters, adminExperiments)) {
        if (!eventJDOQuery.hasAWho()) {
          addWhoQueryForLoggedInuser(loggedInuser, eventJDOQuery);
          nextCursor = executeQueryInBatches(allEvents, eventJDOQuery, limit, cursor);
        } else if (!eventJDOQuery.who().equals(loggedInuser)) {
          addAllSharedEvents(queryFilters, clientTimeZone, allEvents, pm);
        }
      } else {
        nextCursor = executeQueryInBatches(allEvents, eventJDOQuery, limit, cursor);
      }

    } else {
      addWhoQueryForLoggedInuser(loggedInuser, eventJDOQuery);
      nextCursor = executeQueryInBatches(allEvents, eventJDOQuery, limit, cursor);
      // also get all shared data that matches the query
      addAllSharedEvents(queryFilters, clientTimeZone, allEvents, pm);
    }

    long t12 = System.currentTimeMillis();
    log.info("get execute time: " + (t12 - t11));
    log.info("retrieved " + allEvents.size() + " events");

    ArrayList<Event> newArrayList = Lists.newArrayList(allEvents);
    sortList(newArrayList);
    return new EventQueryResultPair(newArrayList, nextCursor);
  }

  private String executeQueryInBatches(Set<Event> allEvents, EventJDOQuery eventJDOQuery, int limit,
                                       String websafeCursor) {
    Query q = eventJDOQuery.getQuery();
    PersistenceManager persistenceManager = q.getPersistenceManager();

    Cursor cursor = null;
    if (!Strings.isNullOrEmpty(websafeCursor) && !websafeCursor.equals("null")) {
      cursor = Cursor.fromWebSafeString(websafeCursor);
    }
    if (cursor != null) {
      Map<String, Object> extensionMap = new HashMap<String, Object>();
      extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
      q.setExtensions(extensionMap);
      // q.getFetchPlan().addGroup("PhotoBlob").addGroup("keysList").addGroup("valuesList");
      // q.getFetchPlan().setFetchSize(limit);

    }
    q.setRange(0, limit);
    List<Event> currentResults = (List<Event>) q.executeWithArray(eventJDOQuery.getParameters().toArray());
    // log.info("Got back " + currentResults.size() + " results");
    if (currentResults != null && !currentResults.isEmpty()) {
      // Load each object so that is fetched when we detach.
      for (Event event : currentResults) {
        event.getBlobs();
        event.getWhat();

        // detach to free up resources in the persistence manager across the
        // huge result sets

        // allEvents.add(persistenceManager.detachCopy(event));
      }

      Collection<Event> detachedResults = q.getPersistenceManager().detachCopyAll(currentResults);
      allEvents.addAll(detachedResults);

      // log.info("Accumulated result count: " + allEvents.size());
      Cursor newCursor = JDOCursorHelper.getCursor(currentResults);
      if (newCursor == null || (cursor != null && newCursor.toWebSafeString().equals(websafeCursor))) {
        cursor = null;
      } else {
        cursor = newCursor;
      }
    }

    // }
    log.info("done with results gathering");
    adjustTimeZone(allEvents);
    log.info("done adjusting timezone");
    return cursor != null ? cursor.toWebSafeString() : null;
  }

  public EventQueryResultPair getEventsInBatchesOneBatch(List<com.google.sampling.experiential.server.Query> queryFilters,
                                                         String loggedInuser, DateTimeZone clientTimeZone, int limit,
                                                         String cursor) {

    return new EventQueryResultPair(getEvents(queryFilters, loggedInuser, clientTimeZone, 0, 20000), null);
  }
}

redpajama_set_name: RedPajamaGithub


We can help you feel more confident about having a positive birth experience. Childbirth classes help you build trust in your body's ability to give birth. You'll have the opportunity to discuss any concerns about labor and birth with the instructor and other expectant couples. Your partner will learn how to support you on the big day – and attending together will create a special bond.
Am I in labor? What will it really be like?
Our classes offer interactive learning, hands on practice with techniques and realistic videos.
* This class is $90 and is directly billed to your insurance. Your insurance will not be billed until after you have completed this class series. You are responsible for any balance not covered by insurance. If you have questions regarding insurance coverage, please contact your insurance company directly. They may ask for a diagnostic or procedure code: Childbirth Class (S9442) or (V 221).
Questions? Email ExpectantParentClasses@metrogr.org or call (616)-252-7226.


text:
HomeVaccine Deaths39-Year-Old Model Dies Days After COVID Vaccine
39-Year-Old Model Dies Days After COVID Vaccine
By Megan Redshaw & Children's Health Defence | 25 May 2021
British fashion model Stephanie Dubois suffered a blood clot days after vaccination with AstraZeneca's COVID vaccine
British Model Stephanie Dubois
British fashion model Stephanie Dubois died from a blood clot days after receiving the AstraZeneca COVID vaccine in Cyprus, a health official said Monday.
Dubois, 39, suffered a "serious thrombotic episode" after receiving her first dose of the vaccine on May 6, Newsweek reported. She had no underlying health conditions according to health officials at the hospital in Nicosia, where she was hospitalized May 14, after experiencing breathing issues.
The fashion model later suffered a brain haemorrhage and was in a coma before she passed away May 21.
Dubois received her first dose on May 6 and posted on Facebook: "And now I feel horrendous … pizza and bed for me."
In a Facebook post on the morning of May 14, Dubois wrote: "Woke up feeling fine and then within an hour I had full body shakes, all my joints seized and I was struggling to breathe and was cold to the bone with a persistent headache and dizziness."
By May 19, Dubois was reported to have gone into a coma and "was not expected to come out of it," according to a friend, Andrew Powers, The Times reported.
Three other thrombosis incidents were reported in Cyprus following vaccinations, two of whom also received the AstraZeneca vaccine. The cases were part of 40 serious side effects reported that may be linked to COVID vaccination, which were referred to the EMA.
The EMA did not recommend restricting use of the vaccine based on age, gender or other risk factors, but did say cases of blood clotting after vaccination "should be" listed as a possible side effect, according to a statement issued by the agency's safety committee.
1) https://www.newsweek.com/uk-fashion-model-dies-after-astrazeneca-covid-vaccine-blood-clot-1594445
2) https://www.thesun.co.uk/news/15060499/who-stephanie-dubois-how-die/
AstraZeneca Covid-19 Vaccination Covid-19 Vaccines Health Stephanie Dubois Vaccine Deaths

redpajama_set_name: RedPajamaCommonCrawl


text:
Edwards new game day audio
For all of last season and the entire offseason Trent Edwards has had Alex Van Pelt's voice in his helmet relaying the play call for each and every snap on the field. That changed this past Sunday when Van Pelt assumed offensive coordinator duties.
With Van Pelt taking a seat upstairs in the coaches' booth on game days the person now entrusted with relaying the plays from Van Pelt to Edwards via the radio transmitter in his helmet with be backup quarterback Ryan Fitzpatrick.
"It'll be a similar voice that we hear in our room all week and we talk the same language and Ryan will pass it on to Trent," said Van Pelt. "That will allow me to go upstairs and remove myself from the sideline and focus on the field."
Tabbing Fitzpatrick as the new link in the play call chain makes a lot of sense for the reasons mentioned above, but also because he's done it before.
"When I was in St. Louis that's how we ran it my first year there with the backup quarterback calling it into the quarterback on the field," said Fitzpatrick. "So I've had some experience with it. The good thing about this offense is there's not a whole lot of verbiage so there is not going to be a bunch of long tongue-twisting plays."
Fitzpatrick is very familiar with some of the problems that can arise on game day, like sporadic failure of the radio transmitter or ambient crowd noise which will require him to over pronounce the words of the play call.
"You have to annunciate," he said. "Annunciation is key and my mom is a grade school teacher so fortunately she taught me how to speak clearly. It's tough at times just because of how loud the crowd is. Everybody has issues in terms of hearing the play, but we have signals and stuff too if necessary."
Edwards and Fitzpatrick have already gone over the signal Edwards will give him if he's having trouble getting the play via the radio.
"It happens all the time," said Fitzpatrick. "It happened in the preseason a couple of times. Sometimes that radio signal just drops and there are times where you have to work around it. It happens enough in the preseason and at camp that we have it all figured out in terms of needing to look to the sideline and letting me know I need to give him hand signals."
Through two practices with Fitzpatrick relaying the plays to Edwards, Buffalo's starting quarterback feels good about the new voice in his helmet.
"Very comfortable," said Edwards. "It's a little bit different hearing his voice obviously, but I'm comfortable. I'm with him probably more than anyone else in this organization and he's my right hand man. I feel he sees the game the same way I do so it's nice to have a guy in your helmet saying those things to you."
"I know what to say to him and the things he needs to be reminded of and he'll have a good open line of communication with me," said Fitzpatrick.
In preparation for the opener the quarterbacks plan to review things together with respect to the play calls.
"We'll go over each and every play that we have in the game plan and if there is stuff that he wants to be reminded of or alerted to in addition to the play then that's stuff I'll throw in too," Fitzpatrick said. "But I'll keep it to a minimum. If he wants something else I'll add it."
Most of the time Fitzpatrick will just be giving Edwards the play. In between offensive possessions will be the time Fitzpatrick gives more detailed input.
"The conversations that Gibran and I have on the sideline with Trent will obviously be in between series," said Fitzpatrick. "Alex is not going to be down there so there's a lot of information that will have to be communicated from me to Trent on the sideline in terms of what we're going to do on the next series. So that's going to be different, but at the same time we have enough coaches down there to tell Trent whatever else he needs to know. And it's nice for me to kind of relay stuff to him."
Edwards also has the ability to talk to Van Pelt on the sideline phone that provides a direct connection to the coach's booth. But Fitzpatrick and Edwards have already developed a healthy give and take through the course of the preseason when the Bills defense is on the field.
"We'll talk about some specific plays or even some specific looks we're getting and how we want to attack it," said Fitzpatrick. "Even when Alex was down there that stuff was happening where we were talking quarterback to quarterback. He's asking my opinion or Gibran's opinion of what we're seeing out there and different ways to attack it. That's the part that I really enjoy, being able to help him out and kind of dissect what they're doing and put us in a better position to get down the field."
For a backup quarterback having an extra game day duty is a welcome assignment. It makes Fitzpatrick feel more a part of the offensive effort on the field, and more involved in making Edwards' day a success.
"Yeah I love it," Fitzpatrick said. "Any added responsibility for me is awesome. I'm definitely looking forward to it."


text:
NewsHealth
Gillibrand: Vets need more access to mental health services
Elizabeth OuYang is an advocate for Danny Chen, who died by suicide in 2011. Peggy Ng, right, taught Chen in Chinatown. Credit: Newsday / Michael O'Keefe
By Michael O'Keeffe michael.okeeffe@newsday.com Updated December 8, 2019 6:40 PM
Calling military suicide rates unacceptable, Sen. Kirsten Gillibrand on Sunday called on the U.S. Department of Defense and the U.S. Department of Veterans Affairs to make it easier for active-duty members and veterans to access mental health services.
During a news conference at her Manhattan offices, Gillibrand (D-N.Y.) also called on the Defense and Veterans Affairs departments to provide greater assistance to vets as they transition from military service to civilian life.
"This is a national crisis and we are simply not doing enough to stop it," said Gillibrand, who put her concerns about veterans and mental health in a letter she sent to Veterans Affairs Secretary Robert Wilkie and Defense Secretary Mark Esper.
More than 45,000 veterans and active-duty service members have died by suicide in the past six years, Gillibrand said. The numbers spiked to a five-year high in 2018, she said.
"The numbers are going in the wrong direction," Lindsay Rodman of the Iraq and Afghanistan Veterans of America said at Gillibrand's news conference. "We need to be doing more to address the needs of veterans in transition."
Gillibrand said she will ask the military to review rules requiring service members to report visits to mental health professionals to their commanding officers. She said the rules are unnecessarily vague and many active-duty sailors and soldiers don't seek mental health help because they believe it will hinder their careers.
Gillibrand also called on the VA and the Defense Department to build a comprehensive transition program — including internships, reintegration programs and on-the-job training — that helps veterans make the leap from active-duty service to civilian life.
Gillibrand said veterans who have left the service in the past year are 2.5 times more likely to die by suicide than their active-duty counterparts.
Elizabeth R. OuYang, former president of the New York chapter of the Organization of Chinese Americans and an advocate for Pvt. Danny Chen, said it was important for the military to eliminate the stigma of mental illness She said Chen, a New York resident who killed himself in Afghanistan in 2011 after enduring weeks of racist hazing and bullying from colleagues, may still be alive if he had somebody to talk to.
"Our soldiers who risk their lives for all Americans deserve access to mental health care without fear of reprisal or stigma," OuYang said.
By Michael O'Keeffe michael.okeeffe@newsday.com
Michael O'Keeffe covers Suffolk County police and other Long Island law-enforcement agencies. He is an award-winning journalist and the co-author of two books, "The Card" and "American Icon."
Weather: Sunday to bring sun after snowy Saturday
Janison: Campaign convicts say they're victims
1:00 Winter storm brings heavy snow, ice to Midwest
Britain plans Brexit celebrations but warns businesses may suffer
Judge blocks NY ban on flavored vaping products
1:21 Nassau county executive names NuHealth chairman
1:23 + FOR OUR SUBSCRIBERS LI hospital recording surgeries in 'black box'
Sanders, Warren want Medicare for All. Hospital execs say it'd be devastating.
What every 25-year-old must know about insurance
1:15 Long Island babies had rare illnesses due to tick bites


text:
NFL Owners And Commissioner Have Agreed To Do This About Protests
NFL players have continued to protest the National Anthem despite the immense backlash.
Every team has had some sort of response to Trump's comments about firing players who disrespect the flag either by kneeling, locking arms, or staying in the locker room.
But it's clear that the NFL owners and Commissioner Roger Goodell have had enough and are planning to take action.
Ratings are down in the NFL and there is no doubt it's because of players kneeling during the anthem.
It started with former quarterback Colin Kaepernick, and now the bottom line for the NFL and its owners are starting to see—and feel—the impact from it.
So Roger Goodell issued a statement about the continuing protests.
"I am very proud of our players and owners who have done the hard work over the past year to listen, understand and attempt to address the underlying issues within their community."
"We also care deeply about our players and respect their opinions and concerns about critical social issues," he wrote. "The controversy over the anthem is a barrier to having honest conversations and making real progress on the underlying issues. We need to move past this controversy, and we want to do that together with our players."
Dallas Cowboys owner Jerry Jones sung a very different tune, however, saying from this upcoming week forward, if any of his players should kneel during the National Anthem, they won't play.
And now it seems other owners are about to board his decision and finally make a rule change.
Business Insider reports:
"As the NFL continues to be embroiled in controversy over players protesting during the national anthem, team owners are reportedly considering making a change.
According to Dow Jones (via CNBC), NFL owners are considering the addition of a new rule that would require players stand for the national anthem.
The report cites an anonymous league spokesperson. Such a rule would be controversial, though not unlike other sports.
The NBA, for instance, has a rule that requires players to stand for the anthem. NBA commissioner Adam Silver recently said the league expects players to follow the rule this season.
While the NFL would be within its rights to require players to stand, surely some people (not to mention players) would not like the league trying to silence something many would consider a civil liberty in an open forum, even if technically the NFL is a private company.
Critics of those who oppose the protests often argue the NFL has already blurred the lines of a private company by using the national anthem at all and having it so tightly linked to honoring the military.
If a tradition not related to football (the anthem) is played, why do players have to honor it?
The Dow Jones report comes after Dallas Cowboys owner Jerry Jones said on Sunday that any Cowboys player that is disrespectful to the flag "will not play."
When Jones was asked about his comments on Monday, he cited an obscure league manual that said players "should" stand for the anthem. As Deadspin noted, the language in the manual changed slightly from a 2014 version, with the newer version threatening different disciplinary action.
On Tuesday, league spokesman Joe Lockhart told reporters that the change was made in 2015, according to USA Today's Nancy Armour.
He also noted the difference between the manual saying players "should" stand vs. "must."
Make no mistake, the owners want these protests to end and they will implement rule changes to stop the rapid decline of their ratings.
So expect some major changes soon.
Previous ArticleYou Won't Believe What Mike Ditka Told Anthem Protesters To Do
Next ArticleSuperstar Rapper Blasts Trump And Is Not Going To Like The Outcome


Welcome to the blog tour for War of Storms by Erica Cameron! This third book in the Ryogan Chronicles sounds like it is going to be an amazing finale. Keep reading to learn more about the books and enter to win the giveaway to win a $15 Amazon Gift Card!
The immortal mages have risen, and they're out for blood.
Khya arrived at the Ryogan coast too late to stop the invasion. Now, cities are falling before the unrelenting march of an enemy army, and Khya's squad is desperately trying to stay ahead of them. Warning the Ryogans, though, means leaving her brother imprisoned even longer. Time is running out for everyone.
how can her squad of ten stand against an army of ten thousand?
"I also saw Sanii and Yorri moments after their bond." His quiet words take a few seconds to land. When they do, they hit like a boulder.
I'd forgotten that. How had I forgotten? Tessen was the one who told me about the bond, and when he did, he admitted that he'd known since the day it happened.
Closing my eyes, I turn away, not because I don't want to see him, but because I don't want him to see me. Everything he's saying is true, and yet it doesn't ease the fear knotting my stomach when I think about bonding myself.
I've talked about it before, but only in offhand comments as nebulous as heat waves. I've thought about it, but only the good parts—being able to hold on to someone I loved even beyond death. In a daydream, the pain that death brought never came; I didn't have to consider how easily a sumai bond could tear a soul apart.
Silence. My own breathing is shockingly harsh in the stillness. When did I start sucking in air like I was sprinting?
Why isn't Tessen saying anything?
I have the first book . I need to get started as there are more books now. The covers are gorgeous!
Helena @The Life of a Booknerd Addict recently posted…Our October wrap-up, from The Life of a Booknerd Addict!
I have the first book of this series in my kindle for a very long time but I haven't gotten around to it yet.


text:
byjimgeorge
STELLLLLLA!! (The Backstory of My Stella Stevens Interview Appearing in Cinema Retro Issue #42)
I probably first became aware of Stella Stevens in Playboy during my adolescence. In my circle of friends at the time was a fat boy I'll call Larry. Although he was a classmate, because of his size and girth, Larry appeared older than the rest of us. I can't recall if we elected him or if he boasted that he could do it, but just the same, he was put to the test and moseyed into his neighborhood corner store to buy a copy of Playboy using coins we'd all chipped in. While we anxiously waited outside, like some wheel men in a bank robbery, Larry emerged with a grin and a paper bag that signaled success. It worked! He got the goods!
This was our routine when a new issue hit the stands, and Larry always came through. Returning home with all of us in tow, and steering clear of his mother, our portly pal would smuggle the magazine, tucked under his shirt, into the house and promptly upstairs to his room. There in his lair, we would excitedly crowd around as Larry riffled through the pages—past the liquor ads, Jean Shepherd stories and Gahan Wilson cartoons–to the "Sex in the Cinema" section or the layouts that featured famous actresses au naturel. Then, with Larry authoritatively manning a razor blade, the glorious photos would be excised and divvied up amongst us. I nabbed the Stella Stevens ones. Which I still have.
Fast-forward to 1993. Having watched most of her films over the years and having seen or read interviews with her, I thought she'd be interesting and fun to talk to, so I queried the editor of Femme Fatales magazine to see if the idea of a Stella Stevens interview appealed to him. He liked my credits as a freelancer and immediately gave me the go-ahead. After putting in my request to Stevens' publicist, I was pleasantly surprised to receive a phone call from Stella herself to personally schedule the interview. She was open, honest, earthy, quotable and as enjoyable as I'd imagined, and I ended up doing the interview right then and there, winging it as I hadn't prepared any notes. She graciously agreed to talk again and address any additional or follow-up questions I might have. Soon afterward, she sent me a large envelope containing her latest 8×10 pin-up photos and a hand-written letter.
Unfortunately, the editor would never give me a straight answer as to how much I would be paid for the piece if accepted. I've dealt with many editors over the years, and they never mince words over payment (or, in some cases, non-payment), so that was a red flag. Byliner beware. When, after being asked for the umpteenth time, Mr. Vague finally gave me a figure, he quickly added, "But don't hold me to that." By that point, my patience had reached its limit, and I never finished or submitted the article. Curiously enough, he never asked for it either, and so I considered it a closed issue–in both senses of the word.
Last year, when I read the sad news that Stevens was in a care facility suffering from Alzheimer's Disease, not only did it literally hit home, as I lived through the nightmarish disease as a caregiver for my afflicted father, but it also triggered a fond memory of what a dream subject Stevens was when I conducted that never-published phone interview with her all those years ago. Rummaging through my archives, I unearthed the scribbled transcript of that '93 conversation and crafted it into the Q&A that has just been published in Cinema Retro (Issue #42).
Among the topics covered are some of Stevens' favorite roles, working with such directors as Sam Peckinpah and Jerry Lewis, the plight of aging actresses, her exit from and re-entry into Hollywood, her move into directing, and the charity work that gave her a sense of fulfillment.
It's a good one because Stella was a good one.
http://www.cinemaretro.com/index.php?/categories/15-Current-Issue
Author Jim GeorgePosted on October 20, 2018 October 21, 2018 Categories cinema, Cinema Retro, comedy, film, glamour, Glamour Photos, Hollywood, humor, interview, Jerry Lewis, magazine, movie, pin-up, Sam Peckinpah, sex symbol, Stella Stevens, UncategorizedLeave a comment on STELLLLLLA!! (The Backstory of My Stella Stevens Interview Appearing in Cinema Retro Issue #42)
THE SECOND COMING OF JOHN & YOKO
(This, with a few edits, is a newspaper piece I wrote on the release of John and Yoko's Double Fantasy. It was published on Nov. 30, 1980, two weeks after the record's release and eight days before Lennon's murder. Despite all the hoopla, the much-anticipated album did not shoot straight to the top of the charts until after the tragedy (which gives the phrase "Number One with a Bullet" a chilling irony) and some critics were not kind. My editor at the time told me that following Lennon's death, some of the bad reviews were pulled before publication and rewritten .)
Whether he was reshaping the world as a Beatle, giving peace a chance, exposing his jagged psyche, traipsing left-ward with the likes of Jerry Rubin and Abbie Hoffman, about-facing and shunning the mixed-up media or settling down to family life in any one of his home-sweet-homes, John Lennon and his art have been one.
Mercurial, eccentric, quick-witted and brilliantly talented, Lennon has always plunged heart-first into anything he's created. He's given pieces of himself on the printed page (his two books, In His Own Write and A Spaniard in the Works) and on celluloid (the avant-garde films he shot with Yoko Ono). Vinyl-ly, with his records, he's invariably left blood on the tracks (as Mr. Zimmerman would say) with his confessional offerings, beginning with such compositions as "Help" and "I'm a Loser."
Though the mythology of The Beatles has in some ways proven to be a weighty albatross for him and the rest of the Fab Foursome, it was in the context of the group that he first quaked the earth. Lennon was the controversial one, the dream-weaver and the wave-maker. The intellectually-inclined slice of The Beatles' audience gravitated, predictably, toward the brainy, zany Lennon.
No, he wasn't The Beatles. No one of them was. But as Pete Hamill wrote, "In some way, John had been the engine of the group, the artistic armature driving the machine beyond its own limits, restless, easily bored, in love with speed the way Picasso was in love with speed, and possessed of a hoodlum's fanatic heart."
The post-Beatles Lennon was once likened to Sisyphus; indeed, ever since Yoko Ono supplanted Paul McCartney as his partner-in-rhyme, Lennon has been a twentieth-century Sisyphus, pushing his rock (and roll) uphill, with snide snipers taking pot shots at him—and, especially, his paramour—at every opportunity.
In their early days together, this ripening pair weathered a lot of bruises and eventually parted ways and means, only to be reunited eighteen months later because, as Lennon put it, "the separation didn't work out."
And then in '75, with a pocketful of fresh songs and on the verge of booking studio time, the Lennons had a baby boy and John unplugged his guitar and stopped dead in his soundtracks.
"I became an artist because I cherished freedom—I couldn't fit into a classroom or office," he told Newsweek recently. "Freedom was the plus for all the minuses of being an oddball! But suddenly I was obliged to a record company, obliged to the media, obliged to the public. I wasn't free at all!"
So he clammed up, offed the record, and became a hearth-and-homebody focused on the raising of his son. The man who back in '72 wrote the pro-woman anthem "Woman is the Nigger of the World" (which, sadly, was squashed dead by misguided objections to the title—usually by white males, as Lennon pointed out) went one better and swapped roles with Yoko. She became the breadwinner, he the bread baker. The Lennons invested in dairy cows and real estate, and it was moos and moola for five years.
Now 40, he has rolled away the stone and reappeared with a hot new single, "Starting Over," and a grand-new album, Double Fantasy. Ah, but to set the record straight, this is not just a John Lennon album. It's the Second Coming of John and Yoko. And it's a superlative double-headed triumph.
Like it or not, it took guts on Lennon's part to divvy up the 14-numbered LP with his wife. After all, their last collaboration, in '72, was Sometime in New York City, generally considered to be the rough nadir of Lennon's recorded output (not counting the trio of avant-garde albums, Two Virgins, Life With the Lions and Wedding Album). Consequently, starting over together, for better or for worse, as the wedding vowels go, could be sales-suicide. For the record, while doing well, the album currently is not topping the charts.
"It's like a play," Lennon said of Double Fantasy. "We wrote the play and we're acting in it. It's John and Yoko—you could take it or leave it…otherwise, it's cows and cheese! Being with Yoko makes me whole. I don't want to sing if she's not there."
Therefore, she is there with seven originals. One of them, "Kiss Kiss Kiss," concludes with orgasmic panting, for which Yoko will, no doubt, get slam-banged once again. More exhibitionism, they will say. But no one crucified Donna Summer for doing it in "Love to Love You Baby." Different strokes? Quite possibly.
Yoko clearly doesn't have the pipes of a diva, but some credit is due. In 1970, Lennon told Rolling Stone, "She makes music like you've never heard on earth…It's fantastic. It's like 20 years ahead of its time." Or maybe 10. Listen to The B-52s. Yoko was on the New Wavelength before it had a name.
But before anyone screams, "Yoko oh no!" about her inclusion on the new album, be advised that the oral hijinks are minimal, and her seven contributions are her finest to date. They include the lovely, classical-tinged "Beautiful Boys," the edgy "I'm Moving On" and the ska-flavored "Every Man Has a Woman Who Loves Him."
John, on the other half, has never sounded more contented overall. As contented as those quarter-of-a-million-bucks-apiece Holstein cows the couple owns. In "Watching the Wheels," he speaks of his at-long-last peace:
I'm just sitting here watching the wheels go round and round
I really love to watch them roll
No longer riding on the merry-go-round
I just had to let it go
"I'm not interested in other people's work—only so much as it affects me," he said to Newsweek. "I have the great honor of never having been to Studio 54 and I've never been to any rock clubs. It's like asking Picasso, has he been to the museum lately?"
The theme of Double Fantasy, which is a Jack Douglas and Lennons co-production, is simply John loves Yoko loves John. Not forgetting son Sean for whom John's lovely lullaby "Beautiful Boy" was written. Lennon's dreamy "Woman" is as beautiful and sensitive as anything in his catalog:
Woman I know you understand
The little child inside the man
Please remember my life is in your hands
In his funky "Cleanup Time," a verse of which reminds one of his nursery rhyme-like "Cry Baby Cry" from The Beatles' White Album, Lennon sings of his and Yoko's juxtapositions:
The queen is in the counting house
Counting out the money
The king is in the kitchen
Making bread and honey
Yet, despite the album's apparent bliss-blitz, the pair's life together—"so precious together" (a little too precious for some people, it seems)—is not all Peaches and Herb. The underbellyaches of love are also exposed. Their fears, insecurities and tensions bubble to the surface in such cuts as Yoko's "I'm Moving On":
But now you're giving me your window smile
I'm moving on, moving on, it's getting phony
In John's "I'm Losing You," he sings:
I know I hurt you then
But hell that was way back when
Do you still have to carry that cross?
But the riled side of life is not dwelled upon, and Yoko concludes the album with an expression of hope in the gospel-tinged"Hard Times Are Over":
It's been very hard
But it's getting easier now
Hard times are over
Over for a while
It is a fitting and optimistic finale to John and Yoko's new peace of the rock.
Author Jim GeorgePosted on December 9, 2017 December 9, 2017 Categories Album Classic, Double Fantasy, john lennon, Legend, Review, Rock & Roll, Uncategorized, Yoko Ono2 Comments on THE SECOND COMING OF JOHN & YOKO
THE CARDSHARKS
(This poem is from my book Jim Shorts.)
Raoul, Sylvie and her half-a-brother Yish
Were door-to-door cardsharks in search of sum fish.
"Let us in or we'll torcher!" they all chunted with gleem,
All afiery of eye, all connivy of scheme.
"We mean no borderly harm," they taled a nu family.
"Off course if you 'fuse, we're three pyros, you see!
"So ply us a few rounds of blackjag or poka,
"We'll luff and we'll merrymake and we'll java some mocha.
"Is it too mush to ask? 'Tis in yearnest we're franker.
"Let's let bygoons beat bygoons, don't be sore as a canker!"
The main of the house shivered his timbres quite frightly
As the trio of gusts burched and belped impolitely.
"I demandate de deal!" Raoul Tabasco then sat.
"If it pleaseth the coat, just shaketh you hat.
"Jacks be nubile, jacks be wild,
"Jacks jumbo o'er thy first-bored sonchild,
"Doozies be wild, johnnies be good,
"Redqueens be monty, clift palettes be wood."
So they plied and they plied by yon slivery moon.
The hosts heebie-jeebied and staid pat as a boone.
The cardsharks won potfuls as they mad their own luck.
Their cop ranneth over with plundy good buck.
"It's been quite a pledger," Raoul then boweled graciously.
"You're a batch of good spots, believest ye me.
"Maybe sobtime we'll all do it once more for the gypper,
"Only nicks time my Sylvie will bake a yum kipper."
So into the horizone they twilighted three–
Raoul, spousewife Sylvie and her semi-sibly.
Dem's de bones, dem's de breaks, de cookies, de crunch.
Some gets de judy, some gets de punch.
© 2016 Jim George
For more information about Jim Shorts, please read:
https://byjimgeorge.wordpress.com/2016/09/30/first-blog-post/
https://byjimgeorge.wordpress.com/2016/10/08/jim-by-george-a-self-interview-on-jim-shorts/
(Unauthorized use and/or duplication of this material without express and written permission from this blog's author and/or owner is strictly prohibited. Excerpts and links may be used, provided that full and clear credit is given to Jim George and byjimgeorge with appropriate and specific direction to the original content.)
Author Jim GeorgePosted on September 9, 2017 Categories fiction, humor, humor, fiction, wordplay, nonsense, poetry, surrealism, Uncategorized, wordplayLeave a comment on THE CARDSHARKS
JERRY LEWIS: THE FILM BUFFOON RETURNS
(In 1981 I wrote a newspaper profile on Jerry Lewis and subsequently sent him a copy. Not long afterward, I received a personal letter of thanks from him. This is the original article.)
If Baudelaire's definition holds even a speck of truth, therein lies the clue to the European view of Jerry Lewis as a comic genius on par with Chaplin.
"I'm 55, but I'm really nine," said Lewis in a recent Tomorrow interview. "The key to my whole lifestyle is mischief, and I cannot, as a 55-year-old man, really think mischievously because that demeans my being. But there's nothing wrong with a nine-year-old thinking that way. I cherish that nine-year-old because he's everybody. He keeps me young. He keeps me thinking young. He'll be at my next birthday, and he'll have the most fun."
Jerry's kid, that mannish boy who has bumbled, mumbled and mugged his way through more than 40 films, is about to return to the silly screen for the first time in a decade in Hardly Working, which opens this week. Like it or not, the film buffoon is back.
The French toast Lewis' comic brilliance. Director Jean-Luc Godard expressed his admiration to an incredulous Dick Cavett not long ago. But in America, there's a split-decision. Statesiders generally find his juvenile Jerry-atrics either hysterical or grating. And it is the red, white and bluenosed critics who are Lewis' most vicious detractors.
The reason for the animosity may be simple enough. Like Peter Pan, that impish, jerky, wonder-struck little kid who resides in the body and soul of Jerry Lewis has never aged. Therefore, he has remained unshackled from the rites, wrongs and constraints of society. On one level, he represents freedom. People not so free, people squeezed into role-modeled behavior, people who act the way society says they ought to act are likely to feel threatened by that kid and the freedom he represents. Hence, the jeerleaders.
Lewis' self-imposed 10-year stretch away from filmmaking was provoked by some overexposure of flesh flicks in the early '70s. When the cinematic tide turned from boffo to porno, Lewis took a cab.
"I love the film industry," he told Tom Snyder. "I took it as a personal affront that they were getting shabby. And it happened with a film I made for Warners, Which Way to the Front? a film I was really in love with. I put two years of a lot of blood and a lot of sweat into it."
The skin-toned times created a condition which shocked Lewis out of his director's chair—and right out of the industry. Driving by a theater one disenchanted evening, he spotted the marquee which had double-billed Which Way to the Front? with Deep Throat. That odd coupling resulted in Lewis' giving Warner Brothers a shouting-room only performance of Hellzapoppin'—sans jokes and music. But the Warner Brotherhood had a cop-out: they were so involved with their then-smash Woodstock that they gave the distribution rights of Lewis' film to other companies.
"Well, I don't want to know from explanations," said Lewis, "'cause I was shattered by it. In the mail I got, I was the heavy. The mothers and fathers were writing me, 'You are someone we allow the children to go to see, and you have a responsibility' and all that jazz. And I got really turned off, really cold.
"Now the capper was Dick Zanuck comes to see me and he wants me to direct and star in Portnoy's Complaint. I said, "Dick, that's not my style. I don't think I know how to make that kind of film." Then I got a script where they wanted me to play a homosexual who had committed matricide.
"I said, hey, let me get back to Vegas. I'll play concerts, I'll go back to The Palladium in London, I'll do my thing. And I said it's got to turn. If it doesn't turn, at that point I really didn't ever want to make a film again. And it did turn, starting in '78."
Jerry Lewis has always been a G-man; family-oriented films have always been the Lewis trademarquee. Yet, despite all those Jerry-vanilla comedies, he is not about to march behind that other Jerry, the pulpit politico Rev. Falwell, and wage war on pornography. (That would make a hilarious scene, though: the unsure-footed stumblebum Lewis character traipsing behind the preacher like a spastic marionette, yelling in that chalk-screechy voice, "Hey wait for me, Mr. Fellman! Uh Rev. Failsafe! I'm comin' Rev. Fallout!")
"I don't believe in censorship," said Lewis. "If you want to see a porno film, an audience should have a place to go see it. But it's a little incongruous and it's hardly sensible to run Bambi with The Devil in Miss Jones just for the sake of Barnum and Bailey showmanship. The theater should run The Devil in Miss Jones for that audience, but leave Bambi where it belongs. It's that simple."
As Lewis hoped, the packaging of flesh and funny bone was a short-lived phenomenon which, he said, "had probably the same chance that the Edsel did, thank God."
In spite of his predilection for tomfoolish behavior, Lewis is a slapstickler for professionalism. As a director, writer and actor, he takes his comedy seriously. He doesn't suffer fools gladly—or any other way. He said, "I hate incompetents. I get very difficult when somebody shouldn't be in the job they're holding because they're keeping it from a man who's qualified. Moreover, they're contagious. They'll run through your crew, and they will dismember that crew.
"I'm making a film that I hope one day my great-great-grandchildren are gonna see. They're gonna examine my work, and the fabric and character of this man is gonna be up for grabs. I'm not havin' some moron on the set looking at his watch yawning 'cause it's just a job. He's outa there. That's only happened twice in 41 films."
Lewis' upcoming attractions include roles in Martin Scorsese's drama, The King of Comedy (which also stars Robert DeNiro), and the screen-bound adaptation of Kurt Vonnegut's Slapstick, being directed by Lewis disciple Steven Paul.
The Day the Clown Cried, Lewis' own dramatic film (his sole to date), has been gathering Swedish dust, along with two Ingmar Bergman films, since 1973. Like the Bergmans, it was shot in Sweden as a Swedish-French co-production. When the political deal soured, the films were stopped dead in their soundtracks. A Godard picture, also part of the (mis)deal, was similarly thrown a French curve and lies in limbo in his homeland.
"They tell us," Lewis said, "that this year, it looks like they're gonna make nice with one another, and we can all finish our films."
However, for the present, comedy comes first. Sight-gagging and language-mangling are back in vogue, and the maestro has returned to show 'em all how it's done. Hardly Working has Jerry Lewis heartily working. Maybe he is 10 years older. But that kid is still nine.
Author Jim GeorgePosted on August 27, 2017 Categories comedy, film, filmmaker, Hollywood, Hollywood Legend, humor, Jerry Lewis, Legend, movie, UncategorizedLeave a comment on JERRY LEWIS: THE FILM BUFFOON RETURNS
CHUCK BERRY 1979: OUR FATHER WHO ART IN PRISON
In 1979 when Chuck Berry, one of the founding fathers of rock & roll, was convicted of tax evasion and sentenced to four months in prison in Lompoc, California, I was moved—provoked, actually—to write a song about him. My mission was twofold: a) to pay tribute to his indelible influence on music in general and mine in particular, and b) to protest what I, perhaps naively, perceived as an injustice. Not knowing the full scope of the case against him, I nevertheless concluded that someone–possibly chromatically motivated–was out to make an example of him. That was in no way excusing or defending the illegal actions to which he pleaded guilty.
"This tax thing that I was in was no bum rap," he admitted in a 1983 Goldmine interview. "It was straight, true…"
However, as deep in the heart of taxes as the charges might have been, many others who similarly broke the law both before and after him, and often for a lot more than the $200,000 he denied Uncle Sam, were given the chance to pay their debts along with hefty penalties/fines/interest without serving any time. Years later, Willie Nelson, for instance, ran afoul of the law to the sour tune of more than $16,000,000 (that's 80 times more than what Berry owed), yet he never spent a day behind bars. Crazy indeed. In addition, Berry received a run-on sentence of 1000 hours of community service. Whereas Nelson was On the Road Again, Berry had No Particular Place to Go. At least for four months.
The song I came up with, "Free Chuck Berry," was purposely structured like one of his trademark tunes: a three-chorder featuring machine-gunned lyrics mixing humor with an issue, all propelled by guitar licks plucked straight from the Berry vine. A Chuck Berry song about Chuck Berry. It was a very crude home recording, but to my knowledge, no one–other than Elephant's Memory with their "Chuck 'n' Bo," which had gone largely unnoticed despite John Lennon's production"–had written such an homage to the legend, let alone a plea for leniency, and I naturally hoped he would be amused by it.
Unfortunately, red tape and Fed tape came between my tape and Chuck Berry. Prison officials sent my recording and letter, unopened, back to me marked "Unauthorized–Return to Sender." The Sender was not happy.
After three calls to the joint and a round of pass-the-Chuck, I spoke to Berry's cell-block leader and was informed that inmates, including the famous jailhouse rocker in question, were not permitted to receive any such packages containing bulk items. I guess it's understandable; you never know what a convicted criminal might do with a cassette tape. And, admittedly, I did hope it would be considered a killer song.
"'C'est la vie,' say the old folks, which goes to show you never can tell"
(To hear the song, copy and paste): https://soundcloud.com/jim-george-101/free-chuck-berry-c-jim-george
Author Jim GeorgePosted on March 30, 2017 April 3, 2017 Categories Chuck Berry, Rock & Roll, UncategorizedTags Chuck Berry, Classic, Guitar, LegendLeave a comment on CHUCK BERRY 1979: OUR FATHER WHO ART IN PRISON
A Poem From JIM SHORTS
THE BRUCKO BROTHERS
The Brucko Brothers,
Buster and Buck,
Cut a fine figure
Despite their ill luck.
"My boys are all legs!"
Their mother exclaimed.
"But we're fast as the wind!"
They said, unashamed.
"We bear no arms,
"No malice, no grudge.
"We never take handouts,
"And we make a mean fudge.
"We never need French cuffs
"Or mittens or gloves.
"We're experts at footsie,
"Just ask our true loves!"
JIM SHORTS – my first book
JIM BY GEORGE (A Self-Interview On Jim Shorts)
Author Jim GeorgePosted on February 1, 2017 February 1, 2017 Categories edward lear, humor, In His Own Write, john lennon, lewis carroll, nonsense, poetry, surrealism, Uncategorized, wordplayLeave a comment on A Poem From JIM SHORTS
A LOOKING-GLASSFUL OF LEWIS CARROLL
Picture yourself in a boat on a river
With tangerine trees and marmalade skies
Those lyrics from The Beatles' "Lucy in the Sky With Diamonds," a song directly inspired by Lewis Carroll's Alice's Adventures in Wonderland, partially conjure up the scene which provided the genesis and revelation of what has become The Bible of so-called nonsense literature, a work which more than a century and a half later still influences prose, poetry, art, music and film.
There were no tangerine trees on the English shores on July 4, 1862 when Reverend Charles Lutwidge Dodgson, his friend Robinson Duckworth, and the three little Liddell girls—Alice, Edith and Lorina—went for a boat ride.
And whether the sky was marmaladen with clouds is debatable (the author described it as a "cloudless day," but meteorological records indicate that it rained on the date in question).
Whatever the reality, on that tranquil "golden afternoon," as Dodgson termed it, he ad-libbed a wondrously nonsensical tale of a girl named Alice who fell down a rabbit-hole. At the non-fictional Alice's behest, Dodgson was obliged to recollect the story and commit it to manuscript so that she could make the return trip over and over again with her namesake.
Although the final version wouldn't materialize until some three years later, it was on that fateful July day that Dodgson, tuned into the gods and inspired by the presence of his friends, planted the seed of the story which would give him an immortality he never dreamed of.
Its first incarnation was Alice's Adventures Under Ground, which he illustrated himself. Later, he added more material and new characters (The Cheshire Cat, The Mad Hatter), commissioned artist John Tenniel to do a new set of drawings, rejected the earlier title for sounding "too like a lesson book about mines," and the fairy tale became the celebrated Alice's Adventures in Wonderland in 1865.
"In writing it out," explained Lewis Carroll, Dodgson's author alias, "I added many fresh ideas which seemed to grow of themselves upon the original stock; and many more added themselves when, years afterward, I wrote it all over again for publication; but…every such idea, and nearly every word of the dialogue, came of itself."
Carroll cast himself and the other boaters in his magical tale. The Duck was an animalization of his pal Duckworth; The Dodo, Dodgson himself—in a self-deprecating jab at his own lifelong stammer (Do-Do-Dodgson) which, interestingly, vanished in the company of children; The Lory and The Eaglet, Lorina and Edith respectively; and, of course, Alice was Alice. In name and inspiration only, however.
"…Alice Liddell is not the character in the books," wrote Jean Gattegno in Fragments of a Looking-Glass. "At most we can say that some kind of current passed through Alice Liddell and brought to life a picture waiting to become animated."
Choosing one of four pen-names the author submitted to him, Edmund Yates (editor of Comic Times and The Train, a pair of publications for which Carroll wrote on occasion) christened Dodgson, Lewis Carroll. He might just as easily have been Edgar Cuthwellis, Edgar U.C. Westhill or Louis Carroll, the other names under consideration.
Both Alice's Adventures in Wonderland and its equally enchanting sequel, Through the Looking-Glass (1871), incorporated unfinished bits and piecemeal ideas Carroll had written years earlier. The first verse of the poem "Jabberwocky"—which Derek Hudson called "the 'Kubla Khan' of nonsense"—from Through the Looking-Glass is one such example.
Like Edward Lear, Carroll often invented his own language, and both authors' words' worth was primarily in their sound and meter. However, while Lear's creations were purely nonsensical nonsense, if you will (or even if you won't), Carroll frequently had a method to his mangling:
'Twas brillig, and the slithy toves
Did gyre and gimble in the wabe;
All mimsy were the borogroves
And the mome raths outgrabe.
Unlike other welders of words, e.g, James Joyce—who let it up to his readers to fathom the meaning of his newfound language—Carroll bothered to relate, right there in his book, via the mouth of the on-and-off-the-wall Humpty Dumpty, how and why he put a little english on his English.
"I can explain all of the poems that were ever invented—and a good many that haven't been invented just yet," proclaims the famous Eggman to Alice.
"Slithy" is a fusing of "slime" and "lithe," "gimble" is to "make holes like a gimlet," "Mimsy" is a compound of "miserable" and "flimsy," "mome" is a contraction of "from home," as "wabe" is of "way before" and "way behind."
Similarly, "chortle," from elsewhere down the lines of "Jabberwocky," is a blend of "chuckle" and "snort," and it is but one example of Carroll-coined words that have become assimilated into our everyday language, as any dictionary will attest.
Wrote Gattegno, "…While continually stressing the difference between the meaning intended and the meaning understood, and showing how words are empty forms that one can play about with and not worry about the 'sense' one may arrive at, he also makes the word the basic unit around which the whole universe of significance comes into being. Words, which he does his best to destroy (with puns, plays on words, word games, etc.), also take on a certain almost magical value as objects of supreme enjoyment."
"Alice in Wonderland broke new ground," wrote Derek Hudson in Carroll, "because it was in no sense a goody-goody book but handled childhood freshly and without sententiousness.
"The nearest parallel to the humorous method of Lewis Carroll is probably that of The Marx Brothers, whose dialogue not only has many verbal similarities with his, but who also, like him, assert one grand false proposition at the outset and so persuade their audiences to accept anything as possible…Both have been based largely on a play with words, mixed with judicious slapstick, and set within the framework of an idiosyncratic view of the human situation; their purpose is entertainment. Lewis Carroll has one transcendent advantage—with his limpid prose, he paints the color of poetry."
And Carroll was, after all, above all, a poet. Continued Hudson, "He was, indeed, perhaps the most poetic when he wrote in prose, and we must think of the Alice books, with their harmonious and unforced blending of prose and verse, as being primarily a poetic achievement."
Despite his fame and good fortune, Charles Dodgson struggled to keep his pseudonymous alter ego a separate entity. Dodgson was a mathematician, a logician, and a don at Christ Church at Oxford, England; Lewis Carroll existed only when tucked under the covers of his dreamlike books.
"I cannot, of course," stated Dodgson/Carroll, "help there being many people who know the connection between my real name and my 'alias,' but the fewer there are who are able to connect my face with the name 'Lewis Carroll,' the happier for me."
Such sentiments were not merely aw-shucks idol chatter from a humble soul; besides publishing a leaflet in which he "neither claims nor acknowledges any connection with any pseudonym, or with any book that is not published under (his) own name," he returned to senders all letters addressed to "Lewis Carroll."
In Lewis Carroll and His World, John Pudney wrote, "Lewis Carroll has been described as the best photographer of children in the 19th century…Children were of course the inspiration for his most creative work, both in literary and photographic terms…(He had a) penchant for the company of pre-pubescent girls and situations which would now trendily be associated with a Lolita syndrome."
Not a book has been written about Carroll, it seems, which hasn't in some measure touched on (no pun intended—for a change) those young girls, who seemed to be the joy of Carroll's life. Alice was neither the first nor the last.
Speculation and Freudian interpretations aside, what we do know as fact is A) He loved to spend time with females aged anywhere from, say, four to puberty (though in later years, he seemed equally delighted by older young women—up to 17 or thereabouts); and B) He loved to photograph them–with their parents' permission–in the nude.
"In the last three decades of Victoria's reign," wrote Pudney, "photographs of children in the nude, and voluptuously fleshy paintings of naked adults, were not only acceptable but fashionable. Carroll's portraits sans habillement were neither a novelty nor necessarily an outrage."
Much ado about nothing on? His photo-graphic hobby and/or his attachment to his subjects reportedly incurred mom wrath on more than one occasion, but while there has been no incriminating evidence against the man, the debate as to his true nature and motivations goes on.
Though violence creeps into the Alice books ("Off with their heads!") Carroll was a gentle man who despised the degradation of women and was vehemently anti-vivisection and anti-hunting for sport with its happiness-is-a-warm-gun mentality. In a pamphlet he once wrote, he predicted a future "when the man of science, looking forth over a world which will then own no other sway than his, shall exult in the thought that he has made of this fair green earth, if not a heaven for man, at least a hell for animals."
On the flip side, Carroll was said to be extremely class-conscious and decidedly self-centered, somewhat of a prima don. As Pudney stated, "He just never did anything much that he did not want to do or felt that duty called upon him to do."
Carroll's other literary works, which include "The Hunting of the Snark," "A Tangled Tale," "Sylvie and Bruno," "Sylvie and Bruno Concluded" and "Phantasmagoria," showcased his genius in varying degrees, though none of them eclipsed or matched the pair of Alice books.
Virgina Woolf wrote of Carroll, "(Childhood) lodged in him whole and entire…He could do what no one else has ever been able to do—he could return to that world: he could recreate it, so that we too become children again…The two Alices are not books for children, they are the only books in which we become children…"
Lewis Carroll was, in the best sense, kidding us.
Author Jim GeorgePosted on January 8, 2017 January 8, 2017 Categories humor, fiction, wordplay, lewis carroll, nonsense, poetry, Review, Uncategorized, wordplayTags Alice's Adventures in Wonderland, classic literature, lewis carroll, nonsenseLeave a comment on A LOOKING-GLASSFUL OF LEWIS CARROLL
byjimgeorge Blog at WordPress.com.


At the Price is Right there are some really nice people who are in the audience. Newsflash: this can be a very good networking opportunity – so pack a few business cards! We met people from all over the country, including a whole bunch of Mary Kay Cosmetic representatives who were attending a local convention! If you are not a social butterfly then bring a book. They take your phones rather early in the waiting process.
May 2014 be filled with fun times, prosperity, excellent health AND affordable health insurance for all- May 2014 have NO talk about any Kardashians, Twerking or Miley "I use to be called Hannah Montana" Cyrus!
How Social Media can help grow your GROOVY business!
411 VOICES Radio Network has started a new program on Sunday evening- THE SPOTLIGHT. Our team of experts will take turns sitting in the "host chair" as we bring to the table amazing guests for all to enjoy! This week we will have Stephen Dimmick, Holly Love and Marie Walker Riddle. Three uniquely different individuals with a common bond- they met via TWITTER and the RICKI LAKE SHOW! Each has their own personal company. From computer technology to education to makeup stylist for the stars! Yep- we will cover it all!
AH AH the blue monkey gives a lesson that some things are best left unexplained.
New resident to San Pedro, CA has discovered peacocks (among other wildlife) at her new home!


text:
Elyon Posts AMA Follow-Up, Talks Battlegrounds, Russian Distribution, And Dailies
Joseph Bradford Updated: Apr 23, 2021 3:36 PM Posted: Apr 23, 2021 3:36 PM
Category: News 0
Elyon hosted an AMA on the MMORPG Subreddit earlier this month, however there were plenty of questions they couldn't get to. So the team working on the upcoming MMORPG took a second crack on the subreddit to answer them.
In Elyon's AMA follow-up, the team touched on topics ranging from the game releasing in Russia (it will be, though they don'tm have a timetable yet), to the PvP Battlegrounds arena in the MMORPG.
One of the more interesting questions had to do with the meta as it currently is in the already released Korean version. The question touched on the ever changing meta, bringing up the fact that it shifts weekly. As such, Elyon has had reduced interest in Korea, which the team admits designing it this way was a mistake.
"We have realized that this was a mistake, so from now on we no longer plan to drastically change the meta and focus more on the current in-game balance from a long-term perspective. Additionally, we will be applying balance changes by adding additional content instead of simply applying new patches. Of course, this doesn't mean we will take our time to fix current live issues."
The team also talked about their plans for its small-scale battlegrounds, as well as the removed Sky Island Competition, and if they had any plans to implement those in the future, or with the launch of the Western version of the MMORPG. In response the team stating that while they "don't have any plans yet," if "demand for this is high" they could consider it. As such, the team states that they are focused on adding "content that is apt to Elyon." The Elyon team also confirmed they were currently working on "asynchronous PvEvP and competitive SvS PvP content."
Elyon also touched on the "addiction cycle of current MMORPGs" and how the team is planning on handling the psychological effect of needing to log in every day to do dailies versus the feelings of missing out and feeling punished for not logging into the MMO.
"It has its pros and cons. This sort of content can act as a guide for players on what can or should be done, and the rewards for completing these help user engagement. However, we are also aware that doing the same thing on a daily/weekly basis can be boring. We are finding ways to automatize this procedure and expect to have it applied before the official launch in NA/EU."
You can check out the full follow-up AMA on the MMORPG subreddit. If you missed the original AMA, check out our coverage of Elyon's first AMA here. Keep in mind too, the Elyon closed beta is fast approaching on May 6th.
Joseph Bradford
Joseph has been writing or podcasting about games in some form since about 2012. Having written for multiple major outlets such as IGN, Playboy, and more, Joseph started writing for MMORPG in 2015. When he's not writing or talking about games, you can typically find him hanging out with his 10-year old or playing Magic: The Gathering with his family. Also, don't get him started on why Balrogs *don't* have wings. You can find him on Twitter @LotrLore


text:
Results for "HPV and Cancer"
[PDF] HPV and Cancer
HPV and Cancer 1 What is HPV? HPV is short for human papilloma (pap-uh-LO-muh) virus. HPVs are a large group of related viruses. Each HPV virus in the group is given a number, which is called an HPV type. Most HPV types cause warts on skin of th...
https://www.cancer.org/content/dam/cancer-org/cancer-control/en/booklets-flyers/hpv-and-cancer-english.pdf
HPV and HPV Testing
Get answers to frequently asked questions about HPV testing here.
https://www.cancer.org/cancer/cancer-causes/infectious-agents/hpv/hpv-and-hpv-testing.html
HPV Facts | HPV Vaccine Facts | How Long is the HPV Vaccine Good For?
Vaccines to prevent human papilloma virus (HPV) infections are safe and effective. They can protect girls and boys from getting several different types of cancer when they get older. Read on for HPV vaccine facts!
https://www.cancer.org/cancer/cancer-causes/infectious-agents/hpv/hpv-vaccine-facts-and-fears.html
More Evidence That HPV Can Cause Head and Neck Cancers
New research suggests that several types of oral HPV, not just the high-risk HPV 16, may be associated with an increased risk of head and neck cancer.
https://www.cancer.org/latest-news/more-evidence-that-hpv-can-cause-head-and-neck-cancers.html
Who Should Get the HPV Vaccination and Why
The HPV vaccine can protect people from getting the types of HPV infections that cause 6 different kinds of cancer. The vaccinations work best when given to people when they're young.
https://www.cancer.org/latest-news/who-should-get-the-hpv-vaccination-and-why.html
Head and Neck Cancer Survivor Advocates for HPV Vaccination
When Cheryl Stark, 50, learned she had head and neck cancer, she didn't want to talk about it. Her doctor told her the cancer likely came from the human papilloma virus (HPV).
https://www.cancer.org/latest-news/head-and-neck-cancer-survivor-advocates-for-hpv-vaccination.html
Complementary and Alternative Methods and Cancer
Complementary and alternative methods include products, practices, and systems that are not part of mainstream medicine. Learn about how they are used for people with cancer here.
https://www.cancer.org/treatment/treatments-and-side-effects/complementary-and-alternative-medicine/complementary-and-alternative-methods-and-cancer.html
Tobacco and Cancer | American Cancer Society
Get information on cigarette, cigar, and smokeless tobacco use how it affects different groups of people.
https://www.cancer.org/cancer/cancer-causes/tobacco-and-cancer.html
Searches related to HPV and Cancer
Protecting Our Children from HPV Cancers
Our HPV Vaccination Initiatives American Cancer Society
HPV Vaccination and Cancer Prevention ACS
HPV Related Cancers
HPV Cancer Free
HPV (Human Papillomavirus) American Cancer Society


Under Horticulture Technology Mission projects and under institute programme elite planting material of apple, almond, walnut and seed and seedlings of vegetable varieties and hybrids were supplied to J&K, Uttarakhand, Arunachal State Departments, farmers, nursery men, etc. for augmenting quality planting material.
Since the CITH at Srinagar is in the Army security area, the visit of farmers/trainees/officers etc. is restricted with the result, the access to new varieties and technologies/developed is very much restricted. Attachment of any one of the existing KVK's or Establishment of new KVK under CITH in the newly carved horticulturally rich districts of Shopian or Ganderbal is required.