text:
var assert = require("assert");
var types = require("ast-types");
var isArray = types.builtInTypes.array;
var b = types.builders;
var n = types.namedTypes;
var leap = require("./leap");
var meta = require("./meta");
var util = require("./util");
var hasOwn = Object.prototype.hasOwnProperty;

function Emitter(contextId) {
  assert.ok(this instanceof Emitter);
  n.Identifier.assert(contextId);

  Object.defineProperties(this, {
    // In order to make sure the context object does not collide with
    // anything in the local scope, we might have to rename it, so we
    // refer to it symbolically instead of just assuming that it will be
    // called "context".
    contextId: { value: contextId },

    // An append-only list of Statements that grows each time this.emit is
    // called.
    listing: { value: [] },

    // A sparse array whose keys correspond to locations in this.listing
    // that have been marked as branch/jump targets.
    marked: { value: [true] },

    // The last location will be marked when this.getDispatchLoop is
    // called.
    finalLoc: { value: loc() },

    // A list of all leap.TryEntry statements emitted.
    tryEntries: { value: [] }
  });

  // The .leapManager property needs to be defined by a separate
  // defineProperties call so that .finalLoc will be visible to the
  // leap.LeapManager constructor.
  Object.defineProperties(this, {
    // Each time we evaluate the body of a loop, we tell this.leapManager
    // to enter a nested loop context that determines the meaning of break
    // and continue statements therein.
    leapManager: { value: new leap.LeapManager(this) }
  });
}

var Ep = Emitter.prototype;
exports.Emitter = Emitter;

// Offsets into this.listing that could be used as targets for branches or
// jumps are represented as numeric Literal nodes. This representation has
// the amazingly convenient benefit of allowing the exact value of the
// location to be determined at any time, even after generating code that
// refers to the location.
function loc() {
  return b.literal(-1);
}

// Sets the exact value of the given location to the offset of the next
// Statement emitted.
Ep.mark = function(loc) {
  n.Literal.assert(loc);
  var index = this.listing.length;
  if (loc.value === -1) {
    loc.value = index;
  } else {
    // Locations can be marked redundantly, but their values cannot change
    // once set the first time.
    assert.strictEqual(loc.value, index);
  }
  this.marked[index] = true;
  return loc;
};

Ep.emit = function(node) {
  if (n.Expression.check(node))
    node = b.expressionStatement(node);
  n.Statement.assert(node);
  this.listing.push(node);
};

// Shorthand for emitting assignment statements. This will come in handy
// for assignments to temporary variables.
Ep.emitAssign = function(lhs, rhs) {
  this.emit(this.assign(lhs, rhs));
  return lhs;
};

// Shorthand for an assignment statement.
Ep.assign = function(lhs, rhs) {
  return b.expressionStatement(
    b.assignmentExpression("=", lhs, rhs));
};

// Convenience function for generating expressions like context.next,
// context.sent, and context.rval.
Ep.contextProperty = function(name, computed) {
  return b.memberExpression(
    this.contextId,
    computed ? b.literal(name) : b.identifier(name),
    !!computed
  );
};

var volatileContextPropertyNames = {
  prev: true,
  next: true,
  sent: true,
  rval: true
};

// A "volatile" context property is a MemberExpression like context.sent
// that should probably be stored in a temporary variable when there's a
// possibility the property will get overwritten.
Ep.isVolatileContextProperty = function(expr) {
  if (n.MemberExpression.check(expr)) {
    if (expr.computed) {
      // If it's a computed property such as context[couldBeAnything],
      // assume the worst in terms of volatility.
      return true;
    }

    if (n.Identifier.check(expr.object) &&
        n.Identifier.check(expr.property) &&
        expr.object.name === this.contextId.name &&
        hasOwn.call(volatileContextPropertyNames,
                    expr.property.name)) {
      return true;
    }
  }

  return false;
};

// Shorthand for setting context.rval and jumping to `context.stop()`.
Ep.stop = function(rval) {
  if (rval) {
    this.setReturnValue(rval);
  }

  this.jump(this.finalLoc);
};

Ep.setReturnValue = function(valuePath) {
  n.Expression.assert(valuePath.value);

  this.emitAssign(
    this.contextProperty("rval"),
    this.explodeExpression(valuePath)
  );
};

Ep.clearPendingException = function(tryLoc, assignee) {
  n.Literal.assert(tryLoc);

  var catchCall = b.callExpression(
    this.contextProperty("catch", true),
    [tryLoc]
  );

  if (assignee) {
    this.emitAssign(assignee, catchCall);
  } else {
    this.emit(catchCall);
  }
};

// Emits code for an unconditional jump to the given location, even if the
// exact value of the location is not yet known.
Ep.jump = function(toLoc) {
  this.emitAssign(this.contextProperty("next"), toLoc);
  this.emit(b.breakStatement());
};

// Conditional jump.
Ep.jumpIf = function(test, toLoc) {
  n.Expression.assert(test);
  n.Literal.assert(toLoc);

  this.emit(b.ifStatement(
    test,
    b.blockStatement([
      this.assign(this.contextProperty("next"), toLoc),
      b.breakStatement()
    ])
  ));
};

// Conditional jump, with the condition negated.
Ep.jumpIfNot = function(test, toLoc) {
  n.Expression.assert(test);
  n.Literal.assert(toLoc);

  var negatedTest;
  if (n.UnaryExpression.check(test) &&
      test.operator === "!") {
    // Avoid double negation.
    negatedTest = test.argument;
  } else {
    negatedTest = b.unaryExpression("!", test);
  }

  this.emit(b.ifStatement(
    negatedTest,
    b.blockStatement([
      this.assign(this.contextProperty("next"), toLoc),
      b.breakStatement()
    ])
  ));
};

// Returns a unique MemberExpression that can be used to store and
// retrieve temporary values. Since the object of the member expression is
// the context object, which is presumed to coexist peacefully with all
// other local variables, and since we just increment `nextTempId`
// monotonically, uniqueness is assured.
var nextTempId = 0;
Ep.makeTempVar = function() {
  return this.contextProperty("t" + nextTempId++);
};

Ep.getContextFunction = function(id) {
  var func = b.functionExpression(
    id || null/*Anonymous*/,
    [this.contextId],
    b.blockStatement([this.getDispatchLoop()]),
    false, // Not a generator anymore!
    false // Nor an expression.
  );
  func._aliasFunction = true;
  return func;
};

// Turns this.listing into a loop of the form
//
//   while (1) switch (context.next) {
//   case 0:
//   ...
//   case n:
//     return context.stop();
//   }
//
// Each marked location in this.listing will correspond to one generated
// case statement.
Ep.getDispatchLoop = function() {
  var self = this;
  var cases = [];
  var current;

  // If we encounter a break, continue, or return statement in a switch
  // case, we can skip the rest of the statements until the next case.
  var alreadyEnded = false;

  self.listing.forEach(function(stmt, i) {
    if (self.marked.hasOwnProperty(i)) {
      cases.push(b.switchCase(
        b.literal(i),
        current = []));
      alreadyEnded = false;
    }

    if (!alreadyEnded) {
      current.push(stmt);
      if (isSwitchCaseEnder(stmt))
        alreadyEnded = true;
    }
  });

  // Now that we know how many statements there will be in this.listing,
  // we can finally resolve this.finalLoc.value.
  this.finalLoc.value = this.listing.length;

  cases.push(
    b.switchCase(this.finalLoc, [
      // Intentionally fall through to the "end" case...
    ]),

    // So that the runtime can jump to the final location without having
    // to know its offset, we provide the "end" case as a synonym.
    b.switchCase(b.literal("end"), [
      // This will check/clear both context.thrown and context.rval.
      b.returnStatement(
        b.callExpression(this.contextProperty("stop"), [])
      )
    ])
  );

  return b.whileStatement(
    b.literal(1),
    b.switchStatement(
      b.assignmentExpression(
        "=",
        this.contextProperty("prev"),
        this.contextProperty("next")
      ),
      cases
    )
  );
};

// See comment above re: alreadyEnded.
function isSwitchCaseEnder(stmt) {
  return n.BreakStatement.check(stmt)
      || n.ContinueStatement.check(stmt)
      || n.ReturnStatement.check(stmt)
      || n.ThrowStatement.check(stmt);
}

Ep.getTryLocsList = function() {
  if (this.tryEntries.length === 0) {
    // To avoid adding a needless [] to the majority of runtime.wrap
    // argument lists, force the caller to handle this case specially.
    return null;
  }

  var lastLocValue = 0;

  return b.arrayExpression(
    this.tryEntries.map(function(tryEntry) {
      var thisLocValue = tryEntry.firstLoc.value;
      assert.ok(thisLocValue >= lastLocValue, "try entries out of order");
      lastLocValue = thisLocValue;

      var ce = tryEntry.catchEntry;
      var fe = tryEntry.finallyEntry;

      var locs = [
        tryEntry.firstLoc,
        // The null here makes a hole in the array.
        ce ? ce.firstLoc : null
      ];

      if (fe) {
        locs[2] = fe.firstLoc;
        locs[3] = fe.afterLoc;
      }

      return b.arrayExpression(locs);
    })
  );
};

// All side effects must be realized in order.

// If any subexpression harbors a leap, all subexpressions must be
// neutered of side effects.

// No destructive modification of AST nodes.

Ep.explode = function(path, ignoreResult) {
  assert.ok(path instanceof types.NodePath);

  var node = path.value;
  var self = this;

  n.Node.assert(node);

  if (n.Statement.check(node))
    return self.explodeStatement(path);

  if (n.Expression.check(node))
    return self.explodeExpression(path, ignoreResult);

  if (n.Declaration.check(node))
    throw getDeclError(node);

  switch (node.type) {
  case "Program":
    return path.get("body").map(
      self.explodeStatement,
      self
    );

  case "VariableDeclarator":
    throw getDeclError(node);

  // These node types should be handled by their parent nodes
  // (ObjectExpression, SwitchStatement, and TryStatement, respectively).
  case "Property":
  case "SwitchCase":
  case "CatchClause":
    throw new Error(
      node.type + " nodes should be handled by their parents");

  default:
    throw new Error(
      "unknown Node of type " +
        JSON.stringify(node.type));
  }
};

function getDeclError(node) {
  return new Error(
    "all declarations should have been transformed into " +
    "assignments before the Exploder began its work: " +
    JSON.stringify(node));
}

Ep.explodeStatement = function(path, labelId) {
  assert.ok(path instanceof types.NodePath);

  var stmt = path.value;
  var self = this;

  n.Statement.assert(stmt);

  if (labelId) {
    n.Identifier.assert(labelId);
  } else {
    labelId = null;
  }

  // Explode BlockStatement nodes even if they do not contain a yield,
  // because we don't want or need the curly braces.
  if (n.BlockStatement.check(stmt)) {
    return path.get("body").each(
      self.explodeStatement,
      self
    );
  }

  if (!meta.containsLeap(stmt)) {
    // Technically we should be able to avoid emitting the statement
    // altogether if !meta.hasSideEffects(stmt), but that leads to
    // confusing generated code (for instance, `while (true) {}` just
    // disappears) and is probably a more appropriate job for a dedicated
    // dead code elimination pass.
    self.emit(stmt);
    return;
  }

  switch (stmt.type) {
  case "ExpressionStatement":
    self.explodeExpression(path.get("expression"), true);
    break;

  case "LabeledStatement":
    var after = loc();

    // Did you know you can break from any labeled block statement or
    // control structure? Well, you can! Note: when a labeled loop is
    // encountered, the leap.LabeledEntry created here will immediately
    // enclose a leap.LoopEntry on the leap manager's stack, and both
    // entries will have the same label. Though this works just fine, it
    // may seem a bit redundant. In theory, we could check here to
    // determine if stmt knows how to handle its own label; for example,
    // stmt happens to be a WhileStatement and so we know it's going to
    // establish its own LoopEntry when we explode it (below). Then this
    // LabeledEntry would be unnecessary. Alternatively, we might be
    // tempted not to pass stmt.label down into self.explodeStatement,
    // because we've handled the label here, but that's a mistake because
    // labeled loops may contain labeled continue statements, which is not
    // something we can handle in this generic case. All in all, I think a
    // little redundancy greatly simplifies the logic of this case, since
    // it's clear that we handle all possible LabeledStatements correctly
    // here, regardless of whether they interact with the leap manager
    // themselves. Also remember that labels and break/continue-to-label
    // statements are rare, and all of this logic happens at transform
    // time, so it has no additional runtime cost.
    self.leapManager.withEntry(
      new leap.LabeledEntry(after, stmt.label),
      function() {
        self.explodeStatement(path.get("body"), stmt.label);
      }
    );

    self.mark(after);

    break;

  case "WhileStatement":
    var before = loc();
    var after = loc();

    self.mark(before);
    self.jumpIfNot(self.explodeExpression(path.get("test")), after);
    self.leapManager.withEntry(
      new leap.LoopEntry(after, before, labelId),
      function() { self.explodeStatement(path.get("body")); }
    );
    self.jump(before);
    self.mark(after);

    break;

  case "DoWhileStatement":
    var first = loc();
    var test = loc();
    var after = loc();

    self.mark(first);
    self.leapManager.withEntry(
      new leap.LoopEntry(after, test, labelId),
      function() { self.explode(path.get("body")); }
    );
    self.mark(test);
    self.jumpIf(self.explodeExpression(path.get("test")), first);
    self.mark(after);

    break;

  case "ForStatement":
    var head = loc();
    var update = loc();
    var after = loc();

    if (stmt.init) {
      // We pass true here to indicate that if stmt.init is an expression
      // then we do not care about its result.
      self.explode(path.get("init"), true);
    }

    self.mark(head);

    if (stmt.test) {
      self.jumpIfNot(self.explodeExpression(path.get("test")), after);
    } else {
      // No test means continue unconditionally.
    }

    self.leapManager.withEntry(
      new leap.LoopEntry(after, update, labelId),
      function() { self.explodeStatement(path.get("body")); }
    );

    self.mark(update);

    if (stmt.update) {
      // We pass true here to indicate that if stmt.update is an
      // expression then we do not care about its result.
      self.explode(path.get("update"), true);
    }

    self.jump(head);

    self.mark(after);

    break;

  case "ForInStatement":
    n.Identifier.assert(stmt.left);

    var head = loc();
    var after = loc();

    var keyIterNextFn = self.makeTempVar();
    self.emitAssign(
      keyIterNextFn,
      b.callExpression(
        util.runtimeProperty("keys"),
        [self.explodeExpression(path.get("right"))]
      )
    );

    self.mark(head);

    var keyInfoTmpVar = self.makeTempVar();
    self.jumpIf(
      b.memberExpression(
        b.assignmentExpression(
          "=",
          keyInfoTmpVar,
          b.callExpression(keyIterNextFn, [])
        ),
        b.identifier("done"),
        false
      ),
      after
    );

    self.emitAssign(
      stmt.left,
      b.memberExpression(
        keyInfoTmpVar,
        b.identifier("value"),
        false
      )
    );

    self.leapManager.withEntry(
      new leap.LoopEntry(after, head, labelId),
      function() { self.explodeStatement(path.get("body")); }
    );

    self.jump(head);

    self.mark(after);

    break;

  case "BreakStatement":
    self.emitAbruptCompletion({
      type: "break",
      target: self.leapManager.getBreakLoc(stmt.label)
    });

    break;

  case "ContinueStatement":
    self.emitAbruptCompletion({
      type: "continue",
      target: self.leapManager.getContinueLoc(stmt.label)
    });

    break;

  case "SwitchStatement":
    // Always save the discriminant into a temporary variable in case the
    // test expressions overwrite values like context.sent.
    var disc = self.emitAssign(
      self.makeTempVar(),
      self.explodeExpression(path.get("discriminant"))
    );

    var after = loc();
    var defaultLoc = loc();
    var condition = defaultLoc;
    var caseLocs = [];

    // If there are no cases, .cases might be undefined.
    var cases = stmt.cases || [];

    for (var i = cases.length - 1; i >= 0; --i) {
      var c = cases[i];
      n.SwitchCase.assert(c);

      if (c.test) {
        condition = b.conditionalExpression(
          b.binaryExpression("===", disc, c.test),
          caseLocs[i] = loc(),
          condition
        );
      } else {
        caseLocs[i] = defaultLoc;
      }
    }

    self.jump(self.explodeExpression(
      new types.NodePath(condition, path, "discriminant")
    ));

    self.leapManager.withEntry(
      new leap.SwitchEntry(after),
      function() {
        path.get("cases").each(function(casePath) {
          var c = casePath.value;
          var i = casePath.name;

          self.mark(caseLocs[i]);

          casePath.get("consequent").each(
            self.explodeStatement,
            self
          );
        });
      }
    );

    self.mark(after);
    if (defaultLoc.value === -1) {
      self.mark(defaultLoc);
      assert.strictEqual(after.value, defaultLoc.value);
    }

    break;

  case "IfStatement":
    var elseLoc = stmt.alternate && loc();
    var after = loc();

    self.jumpIfNot(
      self.explodeExpression(path.get("test")),
      elseLoc || after
    );

    self.explodeStatement(path.get("consequent"));

    if (elseLoc) {
      self.jump(after);
      self.mark(elseLoc);
      self.explodeStatement(path.get("alternate"));
    }

    self.mark(after);

    break;

  case "ReturnStatement":
    self.emitAbruptCompletion({
      type: "return",
      value: self.explodeExpression(path.get("argument"))
    });

    break;

  case "WithStatement":
    throw new Error(
      node.type + " not supported in generator functions.");

  case "TryStatement":
    var after = loc();

    var handler = stmt.handler;
    if (!handler && stmt.handlers) {
      handler = stmt.handlers[0] || null;
    }

    var catchLoc = handler && loc();
    var catchEntry = catchLoc && new leap.CatchEntry(
      catchLoc,
      handler.param
    );

    var finallyLoc = stmt.finalizer && loc();
    var finallyEntry = finallyLoc &&
      new leap.FinallyEntry(finallyLoc, after);

    var tryEntry = new leap.TryEntry(
      self.getUnmarkedCurrentLoc(),
      catchEntry,
      finallyEntry
    );

    self.tryEntries.push(tryEntry);
    self.updateContextPrevLoc(tryEntry.firstLoc);

    self.leapManager.withEntry(tryEntry, function() {
      self.explodeStatement(path.get("block"));

      if (catchLoc) {
        if (finallyLoc) {
          // If we have both a catch block and a finally block, then
          // because we emit the catch block first, we need to jump over
          // it to the finally block.
          self.jump(finallyLoc);

        } else {
          // If there is no finally block, then we need to jump over the
          // catch block to the fall-through location.
          self.jump(after);
        }

        self.updateContextPrevLoc(self.mark(catchLoc));

        var bodyPath = path.get("handler", "body");
        var safeParam = self.makeTempVar();
        self.clearPendingException(tryEntry.firstLoc, safeParam);

        var catchScope = bodyPath.scope;
        var catchParamName = handler.param.name;
        n.CatchClause.assert(catchScope.node);
        assert.strictEqual(catchScope.lookup(catchParamName), catchScope);

        types.visit(bodyPath, {
          visitIdentifier: function(path) {
            if (util.isReference(path, catchParamName) &&
                path.scope.lookup(catchParamName) === catchScope) {
              return safeParam;
            }

            this.traverse(path);
          },

          visitFunction: function(path) {
            if (path.scope.declares(catchParamName)) {
              // Don't descend into nested scopes that shadow the catch
              // parameter with their own declarations. This isn't
              // logically necessary because of the path.scope.lookup we
              // do in visitIdentifier, but it saves time.
              return false;
            }

            this.traverse(path);
          }
        });

        self.leapManager.withEntry(catchEntry, function() {
          self.explodeStatement(bodyPath);
        });
      }

      if (finallyLoc) {
        self.updateContextPrevLoc(self.mark(finallyLoc));

        self.leapManager.withEntry(finallyEntry, function() {
          self.explodeStatement(path.get("finalizer"));
        });

        self.emit(b.returnStatement(b.callExpression(
          self.contextProperty("finish"),
          [finallyEntry.firstLoc]
        )));
      }
    });

    self.mark(after);

    break;

  case "ThrowStatement":
    self.emit(b.throwStatement(
      self.explodeExpression(path.get("argument"))
    ));

    break;

  default:
    throw new Error(
      "unknown Statement of type " +
        JSON.stringify(stmt.type));
  }
};

Ep.emitAbruptCompletion = function(record) {
  if (!isValidCompletion(record)) {
    assert.ok(
      false,
      "invalid completion record: " +
        JSON.stringify(record)
    );
  }

  assert.notStrictEqual(
    record.type, "normal",
    "normal completions are not abrupt"
  );

  var abruptArgs = [b.literal(record.type)];

  if (record.type === "break" ||
      record.type === "continue") {
    n.Literal.assert(record.target);
    abruptArgs[1] = record.target;
  } else if (record.type === "return" ||
             record.type === "throw") {
    if (record.value) {
      n.Expression.assert(record.value);
      abruptArgs[1] = record.value;
    }
  }

  this.emit(
    b.returnStatement(
      b.callExpression(
        this.contextProperty("abrupt"),
        abruptArgs
      )
    )
  );
};

function isValidCompletion(record) {
  var type = record.type;

  if (type === "normal") {
    return !hasOwn.call(record, "target");
  }

  if (type === "break" ||
      type === "continue") {
    return !hasOwn.call(record, "value")
        && n.Literal.check(record.target);
  }

  if (type === "return" ||
      type === "throw") {
    return hasOwn.call(record, "value")
        && !hasOwn.call(record, "target");
  }

  return false;
}

// Not all offsets into emitter.listing are potential jump targets. For
// example, execution typically falls into the beginning of a try block
// without jumping directly there. This method returns the current offset
// without marking it, so that a switch case will not necessarily be
// generated for this offset (I say "not necessarily" because the same
// location might end up being marked in the process of emitting other
// statements). There's no logical harm in marking such locations as jump
// targets, but minimizing the number of switch cases keeps the generated
// code shorter.
Ep.getUnmarkedCurrentLoc = function() {
  return b.literal(this.listing.length);
};

// The context.prev property takes the value of context.next whenever we
// evaluate the switch statement discriminant, which is generally good
// enough for tracking the last location we jumped to, but sometimes
// context.prev needs to be more precise, such as when we fall
// successfully out of a try block and into a finally block without
// jumping. This method exists to update context.prev to the freshest
// available location. If we were implementing a full interpreter, we
// would know the location of the current instruction with complete
// precision at all times, but we don't have that luxury here, as it would
// be costly and verbose to set context.prev before every statement.
Ep.updateContextPrevLoc = function(loc) {
  if (loc) {
    n.Literal.assert(loc);

    if (loc.value === -1) {
      // If an uninitialized location literal was passed in, set its value
      // to the current this.listing.length.
      loc.value = this.listing.length;
    } else {
      // Otherwise assert that the location matches the current offset.
      assert.strictEqual(loc.value, this.listing.length);
    }

  } else {
    loc = this.getUnmarkedCurrentLoc();
  }

  // Make sure context.prev is up to date in case we fell into this try
  // statement without jumping to it. TODO Consider avoiding this
  // assignment when we know control must have jumped here.
  this.emitAssign(this.contextProperty("prev"), loc);
};

Ep.explodeExpression = function(path, ignoreResult) {
  assert.ok(path instanceof types.NodePath);

  var expr = path.value;
  if (expr) {
    n.Expression.assert(expr);
  } else {
    return expr;
  }

  var self = this;
  var result; // Used optionally by several cases below.

  function finish(expr) {
    n.Expression.assert(expr);
    if (ignoreResult) {
      self.emit(expr);
    } else {
      return expr;
    }
  }

  // If the expression does not contain a leap, then we either emit the
  // expression as a standalone statement or return it whole.
  if (!meta.containsLeap(expr)) {
    return finish(expr);
  }

  // If any child contains a leap (such as a yield or labeled continue or
  // break statement), then any sibling subexpressions will almost
  // certainly have to be exploded in order to maintain the order of their
  // side effects relative to the leaping child(ren).
  var hasLeapingChildren = meta.containsLeap.onlyChildren(expr);

  // In order to save the rest of explodeExpression from a combinatorial
  // trainwreck of special cases, explodeViaTempVar is responsible for
  // deciding when a subexpression needs to be "exploded," which is my
  // very technical term for emitting the subexpression as an assignment
  // to a temporary variable and the substituting the temporary variable
  // for the original subexpression. Think of exploded view diagrams, not
  // Michael Bay movies. The point of exploding subexpressions is to
  // control the precise order in which the generated code realizes the
  // side effects of those subexpressions.
  function explodeViaTempVar(tempVar, childPath, ignoreChildResult) {
    assert.ok(childPath instanceof types.NodePath);

    assert.ok(
      !ignoreChildResult || !tempVar,
      "Ignoring the result of a child expression but forcing it to " +
        "be assigned to a temporary variable?"
    );

    var result = self.explodeExpression(childPath, ignoreChildResult);

    if (ignoreChildResult) {
      // Side effects already emitted above.

    } else if (tempVar || (hasLeapingChildren &&
                           (self.isVolatileContextProperty(result) ||
                            meta.hasSideEffects(result)))) {
      // If tempVar was provided, then the result will always be assigned
      // to it, even if the result does not otherwise need to be assigned
      // to a temporary variable.  When no tempVar is provided, we have
      // the flexibility to decide whether a temporary variable is really
      // necessary.  In general, temporary assignment is required only
      // when some other child contains a leap and the child in question
      // is a context property like $ctx.sent that might get overwritten
      // or an expression with side effects that need to occur in proper
      // sequence relative to the leap.
      result = self.emitAssign(
        tempVar || self.makeTempVar(),
        result
      );
    }
    return result;
  }

  // If ignoreResult is true, then we must take full responsibility for
  // emitting the expression with all its side effects, and we should not
  // return a result.

  switch (expr.type) {
  case "MemberExpression":
    return finish(b.memberExpression(
      self.explodeExpression(path.get("object")),
      expr.computed
        ? explodeViaTempVar(null, path.get("property"))
        : expr.property,
      expr.computed
    ));

  case "CallExpression":
    var oldCalleePath = path.get("callee");
    var newCallee = self.explodeExpression(oldCalleePath);

    // If the callee was not previously a MemberExpression, then the
    // CallExpression was "unqualified," meaning its `this` object should
    // be the global object. If the exploded expression has become a
    // MemberExpression, then we need to force it to be unqualified by
    // using the (0, object.property)(...) trick; otherwise, it will
    // receive the object of the MemberExpression as its `this` object.
    if (!n.MemberExpression.check(oldCalleePath.node) &&
        n.MemberExpression.check(newCallee)) {
      newCallee = b.sequenceExpression([
        b.literal(0),
        newCallee
      ]);
    }

    return finish(b.callExpression(
      newCallee,
      path.get("arguments").map(function(argPath) {
        return explodeViaTempVar(null, argPath);
      })
    ));

  case "NewExpression":
    return finish(b.newExpression(
      explodeViaTempVar(null, path.get("callee")),
      path.get("arguments").map(function(argPath) {
        return explodeViaTempVar(null, argPath);
      })
    ));

  case "ObjectExpression":
    return finish(b.objectExpression(
      path.get("properties").map(function(propPath) {
        return b.property(
          propPath.value.kind,
          propPath.value.key,
          explodeViaTempVar(null, propPath.get("value"))
        );
      })
    ));

  case "ArrayExpression":
    return finish(b.arrayExpression(
      path.get("elements").map(function(elemPath) {
        return explodeViaTempVar(null, elemPath);
      })
    ));

  case "SequenceExpression":
    var lastIndex = expr.expressions.length - 1;

    path.get("expressions").each(function(exprPath) {
      if (exprPath.name === lastIndex) {
        result = self.explodeExpression(exprPath, ignoreResult);
      } else {
        self.explodeExpression(exprPath, true);
      }
    });

    return result;

  case "LogicalExpression":
    var after = loc();

    if (!ignoreResult) {
      result = self.makeTempVar();
    }

    var left = explodeViaTempVar(result, path.get("left"));

    if (expr.operator === "&&") {
      self.jumpIfNot(left, after);
    } else {
      assert.strictEqual(expr.operator, "||");
      self.jumpIf(left, after);
    }

    explodeViaTempVar(result, path.get("right"), ignoreResult);

    self.mark(after);

    return result;

  case "ConditionalExpression":
    var elseLoc = loc();
    var after = loc();
    var test = self.explodeExpression(path.get("test"));

    self.jumpIfNot(test, elseLoc);

    if (!ignoreResult) {
      result = self.makeTempVar();
    }

    explodeViaTempVar(result, path.get("consequent"), ignoreResult);
    self.jump(after);

    self.mark(elseLoc);
    explodeViaTempVar(result, path.get("alternate"), ignoreResult);

    self.mark(after);

    return result;

  case "UnaryExpression":
    return finish(b.unaryExpression(
      expr.operator,
      // Can't (and don't need to) break up the syntax of the argument.
      // Think about delete a[b].
      self.explodeExpression(path.get("argument")),
      !!expr.prefix
    ));

  case "BinaryExpression":
    return finish(b.binaryExpression(
      expr.operator,
      explodeViaTempVar(null, path.get("left")),
      explodeViaTempVar(null, path.get("right"))
    ));

  case "AssignmentExpression":
    return finish(b.assignmentExpression(
      expr.operator,
      self.explodeExpression(path.get("left")),
      self.explodeExpression(path.get("right"))
    ));

  case "UpdateExpression":
    return finish(b.updateExpression(
      expr.operator,
      self.explodeExpression(path.get("argument")),
      expr.prefix
    ));

  case "YieldExpression":
    var after = loc();
    var arg = expr.argument && self.explodeExpression(path.get("argument"));

    if (arg && expr.delegate) {
      var result = self.makeTempVar();

      self.emit(b.returnStatement(b.callExpression(
        self.contextProperty("delegateYield"), [
          arg,
          b.literal(result.property.name),
          after
        ]
      )));

      self.mark(after);

      return result;
    }

    self.emitAssign(self.contextProperty("next"), after);
    self.emit(b.returnStatement(arg || null));
    self.mark(after);

    return self.contextProperty("sent");

  default:
    throw new Error(
      "unknown Expression of type " +
        JSON.stringify(expr.type));
  }
};

redpajama_set_name: RedPajamaGithub


How do I bill for clients who are eligible for both Medicare and Medicaid? …… I.3.
chairs, lounge and/or lift chairs (e.g., geri-chair, posture guard, or lazy boy).
excluding Medicare), prior authorization must still be ….. or lazy boy).
that if the Home was going to Medicaid/Medicare Certification if.
power w/c is for mobility only it is not a lazy boy recliner substitute.
to ….. wave pools, zero depth pools, water slide splash pools, lazy river …..
Training Program, the YMCA, the Boy Scouts of America, or another.
by the Massachusetts Board of Registration in Optometry.


text:
Q: Pivot Table with absolute values and percentages in columns with values in rows I want to have a table with values
    A   B   C
--+-------------
1 | x   a   1
2 | x   b   0
3 | y   a   1
4 | x   b   1
5 | y   a   1

and want to have the following Pivot Table
Filter A: x

            a           b           total
--------+-----------------------------
        |   #   %       #   %       #   %
--------+-----------------------------
count B |   1   -       2   -       3   -
sum C   |   1   100%    1   50%     2   67%

where count B is count of A='x' and B appropriate
and sum C is the sum of column C where A='x' and B appropriate.
The percentages in the rows are the sum C value of that rows divided by the count of rows with A='x' and appropate B.
So I was able to figure out how get just the absolute values. I found solutions where I can add the percentages as an additional row value but not column. Is this possible somehow?
And how can I calculate the percentages? Or should I open another question?
Thank you in advance.

A: Finally i created two blocks one with absolute values calculated by the pivot table. The second one are the percentages which are calculated by formulas from the pivot table.

redpajama_set_name: RedPajamaStackExchange


Canada is a well-known destination for mountain bike enthusiasts. Many dream of shredding Whistler Bike Park, going for an epic tour of the North Shore, or perhaps freeriding in Squamish. The common feature of these places? All are situated on the far-western side of Canada. For someone from Ontario, this is a little disheartening and, perhaps, a little unfair.
Mountain biking in Ontario isn't bad, in and of itself, but it certainly is not the proclaimed 'Holy-land' – the mountain bike Mecca, if you will – that is often associated with British Columbia. For those on the Westernmost coast of Canada, it is reasonable to mountain bike year-round due to the rather mild temperatures. Not only that, but if you happen to burn yourself out, a short drive in any direction will put you at the base of some incredible mountains, for hours of fun on lift accessed ski terrain. For an Ontarian, the winter months are often brutally cold and, adding insult to injury, ski-lift access is few and far between. Those winter months require some sort of physical activity – and sitting inside on the trainer simply doesn't cut it. A sense of adventure is needed to keep motivation up and deal with the dreary, short days that form part of a Canadian winter.
'Fatbikes' are widely seen as the vehicle of choice for filling this void: indeed, I am a full proponent of the fatbike movement. If nothing else, it gives me two wheels that I can ride outside even in the dead of winter. However, being a (slightly) competitive cyclist means that riding by myself is not good enough. What I need is a sense of adventure and competition. Luckily, some other Ontarian's seem to feel the same as I do, and the 'Wendigo Ultra' was born. Winter ultra-endurance events are not necessarily new; however, this event would be the first of its kind within Ontario's borders. I knew that this sort of event was a great idea: not only do I love pushing myself physically and mentally, but it also means that there is a growing group of dedicated individuals who wish to push themselves the way I do. Personally, I think events like these are going to take off in Ontario. Canadians, whether by a natural proclivity towards winter sports or a common sense of pride in our collective suffering during the winter, seem to be eager adopters of any sport related to winter. The advent of ultra-endurance winter events is a natural evolution of this collective sentiment.
After a couple months of relatively consistent training, the Wendigo Ultra was finally on the horizon. With my mandatory gear list checked and double-checked, and my bike all loaded, I made the 7-hour journey to Ottawa, which is only one and a half hours from the start of the Wendigo. Being a university student means that I don't have access to the greatest gear and can't spend too much on travel. After borrowing my parent's car (they weren't too thrilled about that), and spending the night before the event with some friends at the University of Ottawa, I made my way to the start point, near Pembroke. As I hopped in the van, still groggy from the night before, the thermometer in the car read -19 degrees Celsius. I shuddered. Not ideal for being out in the elements all day, especially since I didn't have winter riding boots. Despite this, I knew that once I got moving my core temperature would rise steadily and I would likely be fine. I was lucky that it warmed up throughout the day, I suppose.
Once in Pembroke, I got my gear set up and passed through the mandatory gear check. For those unfamiliar with an ultra-endurance gear check, you are required to carry certain items that are for emergency situations. This one was relatively bare-bones (as compared to some of the original ones, like the Arrowhead or Tuscobia), but I still had to show a certain amount of consumable calories, reflective gear, sleeping pad and sleeping bag, along with 2L of insulated water. I brought a fire-starting kit too, just in case my situation became truly dire. I also brought along a handful of common tools for minor bike repairs. Once through the gear check, we had a brief rider's meeting that discussed etiquette, rules, and other such things, followed by a preliminary photo at the start line. Then we were sent off.
Traversing Muskrat Lake was our first obstacle, facing 11km of open, wind-blown snow. We had a rough path to follow, but it was still slow going. One of my first mistakes was to hop on the wrong snowmobile path. Once I realized my mistake, I tried running over to the correct one, but, the first step off the snowmobile track resulted in my sinking up to my thigh in snow. My summer riding shoes were, within the first 30 minutes, already wet. Great. On top of this, it was bright – I mean very bright. All that snow acts as a great reflector and all 5 million lumens were bouncing directly into my retinas. My glasses had frozen up almost immediately, so I rode most of the day without them. In retrospect, snow-blindness was a legitimate possibility.
After a 1.5-hour slog along the lake, I reached the end and started heading up a twisty mountain road. It was a surprisingly nice 2km climb, given the previous terrain I had faced. After a short while on some roads, we turned onto some snowmobile trails, which by this time were starting to soften up significantly. I found myself frequently stopping to lower my tire pressure, although I never seemed to get the traction and stability I was seeking. The snowmobile trails we were on were very flat – which I was thankful for – but were filled with long straightaways. I had much time to think and anticipate upcoming turns (music is a friend on days like these). After a few hours following the marked snowmobile trail, we continued onto an un-maintained section that tested both my technical skills and my patience. At the end of this section was the halfway point, with a small shelter, a refuel station, and some water. I took a quick look at my phone: 4 hours and 33 minutes to the halfway point. I did some quick math, and figured that if I continued at this pace I could probably get back in 9 hours, maybe 9 and a half if I slowed in the second half. After a quick refuel and layer change, I started heading back. I started to see other riders trickling in towards the halfway point. Some were looking incredibly strong, others looked to be having a rough go of it. I'm sure I wasn't looking to great at that point either, but it gave me an interesting game to play: who will finish? Who is going to make a late push and pass me?
After having thought through the possibilities for a few kilometers, I started to get into some soft snow that required most of my attention and energy. As I pedaled into a small snow drift, my pedals skipped to the sound of a loud "snap". Several thoughts ran through my head at that point, but as I looked down nothing appeared to be wrong. So, I continued pedaling and was fine for a while, until the "snap" happened again. At first I thought my chain had snapped. I didn't think this would be a particularly worrisome mechanical: I knew I had the tools with me and I could probably be up and running in a few short minutes. But when I looked down, my chain was still very-much intact. As it turns out, my free-hub had catastrophically failed. "F@#k" I thought, and yelled, to myself. There was no fixing this – I was stranded in the middle of nowhere, on a small snowmobile track with infrequent use. At least I had partial cell-service. In an effort to keep positive, I just kept going the way I was going anyways, hoping to find a road at some point. Besides, walking and riding on the snow is not too different. I reckon I was half as fast whilst walking.
After a couple kilometers of walking in the snow – with my feet getting colder and colder – I made it to a road with solid cell-coverage and got in touch with the event coordinator, Cam, who said he could come out and get me if it was a dire situation. After a brief rest and re-fuel, I kept walking to the pick-up point. To my surprise, Cam then offered to lend me his bike so I could at least finish the race. Apparently, I had come from the furthest and he wanted to see me finish on two wheels. Although I was feeling somewhat sorry for myself, I decided I had better accept such a gracious offer. It sounded better to finish with some dignity, rather than none! By the time I had walked to the pick-up point and had transferred some gear, two riders had passed me, with another closing the gap. I talked with the incoming rider and we decided that we would ride together as I got back into the swing of riding (and not walking). By this point, the light was starting to fade, so we wanted to get to the lake as quick as possible. 'Quick' is a relative term after 9.5 hours in the saddle… When we got the lake, it was basically dark, so we strapped on our lights, grabbed a drink of water and a quick snack, and headed out. The fading light and dropping temperature helped to firm up the snow, to which we were both thankful. By this point the hot packs in my shoes were no longer even remotely warm, and my feet were feeling more like blocks than anything. As we neared the finish, my riding company was kind enough to let me cross the line ahead of him – not sure if it was his deliriousness from the race or his laid back attitude – but for all intents and purposes, we finished at the same time. After almost 11 hours of racing – if it is still called racing at such an oddly slow pace – my day was done. A wild, epic, and interesting event that taught me lots about ultra-endurance bike setup, emergency preparedness, and keeping a level head in less than ideal situations. For those considering pushing their limits, both physical and mental, this event is for you. The second installment of the Wendigo will take place February 11, 2017.
Great write up @jackpadega It's great to see these ultras growing in Ontario, which is so well suited for this sort of event. Big thanks also to @cameron_dube for his work with BORCA as well as his efforts in this killer event. Well done lads!


text:
Burriana (cooficialmente en valenciano Borriana) es un municipio de la Comunidad Valenciana (España). Situado en el sureste de la provincia de Castellón, en la comarca de la Plana Baja. Cuenta con 35052 habitantes (INE 2020).

Toponimia
Burriana fue fundada por los árabes en el s. IX con el nombre de Medina Alhadra. Dado su gran número de torres (cuarenta según el historiador Rafael Martí de Viciana, posiblemente considerando las torres extramuros debido al reducido tamaño de la localidad amurallada), toma el nombre del término árabe Burj, que significa precisamente torre y del río Anna que flanquea toda la ciudad. 'Burj'+'Anna' -> Burriana.

Geografía
Se sitúa esta localidad frente a la costa del mar Mediterráneo, en la parte más llana de la comarca de la Plana Baja y rodeada de campos de naranjos.

Burriana cuenta con 15 km de costa llana, lineal y continua. La playa principal de Burriana, El Arenal (que dista 1,5 km del centro de la ciudad) es muy amplia, de arena fina y con mínima pendiente. En la zona marítima, la población aglutinada y diseminada llega a triplicarse durante el verano.
Esta zona marítima cuenta con un puerto, construido para la antigua exportación de cítricos que en la actualidad se utiliza para actividades pesqueras.

Se accede a esta población, desde Castellón de la Plana, tomando la CV-18 o la N-340.

Localidades limítrofes
El término municipal de Burriana limita con las localidades de Alquerías del Niño Perdido, Nules, Villarreal y Almazora, todas ellas de la provincia de Castellón.

Barrios y pedanías

En el término municipal de Burriana se encuentran también las siguientes unidades poblacionales:

 Alquerías Santa Bárbara.
 Alquerías Valencia.
 Poblados Marítimos.

Playas
 Playa de L'Arenal. La playa de El Arenal tiene 2000 m de longitud, 60 m de anchura media con un grado de ocupación alto y un oleaje moderado.

 Playa de la Malvarosa
 Playa del Grao

Historia

Aunque en Burriana se ha hallado vestigios de diversas civilizaciones antiguas (los cuales nutren los fondos del Museo Arqueológico Municipal, entre otros) la plenitud de la villa se sitúa en torno al , cuando se convierte en una importante plaza árabe que recibía el nombre de Medina Alhadra o Ciudad Verde, por su situación en medio de la Plana. Aquella plaza fuerte, de muralla circular fue conquistada por el rey Jaime I de Aragón en 1233. En 1348 el rey Pedro IV de Aragón concede el privilegio de que la senyera de Burriana sea acrecentada con una franja azul y tres coronas. En 1542, como consecuencia de la posición antiagermanada de los cargos públicos de Burriana, Carlos I concedió un Privilegio donde ampliaba la concesión a los sellos y escudos de la villa.

La expansión demográfica de la población obligó a derruir las murallas, que se conservaron completas hasta el . En 1901 la reina regente, en nombre del rey Alfonso XIII, le concede el título de ciudad.

Demografía
Con 35 052 habitantes (INE 2019), Burriana es la tercera localidad de la provincia de Castellón por población.

En el núcleo de las Poblados Marítimos, la población aglutinada y diseminada es importante, llegando a alcanzar de forma permanente más de 4000 residentes durante todo el año; y durante la época estival, su población llega a triplicarse gracias al referente turístico que supone para las poblaciones limítrofes.

En los últimos años, Burriana ha experimentado un fuerte crecimiento demográfico en gran parte debido a la inmigración extranjera. La siguiente tabla muestra el devenir histórico de la población del municipio a lo largo de la época estadística:

Economía
Su economía está basada en la agricultura, predominando el cultivo del naranjo. La industria principal es la dedicada a la manipulación y transformación de cítricos.

Administración y política

Patrimonio

Monumentos religiosos
 Iglesia Parroquial, Basílica de El Salvador Del  data esta iglesia, cuyo ábside es de estilo gótico primitivo, con elementos románicos; posteriormente, en el , se levantó la torre campanario. A la nave gótica, durante el  (1762) se adosó la Capella de la Comunió, decorada con frescos de J. Vergara. Todo el conjunto, convenientemente repristinado, fue declarado, en 1969, Monumento Histórico Artístico Nacional. El 17 de mayo de 2013 la Iglesia de El Salvador fue elevada al rango de Basílica Menor.
 Campanario de Burriana El Campanar de Burriana se construyó a mediados del , siendo su autor el maestro cantero Bertomeu Bataller. Fue construido como torre fortificada del Palacio Municipal o casa de la Vila. La función del campanar no era solamente defensiva sino también torre de comunicaciones y reloj público. En la Guerra Civil fue dinamitado y destruido con 32 cajas de dinamita, siendo su autor en la reconstrucción el arquitecto valenciano Enrique Pecourt Betés.
 Ex-convento de la Merced

Monumentos civiles

Torre Vigía
Torre del mar Junto a la desembocadura del río Ana, destaca por encontrarse en un enclave privilegiado en las proximidades del Clot de la Mare de Déu.
 Yacimiento Fenicio de Vinarragell
 Torre Tadeo
 Alquería de Carabona.Conjunto de alquerías del que solo queda una casa-torre bien conservada data de época romana. Junto a estas alquerías se estableció el ejército del rey Jaime I para conquistar Burriana allá por el año 1233 y cortar el suministro de los árabes procedente de Valencia. Está situada en un enclave entre la autopista AP 7 y la Ctra. de Nules al sur de la ciudad.
 Conjunto Histórico de Burriana

Otros
 Casas modernistas Es de interés visitar las casas particulares de estilo modernista valenciano por toda la ciudad (calle San Vicente, El Barranquet, etc) que datan de principios del .
 Círculo Frutero Burrianense: Posiblemente el edificio más destacado del modernismo en Burriana.
 Museo de la Naranja: situado en un destacado edificio modernista de Burriana.
 El Clot de la Mare de Déu: Zona de humedales en la desembocadura del río Anna que aloja diversas especies de aves acuáticas.
 Puerto de Burriana: La construcción de este fue motivada por el importante auge de la industria de la naranja en toda la zona geográfica de la Plana. Cuenta con dos clubes náuticos, Club Náutico de Burriana y la nueva Burriana Nova Marina, adyacente. Club Náutico.
 Escola de la Mar de Burriana Una escuela de navegación a vela que cuenta con una infraestructura completa y con cerca de un cuarto de siglo de experiencia a sus espaldas.

Cultura

Museos
 Centro de Arqueología Subacuática Se dedica al conocimiento, conservación y divulgación del patrimonio arqueológico subacuático de la Comunidad Valenciana. Cuenta con unas instalaciones idóneas para llevar a cabo tanto trabajos de investigación subacuáticas, como las de laboratorio y tratamiento de los restos arqueológicos procedentes del agua.
 Museo Archivo de la Naranja Museo único de estas características de Europa, dedicado a conservar y dar a conocer la historia de la economía citrícola valenciana y española. Dispone de un completo Centro de Documentación (que recoge más de 6000 documentos clasificados por temas), una extensa colección de más de 5000 marcas naranjeras, una colección de más de 1000 fotografías y numerosos ejemplares de papeles de seda.
 Museo Arqueológico Municipal Fundado en 1967. En sus salas se recoge la prehistoria de la comarca, desde el Mesolítico hasta la Edad Media. Del  destaca el bronce pleno del dios Hermes; de la cultura ibérica las inscripciones sobre largas láminas de plomo procedentes de la necrópolis de Orleyl y El Solaig, al Eneolítico pertenece un gran ídolo encontrado en Artana; y al Neolítico el registro procedente del primer dolmen hallado en la Comunidad Valenciana.

Fiestas

 San Blas Su patrón es San Blas y celebran su festividad el 3 de febrero.
Virgen de la Misericordia Mientras que su patrona es la Virgen de la Misericordia, en cuyo honor se celebra una semana de festejos a principios de septiembre.
 Fallas de BurrianaTambién se celebran las tradicionales fallas de la Comunidad Valenciana. Burriana fue la segunda localidad fallera de la provincia de Castellón, después de Castellón de La Plana, donde se plantaron fallas en 1904, 1907 y 1921. La primera falla burrianense fue plantada en la Plaza de la Mercé en 1928.
Cruces de Mayo

Gastronomía

De los platos típicos de la población destaca la paella. Carnes de caza como conejo, perdiz, y el tombet. En repostería existen las tortas de almendra y los pastissos. En Navidad es típico tomar en Noche Buena chuletas a la brasa, acompañadas con alioli y patatas fritas (aunque en algunos puntos de la ciudad ya se está perdiendo). También son típicos los coents.

Personas destacadas

Véase también

Referencias

Enlaces externos

 Ayuntamiento de Burriana
 Banco de Datos Municipal en ARGOS; Ficha municipal en IVE;  en CIVIS.
 Federación Valenciana de Municipios y Provincias - Guía Turística De donde se ha extraído información con su consentimiento.
 Marcha oficial de la ciudad según el acuerdo municipal de 1915

Plana Baja

redpajama_set_name: RedPajamaWikipedia


text:
FARM CAMPS
2020 WINTER FARM CAMP
2020 WINTER FARM CAMP BROCHURE (PDF)
ONLINE REGISTRATION -WINTER FARM CAMP
HEALTH FORM (PDF)
2020 SPRING FARM CAMP
2020 SPRING FARM CAMP BROCHURE (PDF)
ONLINE REGISTRATION – SPRING FARM CAMP
REGISTRATION FORM (PDF)
2020 SUMMER FARM CAMP
2020 BROCHURE (PDF)
ONLINE REGISTRATION – 2020 SUMMER FARM CAMP
FINANCIAL AID APPLICATION (PDF)
2020 T-Shirt Contest
Junior Counselor in Training (JCIT)
2020 Summer Camp – Job Opportunity
Adult & Family
Farm Birthday Parties (Inquire here)
CASSIDY'S KITCHEN
Enroll Soon!
HomeCASSIDY'S KITCHEN
In May, 2016, seven months after the first boards were painted blue by volunteers at Hart to Hart Farm and Education Center in Albion, Maine, the community came together to honor Cassidy with a dedication and official opening of Cassidy's Kitchen.
Cassidy attended Hart to Hart Farm Camp for seven summers as a youth, where she "adopted" and cared for sheep, goats, piglets and calves and enjoyed learning about life on a working farm. In her memory, owner s Doug and Linda Hartkopf, and over 100 people in the community, came together on October 11, 2015 (the one-year mark of her passing) to build a three-season, fully functional kitchen to be used for educational programming for campers and adults.
Farm owner Linda Hartkopf called the creation of Cassidy's Kitchen "a true labor of love" for so many people affected by Cassidy's passing, "This is the "something I can do" that everyone reaches for to honor Cass and support her family. We are so grateful to everyone who contributed time and resources to make Cassidy's Kitchen a reality. They are all part of Cassidy's legacy of giving back and spreading kindness, " she said.
Farm Camp was a special place for Cassidy and her brother Colby. It fostered their love and respect for animals, and for hardworking people, like the Hartkopfs, who make agriculture their life's work. There were many summer camp options, but when asked if Cass had to choose just one, without hesitation, it was always Farm Camp!
The 376 square-foot structure cost about $10,400 in materials to build. People in the community raised all of that, plus provided additional in-kind gifts, like appliances, tables, windows and lighting, totaling over $6,000. The greatest gifts, were the endless hours of volunteer time. While a bulk of the initial work was accomplished on Oct. 11, 2015, volunteers worked tirelessly on weekends, holidays and evenings to do the finish carpentry work, install electricity and appliances and put the final touches on the building before the celebration in 2016.
The kitchen that love built. Her light will Shine on forever in Cassidy's Kitchen.
The Foundation is honored to award a ShineOnCass Farm Camp Scholarship each year in memory of Dylan Hartkopf, son of Doug and Linda Hartkopf, who lost his battled with addiction in 2017. Each year, the Foundation provides the experience of a week at Farm Camp to a child with a family member facing addiction.
For information about applying for this scholarship, please contact Shine On Cass Foundation.
Cassidy Charette
LATEST CASSIDY'S KITCHEN NEWS
Community Celebrates Completion of Cassidy's Kitchen at Hart to Hart Farm in Albion (WGME ARTICLE)
"Cassidy Charette was a 17-year-old Messalonskee High School student when she tragically lost her life in a hayride accident on Oct. 11, 2014. Since then, her community is making it clear that she is not forgotten through multiple fundraisers, awards, dedications and fundraising nearly $200,000 for charitable organizations. Charette attended Hart to Hart Farm Camp […]
Albion summer camp plans building to honor Cassidy Charette (Central Maine Article)
The Oakland teen spent six summers at the farm and her mother says it was one of her favorite places. ALBION — For six summers, Cassidy Charette joined other boys and girls for a day camp held at a small dairy farm nestled among hills and fields in south Albion. The farm, owned by the […]
We are a family owned and operated organic dairy farm located in the gently rolling hills of Albion, Maine. Our Farm offers a variety of educational programs and quality dairy produces.
info@hart2hartfarm.org
Hart to Hart Farm © 2017 All Rights Reserved Terms of Use and Privacy Policy

redpajama_set_name: RedPajamaCommonCrawl


Thinking about the bathroom, and how it integrates with our homes and lives was the basis of the project. The quest was to understand the bathrooms that will fit into today's lifestyle where space and water are a luxury.
The product integrates the bathroom into one single unit. We have questioned the existing parameters of bathroom use and tried to incorporate all the functions in the lowest possible denomination. It cleverly combines the various functions of a bathroom i.e. shower, wash, water closet into one single unit.
The general idea behind this concept was to create a product that is versatile for bathrooms in today's lifestyle. In a world where space is at a premium and water is scarce with our project we wish to provide the desired comfort, flexibility of space and ease of installation.
Being a compact system its potential is for the future congested urban areas .Also disaster struck areas can benefit from it as it is quiet portable. Taking this idea further the system can be developed into modular units that can be customised to the user needs. For example, in aeroplanes one may not require a shower tray but may require a bigger storage tank or in public toilets the water closet could be replaced with simple urinals. The possibilities are endless.


text:
About Sri Lanka
Visa to Sri Lanka
Religion in Sri Lanka
Ancient Cities
Kurunegala, Yapahuwa and Kalawewa
Esala Perahera Festival
Vesak Festival
Must Do's
Consumer Fairs
Best of Sri Lanka
Anantara Peace Haven Tangalle
Wild Coast Tented Lodge
MICE Venues
Home>Latest Travel News>WTTC Global Summit Hears Praise for Private Sector's United Approach
WTTC Global Summit Hears Praise for Private Sector's United Approach
Cancun, Quintana Roo, Mexico, April 27, 2021 / TRAVELINDEX / World Travel & Tourism Council President and CEO Gloria Guevara praised the Travel & Tourism private sector for its steadfast and united approach during the Covid-19 pandemic and said together they would lead the way for the sector's recovery.
Gloria Guevara's praise came in her opening speech before delegates at the World Travel & Tourism Council's Global Summit which opened today in Cancun Mexico.
The Global Summit is the most important Travel & Tourism event for the private sector and is the world's first major gathering of world tourism leaders since the outbreak of the pandemic.
Hundreds of CEOs, business leaders and tourism ministers gathered in Cancun for the first time in nearly a year – with thousands more participating virtually – in the hybrid event.
The World Travel & Tourism Council (WTTC), which represents the global Travel & Tourism private sector, has been at the forefront of global efforts to restore safe international travel in the COVID-19 era.
In her speech, Guevara also focused on the terrible human impact of the pandemic and travel restrictions which had devastated the sector and the lives and livelihoods of hundreds of millions of people around the world; people who depend on Travel & Tourism to survive, to provide for their families.
Among these were the disproportionate number of women who had been hit hard by the pandemic. Women account for 54% of the sector's employment, which is why WTTC had chosen Cancun to launch its Women's Initiative, focusing on policies which can help empower women.
Gloria Guevara, WTTC President & CEO said in her opening comments to the delegation: "While 2020 was not the year we expected it to be, it was a year during which people really came together. We saw our sector join forces to support our workforce and the local communities that host us.
"From using our facilities as emergency hospitals and offering hotel rooms to doctors and nurses; to providing free meals to millions and transforming convention centres in medical facilities. We have seen an amazing response.
"One thing has been clear, our Members, the leaders and captains of our sector have truly stepped up; I am very proud. I have learned through their example that leadership matters, especially during such difficult times.
"What is clear is that we are not going back to 2019; we are moving forward. Travel & Tourism will come out of this crisis stronger and better. But to do so, it is crucial we continue working together to achieve recovery both financially and socially. We need to be united.
"That is why we have chosen our theme for this year: Uniting the World for Recovery. By turning this crisis into an opportunity, we can make sure we become more inclusive and more sustainable.
"As we accelerate our recovery, we need to redouble our efforts to remove barriers to mobility, remove quarantines, focus on testing and accelerate the vaccination rollout globally, while continuing to support safety protocols.
"Our sector is one that provides opportunities, reduces poverty, brings hope, and not only changes lives, but changes the world. This is the beginning of a new chapter, the beginning of the recovery. We have much work to do and if we are united we can change the lives of the millions that depend on us."
During her speech, Gloria reminded delegates of the steady stream of initiatives which WTTC had taken during the pandemic to protect the sector and lead the way back to recovery.
Thanks to its knowledge of its Members and the expertise of public health leaders, WTTC created the Safe Travels Global Protocols & the Stamp to learn from past pandemics and create consistency for the sector and reassurance for travellers. Over 260 destinations have recognised the stamp so far, including Cancun.
WTTC also engaged with more than 150 governments to advocate for policies and measures which would protect and ensure the survival of the global Travel & Tourism sector and its workforce.
The global tourism body also participated in a historic G20 Tourism official meeting and presented an ambitious plan to recover 100 million jobs. For the first time the importance of the private sector in Travel & Tourism was included in the leaders' declaration.
WTTC's 2021 Economic Impact Research shows that in 2020, the global Travel & Tourism sector lost almost USD$4.5 trillion dollars with over 62 million jobs lost. Its GDP contribution fell to USD$4.7 trillion in 2020 from nearly US$ 9.2 trillion the previous year, a decrease of 49%.
The sector's contribution to the global economy decreased from 10.4% to just 5.5% last year. Leisure spending decreased by 49.4% while business spending by 61%. The pandemic crisis was 18 times bigger than the global financial crisis of 2008.
Gloria Guevara closed the session by concluding that while WTTC's agenda has evolved, it remains aligned with the priorities it had set before the crisis. For years, it has been working on improving the seamless traveller journey enabled by technology such as biometrics.
She also thanked Governor of Quintana Roo, Carlos Joaquín González, and Jose Chapur, the owner of Palace Resorts for hosting the WTTC Global Summit.
IATA Interactive Map Gives Travelers Latest COVID-19 Restrictions
UNWTO to Hold Emergency General Assembly on Russian Membership
SUNx Malta Launches World's First Climate Friendly Travel Diploma
Radisson Hotel Group Opens 14th South African Property in Durban
Enjoy Ultimate Shopping Experience Anytime Anywhere with OneSiam
Copyright © 2023 TourismSriLanka.org and Travelindex. All Rights Reserved
Thank you for your subscription. Please check your inbox.


Creative Comfort Crafter's Comfort Gloves are suitable for the relief of arthritis, hand pain and swelling and cold hands.
Key Benefits: Provides mild compression and warmth, support to control swelling. Open fingertips allow freedom to feel and grip. Soft cotton/Lycra allows skin to breath and keeps hands dry. Comfortable enough to wear all day and all night. Sold in pairs.
Grab A Roos Gloves are for quilting, sewing, scrapbooking and crafting but commonly used for by a va..


For sale: 2006 Bear Creek MK, weissenborn style guitar, $3000. This exceptional guitar was made on Maui by Bill Hardin. It is all koa wood, has waverly tuners, and is equipped with an LR Baggs sound hole pickup that sounds great when plugged in; this guitar is in excellent shape. It comes with a nice Ameritage hard shell case. This guitar has a hollow neck and is made to be played lap style. It has a wonderful sound and plays great. I will throw in extra stings as well. This guitar with pickup and case will cost you much more than this.
Check out this tasty version of the Lead Belly classic, Goodnight Irene by Englishman Martin Harley which was released last Fall on his CD 'Live At Southern Ground.' it's just Martin on a weissie and vocals with superb bassist Daniel Kimbro who I have seen play a couple times as a sometime member of the Jerry Douglas Band. The CD was recorded in Nashville.
Interesting capo, has some of the properties of the Shubb resonator capo, looks kind of home made.


Rite Aid Corporation (NYSE:RAD) under comprehensive financial analysis presented as an active mover. Shares collapsed -3.77% to trade at $4.85 in recent trading session. The firm has floated short ration of 3.60%, hold to candle to sentiment indicator of Short Ratio, which was 1.43.
The firm price to earnings ratio calculated as 56.40. The co stands at price to sale ratio of 0.16 that signifies the value placed on each dollar of a firm's sales or incomes; it is most relevant ratio to compare companies in similar sector. It has price to book ratio of 7.82, which gauges the market price of a share over its book value.
The RAD held a rough session during the week but was ready to get some critical analysis. The stock was assessed by a pool of analysts at WSJ and came out with some serious outcomes not to be avoided before making investment. The RAD ratings chart showed that 5 gave HOLD ratings for the current month as 1 analyst opting for Overweight option for same period. For stocks' current month, 3 analysts opted for BUY ratings. The stock price target chart showed average price target of 6.54 as compared to current price of 4.85.
Taking look on per share earnings estimates, its next year first quarter current estimate trend for EPS was for $-0.01 and on annual basis FY 2016 estimate trends at current was for $0.05 as compared to one month ago of $0.09, and for next year per share earnings estimates have $0.02.
Rite Aid Corporation (NYSE:RAD) need to consider for profitability analysis, the firm has profit margin of positive 0.30% to find consistent trends in a firm's earnings. Gross profit margin and operating profit margin calculated as 23.80% and 1.70% respectively. RAD has returns on investment of 8.20%. The returns on assets were 0.80% that gives an idea about how efficient management is at using its assets to generate earnings. It has returns on equity of 14.90%, which is measuring profitability by disclosing how much profit generates by RAD with the shareholders' money.
The firm attains analyst recommendation of 2.60 on scale of 1-5. The co has price volatility of 5.87% for a week and 4.30% for a month. Narrow down focus to firm performance, its weekly performance was 0.41% and monthly performance was -16.23%. The stock price of RAD is moving down from its 20 days moving average with -10.75% and isolated negatively from 50 days moving average with -23.13%.
Rite Aid Corporation (NYSE:RAD) current ratio calculated as 1.60, this value is acceptable if it lies in 1.3% to 3%. But it varies industry to industry. To strengthen these views, active industry firm has Quick Ratio of 0.70, which indicates firm has sufficient short-term assets to cover its immediate liabilities. In addition, the firm has debt to equity ratio of 11.26, sometimes it remain same with long term debt to equity ratio.


text:
Start Over You searched for: Issue Dates January 1955 ✖Remove constraint Issue Dates: January 1955
1. 4261. Misbranding of vaginal suppositories. U. S. v. 138 Boxes (and 1 other seizure action).
Dr. J. A. McGill Co., from Chicago, Ill.
2. 4262. Misbranding of thyroid tablets, Seconal Sodium capsules, capsules containing a mixture of Seconal Sodium and Amytal Sodium, and capsules containing a mixture of extract of ergot, apiol, and oil of savin in a vehicle of castor oil. U. S. v. Center Drug Store of Durham, Inc., David G. Ridenhour, Verne D. Lea, and William A. Burwell. Pleas of guilty. Fine of $500 and probation for 2 years against corporation and $500 and probation for 2 years against Defendant Ridenhour; fine of $250 against Defendant Lea and $250 against Defendant Burwell.
Center Drug Store of Durham, Inc., Durham, N. C, David G. Ridenhour, secretary-treasurer and manager of the corporation, and Verne D. Lea and William A. Burwell, pharmacists for the corporation.
3. 4263. Misbranding of laxative herb tablets. U. S. v. 2 Drums, etc.
Robin Pharmacal Corp., from Brooklyn, N. Y.
4. 4264. Misbranding of phenobarbital tablets, thyroid tablets, anhydrohydroxy progesterone tablets, dextro-amphetamine sulfate tablets, and tablets containing a mixture of mannitol hexanitrate and phenobarbital. U. S. v. Ken Reynolds Pharmacies, Inc., Kenneth R. Reynolds, and Walter J. Foohy. Pleas of nolo contendere. Fine of $300 against corporation and $250 against Kenneth R. Reynolds, plus costs. Sentence suspended against Walter J. Foohy.
Ken Reynolds Pharmacies, Inc., Joplin, Mo., Kenneth R. Reynolds, president, and Walter J. Foohy, a pharmacist for the corporation.
5. 4265. Misbranding of quinine sulfate tablets and Chlorbrom syrup (bromide sedative). U. S. v. Chase Chemical Co. and Sydney Chasman. Plea of guilty entered by company to 5 counts of information; plea of guilty entered by individual to 1 count. Fine of $500 against each defendant.
Chase Chemical Co., a corporation, Newark, N. J., and Sydney Chasman, president of the corporation.
6. 4266. Adulteration of dextroamphetamine sulfate tablets. U. S. v. Ross-Whitney Corp. (Heart Pharmaceutical Co. of California), Louis M. Mills, and Robert C. Whitney. Pleas of nolo contendere. Fine of $200 against corporation and $100 against each individual.
Boss-Whitney Corp., trading as the Heart Pharmaceutical Co. of California, Los Angeles, Calif., Louis M. Mills, president, and Robert C. Whitney, secretary-treasurer of the corporation.
7. 4267. Adulteration and misbranding of ear drops and misbranding of Vita-Malt nose drops, aluminum hydroxide gel, pyrilamine maleate liquid, and pyrilamine maleate tablets. U. S. v. Kimball Drug Co. (Kimball Wholesale Drug Co.), and Horace W. Kimball. Pleas of nolo contendere. Fine of $200 against individual; imposition of sentence against corporation suspended.
Kimball Drug Co., a corporation trading as the Kimball Wholesale Drug Co., Phoenix, Ariz., and Horace W. Kimball, president of the corporation.
8. 4268. Adulteration and misbranding of Livo Ferrum capsules. U. S. v. 2 Drums, etc.
Bergen Pharmacal Co., Inc., from Jersey City, N. J.
9. 4269. Adulteration and misbranding of Hemate Formula tablets. U. S. v. 32 Bottles, etc.
Hemate Products, from New York, N. Y.
10. 4270. Adulteration and misbranding of a vitamin preparation. U. S. v. 140 Bottles.
Drugs and Devices, 1940-196320
21001. Adulteration and misbranding of bread. U. S. v. Bon Ton, Inc., of Billings. Plea of nolo contendere. Imposition of sentence suspended and defendant placed on probation for 1 year.1
21002. Adulteration and misbranding of bread. U. S. v. Bon Ton, Inc., of Missoula. Plea of nolo contendere. Imposition of sentence suspended and defendant placed on probation for 1 year.1
21003. Adulteration of flour. U. S. v. 106 Bags (and 1 other seizure action).1
21004. Adulteration of flour. U. S. v. 58 Bags, etc.1
Seacoast Oyster Co., Inc.3
Beatrice Foods Co.2
Blumenthal Bros. Chocolate Co.2
Bon Ton, Inc.2
Hershey Wholesale Grocery Co.2
canned tomatoes5
crabmeat5
olives and sweet peppers4
January 1955✖[remove]120
Western District of New York8
District of New Jersey7
Southern District of New York6
Western District of Missouri6
District of Kansas5


At Social Domains we realise that there is no point in commissioning a brand new website if no one can find it. The whole purpose of getting a website is to gain exposure on the internet and therefore attract customers to your business.
Not many people go past the first two pages of Google search results when searching on the internet; it is imperative, therefore, to achieve the best rankings possible to attract as many customers searching for what you do. The problem is how to get there, quickly, efficiently and at a reasonable price that is not going to break the bank. At Social Domains, our trained SEO advisors are able to offer you several different ways to get you company at the top of the search engines at a cost effective way!
SEO is the process of getting websites found in the "natural" or "organic" search results and can include factors such as image search, local / national search, video search or academic search. "Natural" or "organic" SEO consists of websites coming up naturally on the internet when customers type into the search engines specific keywords and phrases.
At Social Domains, our natural SEO specialists are able to get the website we will build for you found on all major search engines including Google, Yahoo, MSN and Bing. Already have a website and wish to get that found? Our specialists are able to help with monthly link-building campaigns and will actively use push marketing techniques to promote your existing site via link-building forums, link farms, directories, hubs, blogs, social bookmarks and merit-based link-building.
PPC or Google AdWords is the process of getting websites found in the sponsored listings at the top or right hand side of the search results when your keywords and phrases are typed into the search engines. You set your keywords and phrases and set your monthly fee according to what you would like to spend.
The difference between PPC and SEO is that PPC is guaranteed to get you on the first page of the search engines, whereas there are no guarantees with natural SEO. PPC can be set up within days whereas natural SEO can take months and months; on the flip side, natural SEO could save you lots of money in the future and some customers are more inclined to use websites on the natural listings than sponsored listings. For the best results, please contact our trained advisors and we can build you a campaign that not only suits your needs, but will also suit your budget!
Mis-spellings: if your domain is plumberslancashire.com, how about registering plumverslancashire.com to catch people making typos?
In 2010 this domain name was purchased for $35.6 million.
This domain name was bought for $35 million in 2007.
This domain name was bought for $650,000 in 2007.
In 209 this domain name was purchased for £600,000.
2013 saw the purchase of webhosting.co.uk for £323,225.
Also beware hidden factors like site content, sources of web traffic, PPCtraffic, and subsequent rates.


text:
Singapore Premier League to stream all matches online after successful trial
By Shawn Lim-20 February 2019 06:19am
SPL trialed streaming in 2018 and claims it received a total of 1.17 million views. Photo: SPL.
The Singapore Premier League (SPL) will stream all 126 of its matches online live for its 2019 season.
Singapore's professional football league trialed streaming in 2018 and claims it received a total of 1.17 million views for the 98 matches that were streamed.
The figures have led to the Football Association of Singapore, the governing body of the SPL, deciding to expand the SPL's online live coverage this year.
According to Yahoo, FAS general secretary Yazeen Buhari said live streaming a cheaper option than TV broadcasts and that people preferred to watch the live matches on mobile devices.
"We are planning enhancements to the viewing experience with additional previews and half-time shows, as compared to just straightforward live-streaming last season," he said.
Streaming is part of FAS's plan to revive the sluggish fortunes of the SPL, which has seen attendance at live games drop over the years. It rebranded the SPL last year with a focus on youth development for all local clubs, with a new name and a new logo for the league.
FAS claimed the changes have seen a slight improvement in attendances from 900 in 2017 to about 1,800 in 2018.
This year, in addition to streaming, it hopes to continue to improve fan experiences by consolidating the stadiums of all eight Singapore-based SPL clubs, with two teams sharing four stadiums for the first time in the league history.
The shared stadiums will be upgraded sound systems, individual seats for all spectators, and bigger Jumbotrons and LED billboards all around the venues.
Twitter and football news website Goal recently collaborated to broadcast the UEFA Champions League (UCL) to select Twitter users in South East Asia.
Four key UCL Round of 16 matches including Liverpool vs Bayern Munich on February 20 and Paris Saint-Germain v Manchester United on March 7 will be streamed live via Goal Thailand Twitter account to Twitter users in Thailand, the Philippines, Cambodia and Laos.
This is part of the social media platform's attempt to cement its position as live sports content provider in Asia, as it previously told The Drum.
This article is about: Singapore, Live Streaming, Football, Advertising, Digital Advertising, Entertainment, Events, Marketing, Media, Mobile, Social Media, Digital, Brand


Exactly What and Where is the Universe?
Quantum revelations and recent cosmological discoveries have led us to completely new understandings of the universe. Astronomer and author Bob Berman explores these new ideas, including the nature of "empty space," the non-reality of time, the curious inter-relationship between the observer and nature and what it really means if the universe is indeed infinite.


text:
gold traders fearless in the face of terrorism
Gold speculators are showing ISIS that they are fearless sending the precious metal down another $3 in the Asian session to trade at 1065.60. Traders are counting down the days to the Federal Reserve meeting in December. Members continue on the speaking circuit telegraphing the Fed position. Gold which is a safe haven and usually gains during global political stress has been moving just the opposite. Last evening German authorities canceled a highly anticipated soccer game between the German and Netherlands national teams less than two hours before it was to start because of a security threat.
A security official said the decision was made because of a "concrete threat." Elite tactical police units were on the scene in Hannover, the official said. The Hannover police chief said authorities feared that a bomb would be set off inside the stadium. Officials had decided against canceling Tuesday's match despite terrorism fears in the wake of the Paris attacks, some of which took place outside a Germany-France soccer friendly. Chancellor Angela Merkel and other top German officials were to attend Tuesday's game.
As the initial shock of the attacks abated, investors once again focused their attention on the prospect of diverging monetary policy, with the United States set to tighten and the euro zone expected to loosen policy. That has led to gains in the dollar, which hit a seven- month high against the euro on Tuesday.
"We believe that gold will face further headwinds in the next few weeks as an extension of euro zone quantitative easing is announced in December, thus pushing up the dollar against the euro and other major currencies, and as the market fully prices in a mid-December Fed rate rise," Mitsubishi said in a note.
Among other precious metals, silver was down 0.1 percent at $14.10, platinum tumbled $6.95 to $848.20 an ounce, and palladium was down 1.2 percent at $540.15 an ounce. Platinum snapped 12 days of losses on Monday to edge higher, but remains near that day's near seven-year low of $851 an ounce.
Lackluster physical gold demand from India, a top consumer, during the peak festival season this month also contributed to a bearish outlook. Chinese jewelry retailers have also warned of a tough period ahead, notwithstanding a pick-up in sales since July. Two years ago China imported 1,507 tonnes in standard gold bars. According to my estimates China is on track to import 1,400 tonnes in 2015. This year's SGE withdrawals can have been supplied by more recycled gold than in 2013 that in part replaces gold import. SGE withdrawals can only be supplied by domestically mined gold, imported gold or recycled gold. Because China is one of the few countries that doesn't disclose its gold trade data analysts must estimate Chinese gold import from data provided by gold exporters such as the UK, Switzerland, Hong Kong and Australia. Their foreign trade statistics show China has net imported more than 1,032 tonnes of gold in the first three quarters of 2015. In addition, Chinese domestic mining output has been 357 tonnes, according to the China Gold Association, which is prohibited from being exported.
What is the RBOB/ Brent Crack Spread and How is it Used in Energy Trading?


text:
Armenia's Nikol Pashinyan derails "the Armenian project of Russian empire"
The prime minister of Armenia has not only disrupted the whole negotiation process with Azerbaijan, but at the same time "the Armenian project of Russian empire" writes Vusal Mammadov for EUToday.
In a previous article I explained how prime minister of Armenia Nikol Pashinyan has managed to spoil bilateral relations with the EU, as well as with the U.S., thereby destroying the very nature of Armenia's relationship with Russia and Iran. I know, it is actually very hard to imagine, but Pashinyan succeeded.
As a result of above mentioned factors and victories of the army of Azerbaijan now there are creating new geopolitical realities around Armenia. Armenia loses its geopolitical attractiveness. Russia changes "the rules of the game". Is the sovereignty of the Armenian state still necessary?
Recently, we have often heard such questions from the "unofficial and freelance Kremlin spokesmen" such as Vladimir Zhirinovsky, who hints at Armenia being a part of Russia.
This is due to the fact that Russia is tired of patronising and constantly feeding its "strategic partner", which it once envisioned as a defender of its geopolitical borders, with free weapons.
It turns out that this unprofitable partner is not only unable to fight on the battlefield, but also plays games with the Kremlin looking for new owners. But Pashinyan, according to the potential of Armenia, can offer nothing to his possible new owners except enmity against the Turks, referring to so-called "Armenian genocide."
Geopolitical realities suggest that nothing has changed after the First World War, which means that the USA, Great Britain and France are still not interested in joining into the political palette of South Caucasus, and non-officially consider this region as a zone of Russian influence. Therefore, no single one of these countries is going to act as a guarantor of Armenia's sovereignty, because Armenia has nothing to offer to the world economy and politics. On the other hand the country's hostile behaviour against Azerbaijan and Turkey has led to the isolation of Armenia from the transport bridge which is now connecting Asia and Europe.
Now, during the military operations of the Azerbaijani army, which fulfils the resolutions of U.N. Security Council, the Armenian military-political leadership once again turns to provocations, targeting the pipelines which are actively contributing to the energy security of Europe. In this way Armenia attempts to involve others, such as Russia and Turkey, in order to destabilise the situation in the Caucasus region, and to destroy important regional projects, such as South Gas Corridor which is so important to the EU.
Armenian people could possibly forgive Mr.Pashinyan if only these outrages and the consequences of his shameful international diplomacy would remain outside of his state. But we are witnessing that he is brazenly lying to his people daily in order to absolve himself of personal responsibility for the results of his fatal mistakes.
Considering these factors we can come to the following conclusions:
"The Armenian project" of the Russian empire is going to collapse, as Russia now considers Armenia too weak and unreliable a partner, and now the political, economic and military power of Azerbaijan as well as the reliability and political weight of its leader Ilham Aliyev in the international arena seems more attractive for Russia from the point of new geopolitical challenges:
The Armenian people will very soon understand the catastrophe Pashinyan has brought upon them. In order to get rid of provocative political leadership and the loss of fundamentals of state sovereignty, Armenian people should understand they do not need to be a pawn of the Kremlin if they truly wish to keep their independence. Armenians should change their attitude to the political existence of their country, and then try to build honest and human relations with Azerbaijan and Turkey in order not to lose their chance to be a part of civil society within the region.
Bright minds and patriotic Armenians should think about the future of their people and state, and in this case to the power in Armenia have to come politics who will explain to their people that there is no other salvation, except the returning of the occupied lands to Azerbaijan, because Pashinyan is unable to admit his mistakes and Azerbaijani people will never accept his apologies.
EUToday Correspondents
Our team of independent correspondents, based across Europe and beyond, are at the centre of geopolitical dynamics. We are united by our commitment to free and unbiased journalism, and our devotion to the concept of true and unfettered democracy. We take our job very seriously!