text:
Home Game Reviews Terra Nova Review
Andy Schwarz
Review of: Terra Nova
Board Game Review by: :
Reviewed by: Andy Schwarz
We review Terra Nova, a lighter version of the classic game Terra Mystica. Published by Capstone Games, Terra Nova seeks to distill the Terra Mystica experience down to its essence.
Terra Nova is an ostensibly new game from Captone Games (and venerable German publishing house KOSMOS in Europe). Authorship is credited to Andreas Faul, but a huge debt of the content is owed to the original creators of Terra Mystica, Helge Ostertag and Jens Drögemüller, because Terra Nova is not so much a truly new game as an example of asking "what if we shaved off all the rococo ornamentation from Terra Mystica so that the game could be taught in 10 minutes and everyone could just dive in?" Which is how Terra Nova saved my Terra Mystica experience from a perpetual state of "gosh, I sure wish I could learn to play this" and finally brought a version to the table for multiple plays of a really approachable, mid-weight Euro.
But enough about the comparisons with its sister game. Terra Nova can stand on its own as a solid, mid-weight Euro, and doesn't deserve to be thought of only as a "dumbed-down" Terra Mystica.
In Terra Nova, players work to get as much of the game's two currencies (coins and power tokens) as they can to transform the landscape into their preferred terrain type. This lets them build houses, trading posts, and fortresses, and from those components, create towns that earn sizable bonuses in currency, advancements, or pure points. Players take turns over five rounds, dropping out of each round when they run out of things they can afford to do, or perhaps earlier than that for strategic reasons. After five rounds, players receive endgame points for coins and for the relative size of their territorial reach, and a winner is crowned.
Your first game might take a while to assimilate the rules, but your second game can be finished in an hour, even with four players. It's quick enough that after you finish a game you might want to play again as a different faction, perhaps by just flipping over your faction board and trying the other faction available for each player color.
If you know Terra Mystica, this is clearly its sibling. If not, it might seem like a Catan variant before you dive in.
If you were to open the box without any Terra Mystica experience, you might be tempted to think you'd stumbled onto an alternate-reality version of Settlers of Catan. Most of the wooden pieces seem to have been repurposed from surplus pieces from that 1995 classic. The board itself is just a bunch of hexagons, though not modular like Catan. And you even start the game placing 2 of your houses in a snake draft. But after that, the game veers off so you quickly realize you're playing a much deeper game.
Once houses have been placed, players play out 5 rounds, taking turns in player order, each performing just one of a dozen or so possible actions. After each player has done one action, the cycle starts again, looping around until each player decides to pass and exit play for the round.
Two Factions per Color: Green can flip the Faeries over to play as the Druids, and Blue can flip over the Water Sprites to play as the Sea Dogs.
As players drop out, they claim the next space in turn order for next round, with the first to drop out claiming the first-player token (a 3D shovel), the next taking second position, etc. Players also swap out their current bonus token for a new token among those available, meaning each player's exit affects which bonus tokens other players can get. (As you exit, you take one bonus away, but now your recently used one becomes available for players who exit after you.)
The actions themselves are centered on the concept of building towns. A town is a string of at least four adjacent buildings, with an "emblem" value of at least 7. The houses are worth 1 emblem, trading posts are worth 2 emblems, and the fortresses are worth 4. Building a house costs 4 coins, a trading post 7 or 10 coins (plus you return a house), and a fortress 14 (plus you return a trading post), so a lot of your play focuses on getting coins to allow you to build the buildings to get the emblems to get the towns.
Each building you build also uncovers a space on your player board (a la Hansa Teutonica), unlocking future income and, for your two fortresses, a special ability. As you thus grow your footprint on the map, you're also increasing your income for future turns.
The Power Cycle: Level III power can be spent, but then moves to Level I. Tokens travel from I to II to III before being usable again.
The key rule in Terra Nova (and Terra Mystica before it) is that each player can only build on one specific terrain type. For example, Faeries have to build in forest terrain and Water Sprites must build on island terrain. This means to build a town will require you to transform at least a couple of terrain hexes into your faction's preferred color. This requires a specific action called "make habitable" but quickly everyone just referred to it as the "shovel" action because the symbol used for the action is a shovel. One shovel will transform two of the 5 types of terrain into yours, and two shovels will transform the other two, with the 5th type being pre-set for your faction's preferences. Each shovel can be had for 6 money, but shovels can also be purchased with Terra Nova's other currency, "Power."
Power is a limited resource in Terra Nova. Every player starts with 8 Power, in three states of depletion and there are detailed rules that govern how you can recharge your depleted power, but in essence, you can have between 0 and 8 of these alternative coins to spend on actions. The power action spaces are only usable once per turn, so players with high power early in a turn will race to grab the best actions, turning later to coin-based actions which are infinitely available to players who have the cash.
The game then boils down to generating the game's two currencies (coins and power), mostly by uncovering as much of your player board as you can to expose additional income icons, and then wisely turning those currencies into buildings. To guide you towards an optimal score, Terra Nova also provides 5 sources of bonus scoring, one per round, and players are wise to focus their actions on the particular outcome that generates these bonus points. One turn might award 2 points for every shovel action you perform. Another might give 5 for each time you build a fortress. This may cause a player to exit a given round earlier than normal, saving resources to spend on the following round's bonus activity.
The game plays remarkably fast once everyone gets the hang of it, though if one of your players suffers from analysis/paralysis, there is plenty to cause severe brain-lock. Short of a serious AP disaster, 4 players can work through 5 rounds in an hour and change, scoring the bulk of their points as they go, and then grabbing a few handfuls of end-of-game points for the size of their territory and for their leftover coins.
A Chip off the Old Block.
Terra Nova is less a "dumbed-down" version of Terra Mystica than an optimized version of the original: 80% of the Mystica experience in half the time and with a lot less rule overhead. Designer Andreas Faul shows us the value in taking a delicate chisel to an existing marble statue to reveal a less ornate but far more approachable work of art underneath.
Terra Nova fills a much needed niche in the spectrum of hobby games. It is a great game to help people transition from their dabbling on the fringes of the hobby and get them accustomed to the somewhat deeper waters of a solid Euro with modern mechanics and iconography. That is why I will be recommending Terra Nova to many, many people in 2023, as a Highway out of the Gateway Zone.
Theme-wise, it's not as appealing as other go-to recommendations for post-gateway exploration (Wingspan and Obsession), but in terms of providing an easily-taught, very approachable game with enough depth and replay value that experienced gamers will enjoy helping their newbie friends expand their horizons, Terra Nova is a real treat. I can't wait to find more chances to play it.
Final Score: 4 Stars – I could see it creeping up to a 4.5 with even more plays/time. But even if it doesn't, I'm already personally ready to start playing Terra Mystica online, now that the foundation of the game is finally cemented in my head. Woot woot!
• Easy to get to the table
• Accessible ruleset and quick(er) playing time
• Sure it's Terra Mystica Lite; but that's ok
• The Terra Mystica/Nova thematic universe is pretty weak sauce, all in all. So I'm what, Leprechauns? Really? Why do Leprechauns want to build trading posts?
Euro Game
Andy is an antitrust economist with a subspecialty in sports economics. Andy has served as the case manager for the NFL and for a series of plaintiffs' classes suing the NCAA. He was one of the initial sponsors of California SB206, which helped restore college athletes' name, image, and likeness rights in the state of California and launched the NIL moment. Andy's latest project has been to combine this passion for college athletes' rights with his equal love of all things Euro board gaming to create the board game Envelopes of Cash. Andy holds an M.B.A. from the Anderson School of Management at UCLA as well as an A.B. in history from Stanford University, and an M.A. in history from Johns Hopkins.


text:
class DashboardProjects < Spinach::FeatureSteps
  include SharedAuthentication
  include SharedPaths
  include SharedProject

  Then 'I should see projects list' do
    @user.authorized_projects.all.each do |project|
      page.should have_link project.name_with_namespace
    end
  end
end

redpajama_set_name: RedPajamaGithub


Bin men across the Isle of Wight have been working hard to collect waste as normal today, but the Isle of Wight Council say Friday collections may roll over to tomorrow.
Crews are still out and about collecting as much rubbish as possible from households they have not yet reached today as a result of the adverse weather.
The Isle of Wight Council say that if crews cannot get to all properties today then attempts will be made tomorrow, weather permitting, to collect.
If snow proves an obstacle tomorrow, any outstanding routes will have their waste collected on Monday.


TVS XL 100 on-road price in Gumla - ₹ 44,588 onwards. It is available in 1 version and 6 colors. XL 100 is sold by 1 dealership in Gumla. All the colour options and versions of XL 100 might not be available at all the dealerships in Gumla.
You are currently viewing price of TVS XL 100 in Gumla. Not from Gumla? Select your city to see price in your city.


we have turned on many souls to the allure and lifestyle we call multisport.
I have spent a large part of my life seeking knowledge to gain an edge for myself, and my clients, in the pursuit of greater performance. For each and every individual I coach, it is an intimate individual performance package that they seek to attain. For some, it means a spot on the Olympic team. For others, perhaps even a national age group championship, or a slot to a world championship event. For some others, it might be to attain a PR, or to nab a podium spot at a local race. For others just finishing, and doing the absolute best they are capable of, is a gigantic win.
It is at some levels an all encompassing passion, and it needs to be at elite/ professional levels. For most it becomes a happy, healthy, and complete lifestyle game changer. Focusing on how the mind and body interact to create optimal human propulsion is fascinating.
In that focus, we find a connection between athlete and coach that supersedes a training plan, or showing how to accomplish a skill. Out of endurance sports comes a reflection on life, that permeates ones soul in a unique and game changing fashion. We teach athletics but what we do is empower our athletes beyond the playing field, to tackle a lot of life's "races".
The lessons learned in an endurance based multisport lifestyle translate into school, business, and home life. Learning to balance three different disciplines, or one discipline, along with the peripheral segments that go with that sport helps one to balance what is thrown our way in everyday life.
We have learned how to balance literally and physically. And to pass it along well.
We feel a natural need and desire to share our wealth of knowledge, and techniques.
We want to shout it out to all within listening range.
That is our passion. Come on in and join the fun, adventure of Laid back performance.


The smartphone has evolved to be useful in every walk of life, bringing a world of information and utility to the palm of the person holding it.
Today smartphones are used extensively for navigation and are fast replacing standalone personal navigation devices, which are now considered bulky and limited. Most smartphones come with inbuilt GPS (Global Positioning System) that allow them to monitor the device's location using a tracking signal from geo stationary satellites.
Another advantage of smartphones over conventional navigational devices is that handsets can be used to make calls in case of emergencies like accidents.
There are applications for smartphones that can assist a driver in better driving. Here we have shortlisted five such applications that every driver who owns a smartphone must install for assistance while on the move.
When Google Maps was released for personal computers people were in a fix as to why Google launched maps for desktop PCs, but since the day it was announced for mobiles everything started to fall in place.
Google Maps for mobile is by far the most exciting, innovative and, not to forget, free navigation service available for smartphones anywhere.
All the user needs is an active internet connection and the Google Maps application.
The latest version of Google Maps provides turn by turn navigation even for new places. With altitude, check in, 3D maps and many such innovative services already included in the bouquet one can only guess what will come next: virtual reality maybe!
People say that mobile phones do not distract them while driving. If that is the case with you then you are a great driver, but if not then distractions while driving can cause serious road accidents.
Many times distractions are caused by SMS or an important email that the user was waiting a long time for, and it finally arrives while he is at the wheel.
So, should you not read that message or email? Or should someone read it out to you!
Well, this is precisely what DriveSafe.ly does. The app reads out messages, emails and BlackBerry Messenger messages so the user can focus on the road with his hands on the wheel and not on the phone.
Driving is one thing, but maintaining a car in good order is another. And, with today's busy schedule it is very easy to forget to get your car serviced on time or check its performance, so that if something is wrong it can be taken to the local shop and fixed.
Well, there is one neat application for this known as aCar. It is the solution to all the maintenance related worries that car owners have.
The application tracks the movement of the vehicle and, based on time and mileage, gives service reminders to change the engine oil, air filter, or to service the car etc. The application also allows users to calculate the car's mileage. They also get to compare data over time to get a fair idea of how the car has been performing.
With parking lots getting filled with cars it is becoming increasingly difficult for people to locate their vehicles in the evening.
Find my Car, another universal application, tracks the location of the car using GPS and helps the user find his way back to the vehicle.
All the user needs to do is record or pin the location where the car is parked and the application remembers the coordinates for the way back later on.
Most of the time users struggle to put their phones on loudspeaker while driving and then they fiddle with menus, which causes a lot of distraction and might lead to a road mishap as well.
Car Mode is the right application for all such problems. When turned on, this app puts the phone on loudspeaker-only mode so that all the calls received thereafter are transferred to the phone's inbuilt loudspeaker, automatically leaving the driver's hands free for driving.


MUMBAI — Lawyer-turned-administrator Shashank Manohar was on Sunday elected unopposed as the BCCI President ushering in a new era in the Cricket Board and ending N Srinivasan's clout in the cash-rich body.
Manohar took over the post at the Board's Special General meeting which lasted less than half an hour. He was the only candidate left in the fray for the election in which the deadline for filing nomination ended last evening.
The election was necessitated by the sudden demise of Jagmohan Dalmiya, who had a short term of seven months after his election in March this year. Dalmiya was made the interim President when Srinivasan "stepped aside" in the wake of revelations that his son-in-law was involved in betting during the 2013 IPL season.
All the six units of East Zone unanimously proposed Manohar's candidature for the president's post, reflecting Srinivasan's diminishing hold in Board's power politics.
A BCCI by-election needs only one proposer from the zone which is electing the president and it was the East's turn this time. Manohar got the nod from all the six associations and was the lone nomination at the end of the 7 pm deadline yesterday.
Interestingly, one of the proposers for Manohar was Dalmiya's son Avishek, who was representing his family club National Cricket Club (NCC) in the SGM.
Srinivasan skipped the meeting and the Tamil Nadu Cricket Association was represented by P S Raman.
The others who also proposed Manohar's name were Sourav Ganguly from Bengal, Sourav Dasgupta from Tripura, Gautam Roy from Assam, Ashirbad Behera of Odisha and Sanjay Singh of Jharkhand State Cricket Association (JSCA).
Manohar's earlier stint was for three years between 2008 -09 and 2010-11.
His anointment also means that Srinivasan now has little chance of coming back into the BCCI fold till 2017 when the Vidarbha man's tenure ends.
Manohar has the responsibility to guide the BCCI to its stable self after a troubled era under Srinivasan whose tenure was marred by acrimony within and outside the Board's portals.
The 2013 IPL spot fixing scandal that singed Srinivasan, following his son-in-law and IPL team Chennai Super Kings' former principal Gurunath Meiyappan being found guilty of betting on the T20 League games, led to the Supreme Court sidelining him from holding the reins of the BCCI.
Srinivasan had tried his best to muster enough support for his nominee to take control of the BCCI, including having a surprise meeting with another interested person, Sharad Pawar, at Nagpur recently.
But Pawar's group members were not keen to have any truck with the TN strongman - who has decided to keep away from the whole rigmarole.
And with another group led by Anurag Thakur also backing Manohar's candidature after his meeting with Union Finance Minister Arun Jaitley in Delhi last week, the road was clear for Manohar.
Manohar, thus, is the biggest beneficiary of the change made in the BCCI's statutes a few years ago permitting former office-bearers to return to power after finishing their terms.


text:
Have Manchester City wrapped up another English Premier League title already?
Guardiola's men are eight points clear going into 2022, with Norwich struggling
Published: December 30, 2021 14:29 Matthew Smith, Sport Editor
Manchester City's Phil Fode and Jack Grealish after the English Premier League win over Brentford Image Credit: AP
The Premier League table has a familiar name at the top of the standings as 2021 draws to a close — but not many expected Manchester City side to be getting things their own way quite so easily ahead of their title rivals.
The defending champions are eight points clear at the summit, with Thomas Tuchel's Chelsea second, a point ahead of Jurgen Klopp's Liverpool. But back at the start of the 2021-22 campaign, most saw things panning out quite differently.
Cristiano Ronaldo statue meets opposition in Goa
English Premier League: Tottenham tripped up by 10-man Southampton
English Premier League: Klopp insists Liverpool improvement is needed if they are to catch leaders City
LOOK: Stars grace the red carpet at Dubai Globe Soccer Awards
The legendary Sergio Aguero departed the Etihad in the summer and City had no recognised No. 9 striker, European champions Chelsea welcomed home prolific frontman Romelu Lukaku from Inter Milan and Liverpool were back to full strength — including talisman Virgil van Dijk — after an injury ravaged 2020-21 campaign. But is seems that with Pep Guardiola's men, where there is a will there is a way and — after a wobble at the start of the season (they opened with a loss to Tottenham Hotspur) — they were soon firing on all cylinders and scoring from almost all positions. An astonishing 18 different players have scored City's whopping 75 goals already this season. Also, their tally of 113 Premier League goals in 2021 is the most by a top-flight team in a calendar year since 1960.
Confidence in front of goal has led to positive results and City are on a 10-game winning run while their foes have flopped. Liverpool most recently lost to Leicester and too many draws have been costly. Chelsea — too — struggled to make an impact when Lukaku was out with a lengthy injury and, despite the Belgian's return, the Blues were held to a 1-1 draw on Wednesday night as City defeated Brentford to sign off the year in an imposing position.
Manchester City are on a 10-game winning run Image Credit: Reuters
Time for some stats: The last two times City ended December top of the Premier League (2011-12 and 2017-18) they went on to win the title. There has been a gap of at least eight points only five times in the Premier League table at the turn of the year and each time the leaders have gone on to win the title. The leading team going into the new year has gone on to win the title right times in the past 12 seasons.
Ever the pragmatist, Guardiola played down the advantage. "There are 54 points to play for," he said. "All of you, thank you for your nice words because we win but I am not going to believe any words you say about it is already done or expected because Chelsea and Liverpool are more than exceptional. One is champions of Europe and the other has been our big rivals over the years. The distance is not because they drop points but because we win 10 games in a row."
That is all well and good but what started out as at least a three-horse race (some were hopeful of a long-awaited Manchester United revival with the return of Cristiano Ronaldo to Old Trafford), looks like turning into another canter for City — and they have their sights on a fourth EPL crown in five years.
Manchester United's Harry Maguire after dropping points to Newcastle Image Credit: Reuters
United woe
It has been another season to forget for United, with Ole Gunnar Solskjaer paying the price for another campaign of underperformance with his job as coach. Ralf Rangnick has come in as interim manager until the end of the season, but narrow wins over Crystal Palace and struggling Norwich, followed by a poor draw against relegation-threatened Newcastle United show how much work still needs to be done at Old Trafford despite summer recruits Ronaldo, Jadon Sancho and Rafael Varane.
It is a similar story at Tottenham Hotspur — as Covid postponements have played havoc with the Christmas schedule — and they are already looking up in the standings at their rivals rather than down. Even Arsenal, who had a dreadful start to the season and found themselves in the relegation zone early on with coach Mikel Arteta almost losing his job, are now ahead of their North London rivals in fourth after an impressive recovery. Leicester and West Ham look like fighting it out with Man United, Arsenal and Spurs for fourth spot and the Europa League slots as the top three looks set — it is just the order to be decided.
Norwich City are bottom of the table Image Credit: Reuters
Dreaded drop
Brentford have impressed in their first season in the top flight and sit 14th, nine points clear of the relegation zone and looking good to stay up. It is looking like a different story for Norwich, who are rock bottom on 10 points after 19 games and have already shipped 42 goals while scoring only eight. That is grim reading, even for the most optimistic Canaries fan.
Newcastle are second bottom and will need to spend their newfound wealth — thanks to a Saudi-backed takeover — in January if they are to get out of trouble. There is a bit of a log jam at the bottom of the table and at least half of the teams in the league will be wary of a dip in form that could easily push them into trouble and a fight to avoid the dreaded drop.
At the other end, it is all about City and their quest for another crown to confirm their domestic dominance in England.
More From Football
Norwich win crucial relegation battle at Watford
Everton owner Moshiri increases stake in club

redpajama_set_name: RedPajamaCommonCrawl


text:
Family-Based Visas
Work Visas & Labor Certification
Entertainment Visas
Trump administration continues campaign against DACA
On behalf of Law Offices of George Giosmas | Nov 7, 2018 | Deportation Defense
The Justice Department is pursuing its case to stop a program that could affect many people in Florida. Formally known as Delayed Action for Childhood Arrivals, DACA was launched by the Obama administration to protect undocumented immigrants who came to the United States when they were children. Multiple cases are proceeding in federal courts across the country, including those in California, New York and the District of Columbia. Now, the Justice Department is calling on the Supreme Court to intervene in all three cases, before an expected verdict from the U.S. Court of Appeals for the 9th Circuit.
In January, a federal judge ruled that President Trump lacked the authority to eliminate DACA. In February, the Supreme Court refused to take the appeal out of the hands of the circuit court; however, now the Supreme Court has one more Trump appointee, Justice Brent Kavanaugh. Because of the court's Republican-appointed majority, it is considered more likely to support the Trump administration's position. However, the Justice Department acknowledged in the papers it filed that the 9th Circuit is fairly likely to render its opinion before the high court considers its filing.
The Trump administration wants the Supreme Court to agree to take the case now so that it will be on the current year's docket, which ends in June 2019. Otherwise, it will not be heard for another year. Over 700,000 people have been protected from deportation under the program, which has been shown to have widespread public support.
People who are protected under DACA may be very concerned about the Trump administration's policies on immigration and how they could affect their lives. An immigration lawyer can help to defend against deportation and protect people's right to stay in the country.
Deportation Defense (27)
Immigration Process (1)
USCIS fee changes target immigrants' wallets
Asylum seekers affected as Supreme Court allows rule to proceed
Request pending for court to address third-country asylum ban
Legal requirements needed for a marriage-based visa or green card
Would you volunteer for removal to get out of jail?
Do You Have a Case
Law Offices of George Giosmas
2131 Hollywood Boulevard
Based in Hollywood, South Florida, the Law Offices of George Giosmas serves clients throughout Fort Lauderdale, Miami-Dade County, Broward County and Palm Beach County. We handle immigration matters nationwide and around the globe.
© 2019 Law Offices of George Giosmas. All Rights Reserved.


text:
/*
* JschNodeExecutor.java
*
* User: Greg Schueler greg@dtosolutions.com
* Created: 3/21/11 4:46 PM
*
*/
package com.dtolabs.rundeck.core.execution.impl.jsch;

import com.dtolabs.rundeck.core.cli.CLIUtils;
import com.dtolabs.rundeck.core.common.Framework;
import com.dtolabs.rundeck.core.common.INodeEntry;
import com.dtolabs.rundeck.core.execution.ExecutionContext;
import com.dtolabs.rundeck.core.execution.ExecutionListener;
import com.dtolabs.rundeck.core.execution.impl.common.AntSupport;
import com.dtolabs.rundeck.core.execution.service.NodeExecutor;
import com.dtolabs.rundeck.core.execution.service.NodeExecutorResult;
import com.dtolabs.rundeck.core.execution.service.NodeExecutorResultImpl;
import com.dtolabs.rundeck.core.execution.utils.*;
import com.dtolabs.rundeck.core.execution.workflow.steps.FailureReason;
import com.dtolabs.rundeck.core.execution.workflow.steps.StepFailureReason;
import com.dtolabs.rundeck.core.execution.workflow.steps.node.NodeStepFailureReason;
import com.dtolabs.rundeck.core.plugins.configuration.*;
import com.dtolabs.rundeck.core.tasks.net.ExtSSHExec;
import com.dtolabs.rundeck.core.tasks.net.SSHTaskBuilder;
import com.dtolabs.rundeck.plugins.util.DescriptionBuilder;
import com.dtolabs.rundeck.plugins.util.PropertyBuilder;
import com.jcraft.jsch.JSchException;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.log4j.Logger;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;

import java.io.*;
import java.net.NoRouteToHostException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;
import java.text.MessageFormat;
import java.util.*;
import java.util.concurrent.*;

/**
 * JschNodeExecutor is ...
 *
 * @author Greg Schueler greg@dtosolutions.com
 */
public class JschNodeExecutor implements NodeExecutor, Describable {
    public static final Logger logger = Logger.getLogger(JschNodeExecutor.class.getName());
    public static final String SERVICE_PROVIDER_TYPE = "jsch-ssh";
    public static final String FWK_PROP_AUTH_CANCEL_MSG = "framework.messages.error.ssh.authcancel";
    public static final String FWK_PROP_AUTH_CANCEL_MSG_DEFAULT =
        "Authentication failure connecting to node: \"{0}\". Make sure your resource definitions and credentials are up to date.";
    public static final String FWK_PROP_AUTH_FAIL_MSG = "framework.messages.error.ssh.authfail";
    public static final String FWK_PROP_AUTH_FAIL_MSG_DEFAULT =
        "Authentication failure connecting to node: \"{0}\". Password incorrect.";
    public static final String NODE_ATTR_SSH_KEYPATH = "ssh-keypath";
    public static final String NODE_ATTR_SSH_KEY_RESOURCE = "ssh-key-storage-path";
    public static final String NODE_ATTR_SSH_PASSWORD_STORAGE_PATH= "ssh-password-storage-path";
    public static final String NODE_ATTR_LOCAL_SSH_AGENT = "local-ssh-agent";
    public static final String NODE_ATTR_LOCAL_TTL_SSH_AGENT = "local-ttl-ssh-agent";

    public static final String PROJ_PROP_PREFIX = "project.";
    public static final String FWK_PROP_PREFIX = "framework.";

    public static final String FWK_PROP_SSH_KEYPATH = FWK_PROP_PREFIX + NODE_ATTR_SSH_KEYPATH;
    public static final String PROJ_PROP_SSH_KEYPATH = PROJ_PROP_PREFIX + NODE_ATTR_SSH_KEYPATH;
    public static final String FWK_PROP_SSH_KEY_RESOURCE = FWK_PROP_PREFIX + NODE_ATTR_SSH_KEY_RESOURCE;
    public static final String FWK_PROP_SSH_PASSWORD_STORAGE_PATH= FWK_PROP_PREFIX + NODE_ATTR_SSH_PASSWORD_STORAGE_PATH;
    public static final String PROJ_PROP_SSH_KEY_RESOURCE = PROJ_PROP_PREFIX + NODE_ATTR_SSH_KEY_RESOURCE;
    public static final String PROJ_PROP_SSH_PASSWORD_STORAGE_PATH = PROJ_PROP_PREFIX + NODE_ATTR_SSH_PASSWORD_STORAGE_PATH;

    public static final String NODE_ATTR_SSH_AUTHENTICATION = "ssh-authentication";
    public static final String NODE_ATTR_SSH_PASSWORD_OPTION = "ssh-password-option";
    public static final String DEFAULT_SSH_PASSWORD_OPTION = "option.sshPassword";
    public static final String SUDO_OPT_PREFIX = "sudo-";
    public static final String SUDO2_OPT_PREFIX = "sudo2-";
    public static final String NODE_ATTR_SUDO_PASSWORD_OPTION = "password-option";
    public static final String DEFAULT_SUDO_PASSWORD_OPTION = "option.sudoPassword";
    public static final String DEFAULT_SUDO2_PASSWORD_OPTION = "option.sudo2Password";
    public static final String NODE_ATTR_SSH_KEY_PASSPHRASE_OPTION = "ssh-key-passphrase-option";
    public static final String NODE_ATTR_SSH_KEY_PASSPHRASE_STORAGE_PATH = "ssh-key-passphrase-storage-path";
    public static final String DEFAULT_SSH_KEY_PASSPHRASE_OPTION = "option.sshKeyPassphrase";

    public static final String NODE_ATTR_ALWAYS_SET_PTY = "always-set-pty";
    public static final String FWK_PROP_SET_PTY = FWK_PROP_PREFIX + NODE_ATTR_ALWAYS_SET_PTY;
    public static final String PROJ_PROP_SET_PTY = PROJ_PROP_PREFIX + NODE_ATTR_ALWAYS_SET_PTY;

    public static final String FWK_PROP_SSH_AUTHENTICATION = FWK_PROP_PREFIX + NODE_ATTR_SSH_AUTHENTICATION;
    public static final String PROJ_PROP_SSH_AUTHENTICATION = PROJ_PROP_PREFIX + NODE_ATTR_SSH_AUTHENTICATION;

    public static final String NODE_ATTR_SUDO_COMMAND_ENABLED = "command-enabled";
    public static final String NODE_ATTR_SUDO_PROMPT_PATTERN = "prompt-pattern";
    public static final String DEFAULT_SUDO_PROMPT_PATTERN = "^\\[sudo\\] password for .+: .*";
    public static final String NODE_ATTR_SUDO_FAILURE_PATTERN = "failure-pattern";
    public static final String DEFAULT_SUDO_FAILURE_PATTERN = "^.*try again.*";
    public static final String NODE_ATTR_SUDO_COMMAND_PATTERN = "command-pattern";
    public static final String DEFAULT_SUDO_COMMAND_PATTERN = "^sudo$";
    public static final String DEFAULT_SUDO2_COMMAND_PATTERN = "^sudo .+? sudo .*$";
    public static final String NODE_ATTR_SUDO_PROMPT_MAX_LINES = "prompt-max-lines";
    public static final int DEFAULT_SUDO_PROMPT_MAX_LINES = 12;
    public static final String NODE_ATTR_SUDO_RESPONSE_MAX_LINES = "response-max-lines";
    public static final int DEFAULT_SUDO_RESPONSE_MAX_LINES = 2;
    public static final String NODE_ATTR_SUDO_PROMPT_MAX_TIMEOUT = "prompt-max-timeout";
    public static final long DEFAULT_SUDO_PROMPT_MAX_TIMEOUT = 5000;
    public static final String NODE_ATTR_SUDO_RESPONSE_MAX_TIMEOUT = "response-max-timeout";
    public static final long DEFAULT_SUDO_RESPONSE_MAX_TIMEOUT = 5000;
    public static final String NODE_ATTR_SUDO_FAIL_ON_PROMPT_MAX_LINES = "fail-on-prompt-max-lines";
    public static final boolean DEFAULT_SUDO_FAIL_ON_PROMPT_MAX_LINES = false;
    public static final String NODE_ATTR_SUDO_FAIL_ON_PROMPT_TIMEOUT = "fail-on-prompt-timeout";
    public static final boolean DEFAULT_SUDO_FAIL_ON_PROMPT_TIMEOUT = true;
    public static final String NODE_ATTR_SUDO_FAIL_ON_RESPONSE_TIMEOUT = "fail-on-response-timeout";
    public static final boolean DEFAULT_SUDO_FAIL_ON_RESPONSE_TIMEOUT = false;
    public static final String NODE_ATTR_SUDO_SUCCESS_ON_PROMPT_THRESHOLD = "success-on-prompt-threshold";
    public static final String NODE_ATTR_SUDO_PASSWORD_STORAGE_PATH= "password-storage-path";
    public static final boolean DEFAULT_SUDO_SUCCESS_ON_PROMPT_THRESHOLD = true;
    public static final String PROJECT_SSH_USER = PROJ_PROP_PREFIX + "ssh.user";

    /**
     * deprecated Global command & connection timeout framework property
     */
    public static final String SSH_TIMEOUT_PROP = "framework.ssh.timeout";

    public static final String NODE_ATTR_SSH_COMMAND_TIMEOUT_PROP = "ssh-command-timeout";
    public static final String FRAMEWORK_SSH_COMMAND_TIMEOUT_PROP = "framework.ssh.command.timeout";

    public static final String NODE_ATTR_SSH_CONNECT_TIMEOUT_PROP = "ssh-connect-timeout";
    public static final String FRAMEWORK_SSH_CONNECT_TIMEOUT_PROP = "framework.ssh.connect.timeout";

    public static final String PROJ_PROP_CON_TIMEOUT = PROJ_PROP_PREFIX + NODE_ATTR_SSH_CONNECT_TIMEOUT_PROP;
    public static final String FWK_PROP_CON_TIMEOUT = FWK_PROP_PREFIX + NODE_ATTR_SSH_CONNECT_TIMEOUT_PROP;

    public static final String PROJ_PROP_COMMAND_TIMEOUT = PROJ_PROP_PREFIX + NODE_ATTR_SSH_COMMAND_TIMEOUT_PROP;
    public static final String FWK_PROP_COMMAND_TIMEOUT = FWK_PROP_PREFIX + NODE_ATTR_SSH_COMMAND_TIMEOUT_PROP;

    public static final String SSH_CONFIG_PREFIX = "ssh-config-";
    public static final String FWK_SSH_CONFIG_PREFIX = FWK_PROP_PREFIX + SSH_CONFIG_PREFIX;
    public static final String PROJ_SSH_CONFIG_PREFIX = PROJ_PROP_PREFIX + SSH_CONFIG_PREFIX;

    private Framework framework;

    public JschNodeExecutor(final Framework framework) {
        this.framework = framework;
    }

    public static final String CONFIG_KEYPATH = "keypath";
    public static final String CONFIG_KEYSTORE_PATH = "keystoragepath";
    public static final String CONFIG_PASSSTORE_PATH = "passwordstoragepath";
    public static final String CONFIG_SUDO_PASSSTORE_PATH = "sudopasswordstoragepath";
    public static final String CONFIG_AUTHENTICATION = "authentication";
    public static final String CONFIG_SET_PTY = "always-set-pty";
    public static final String CONFIG_CON_TIMEOUT = "ssh-connection-timeout";
    public static final String CONFIG_COMMAND_TIMEOUT = "ssh-command-timeout";

    static final Description DESC ;

    static final Property SSH_KEY_FILE_PROP = PropertyUtil.string(CONFIG_KEYPATH, "SSH Key File path",
            "File Path to the SSH Key to use",
            false, null);

    static final Property SSH_KEY_STORAGE_PROP = PropertyBuilder.builder()
            .string(CONFIG_KEYSTORE_PATH)
            .required(false)
            .title("SSH Key Storage Path")
            .description("Path to the SSH Key to use within Rundeck Storage. E.g. \"keys/path/key1.pem\"")
            .renderingOption(StringRenderingConstants.SELECTION_ACCESSOR_KEY,
                    StringRenderingConstants.SelectionAccessor.STORAGE_PATH)
            .renderingOption(StringRenderingConstants.STORAGE_PATH_ROOT_KEY, "keys")
            .renderingOption(StringRenderingConstants.STORAGE_FILE_META_FILTER_KEY, "Rundeck-key-type=private")
            .build();
    static final Property SSH_PASSWORD_STORAGE_PROP = PropertyBuilder.builder()
            .string(CONFIG_PASSSTORE_PATH)
            .required(false)
            .title("SSH Password Storage Path")
            .description("Path to the Password to use within Rundeck Storage. E.g. \"keys/path/my.password\". Can be overridden by a Node attribute named 'ssh-password-storage-path'.")
            .renderingOption(StringRenderingConstants.SELECTION_ACCESSOR_KEY,
                    StringRenderingConstants.SelectionAccessor.STORAGE_PATH)
            .renderingOption(StringRenderingConstants.STORAGE_PATH_ROOT_KEY, "keys")
            .renderingOption(StringRenderingConstants.STORAGE_FILE_META_FILTER_KEY, "Rundeck-data-type=password")
            .build();

    public static final Property SSH_AUTH_TYPE_PROP = PropertyUtil.select(CONFIG_AUTHENTICATION, "SSH Authentication",
            "Type of SSH Authentication to use",
            true, SSHTaskBuilder.AuthenticationType.privateKey.toString(), Arrays.asList(SSHTaskBuilder
            .AuthenticationType.values()), null, null);

    public static final Property ALWAYS_SET_PTY = PropertyUtil.bool(CONFIG_SET_PTY, "Force PTY",
            "Always force use of new pty",
            false, "false");

    public static final Property PROP_CON_TIMEOUT = PropertyUtil.longProp(CONFIG_CON_TIMEOUT, "Connection Timeout",
                                                                          "SSH Connection timeout in milliseconds. (0" +
                                                                          " for no timeout)",
                                                                          false, "0"
    );

    public static final Property PROP_COMMAND_TIMEOUT = PropertyUtil.longProp(
            CONFIG_COMMAND_TIMEOUT,
            "Command Timeout",
            "Maximum duration of commands: timeout " +
            "in milliseconds. (0 for no timeout)",
            false,
            "0"
    );

    static {
        DescriptionBuilder builder = DescriptionBuilder.builder();
        builder.name(SERVICE_PROVIDER_TYPE)
                .title("SSH")
                .description("Executes a command on a remote node via SSH.")
                ;

        builder.property(SSH_KEY_FILE_PROP);
        builder.property(SSH_KEY_STORAGE_PROP);
        builder.property(SSH_PASSWORD_STORAGE_PROP);
        builder.property(SSH_AUTH_TYPE_PROP);
        builder.property(ALWAYS_SET_PTY);
        builder.property(PROP_CON_TIMEOUT);
        builder.property(PROP_COMMAND_TIMEOUT);

        builder.mapping(CONFIG_KEYPATH, PROJ_PROP_SSH_KEYPATH);
        builder.frameworkMapping(CONFIG_KEYPATH, FWK_PROP_SSH_KEYPATH);
        builder.mapping(CONFIG_KEYSTORE_PATH, PROJ_PROP_SSH_KEY_RESOURCE);
        builder.frameworkMapping(CONFIG_KEYSTORE_PATH, FWK_PROP_SSH_KEY_RESOURCE);
        builder.mapping(CONFIG_PASSSTORE_PATH, PROJ_PROP_SSH_PASSWORD_STORAGE_PATH);
        builder.frameworkMapping(CONFIG_PASSSTORE_PATH, FWK_PROP_SSH_PASSWORD_STORAGE_PATH);
        builder.mapping(CONFIG_AUTHENTICATION, PROJ_PROP_SSH_AUTHENTICATION);
        builder.frameworkMapping(CONFIG_AUTHENTICATION, FWK_PROP_SSH_AUTHENTICATION);

        builder.mapping(CONFIG_SET_PTY, PROJ_PROP_SET_PTY);
        builder.frameworkMapping(CONFIG_SET_PTY, FWK_PROP_SET_PTY);

        builder.mapping(CONFIG_CON_TIMEOUT, PROJ_PROP_CON_TIMEOUT);
        builder.frameworkMapping(CONFIG_CON_TIMEOUT, FWK_PROP_CON_TIMEOUT);

        builder.mapping(CONFIG_COMMAND_TIMEOUT, PROJ_PROP_COMMAND_TIMEOUT);
        builder.frameworkMapping(CONFIG_COMMAND_TIMEOUT, FWK_PROP_COMMAND_TIMEOUT);

        DESC=builder.build();
    }

    public Description getDescription() {
        return DESC;
    }

    public NodeExecutorResult executeCommand(final ExecutionContext context, final String[] command,
                                             final INodeEntry node)  {
        if (null == node.getHostname() || null == node.extractHostname() || StringUtils.isBlank(node.extractHostname())) {
            return NodeExecutorResultImpl.createFailure(
                StepFailureReason.ConfigurationFailure,
                "Hostname must be set to connect to remote node '" + node.getNodename() + "'",
                node
            );
        }
        boolean forceNewPty = ResolverUtil.resolveBooleanProperty(CONFIG_SET_PTY,false,
                node,context.getFramework().getFrameworkProjectMgr().getFrameworkProject(context.getFrameworkProject()),
                context.getFramework());

        final ExecutionListener listener = context.getExecutionListener();
        final Project project = new Project();
        AntSupport.addAntBuildListener(listener, project);

        boolean success = false;
        final ExtSSHExec sshexec;
        //perform jsch sssh command
        final NodeSSHConnectionInfo nodeAuthentication = new NodeSSHConnectionInfo(node, framework,
                                                                                context);
        try {

            sshexec = SSHTaskBuilder.build(node, command, project, context.getDataContext(),
                                           nodeAuthentication, context.getLoglevel(),listener);
        } catch (SSHTaskBuilder.BuilderException e) {
            return NodeExecutorResultImpl.createFailure(StepFailureReason.ConfigurationFailure,
                                                        e.getMessage(), node);
        }

        //Sudo support

        final ExecutorService executor = Executors.newSingleThreadExecutor(
                new ThreadFactory() {
                    public Thread newThread(Runnable r) {
                        return new Thread(null, r, "SudoResponder " + node.getNodename() + ": "
                                + System.currentTimeMillis());
                    }
                }
        );

        final Future<ResponderTask.ResponderResult> responderFuture;

        final SudoResponder sudoResponder;
        try {
            sudoResponder = SudoResponder.create(
                    node,
                    framework,
                    context,
                    SUDO_OPT_PREFIX,
                    passwordSourceWithPrefix(nodeAuthentication, SUDO_OPT_PREFIX),
                    DEFAULT_SUDO_COMMAND_PATTERN
            );
        } catch (IOException e) {
            return NodeExecutorResultImpl.createFailure(StepFailureReason.ConfigurationFailure,
                                                        e.getMessage(), node);
        }
        Runnable responderCleanup=null;
        if (sudoResponder.isSudoEnabled() && sudoResponder.matchesCommandPattern(command[0])) {
            final DisconnectResultHandler resultHandler = new DisconnectResultHandler();

            //configure two piped i/o stream pairs, to connect to the input/output of the SSH connection
            final PipedInputStream responderInput = new PipedInputStream();
            final PipedOutputStream responderOutput = new PipedOutputStream();
            final PipedInputStream jschInput = new PipedInputStream();
            //lead pipe allows connected inputstream to close and not hang the writer to this stream
            final PipedOutputStream jschOutput = new LeadPipeOutputStream();
            try {
                responderInput.connect(jschOutput);
                jschInput.connect(responderOutput);
            } catch (IOException e) {
                return NodeExecutorResultImpl.createFailure(StepFailureReason.IOFailure, e.getMessage(), node);
            }

            //first sudo prompt responder
            ResponderTask responder = new ResponderTask(sudoResponder, responderInput, responderOutput, resultHandler);

            /*
             * Callable will be executed by the ExecutorService
             */
            final Callable<ResponderTask.ResponderResult> responderResultCallable;

            //if 2nd responder

            final SudoResponder sudoResponder2;
            try {
                sudoResponder2 = SudoResponder.create(
                        node,
                        framework,
                        context,
                        SUDO2_OPT_PREFIX,
                        passwordSourceWithPrefix(nodeAuthentication, SUDO2_OPT_PREFIX),
                        DEFAULT_SUDO2_COMMAND_PATTERN
                );
            } catch (IOException e) {
                return NodeExecutorResultImpl.createFailure(StepFailureReason.ConfigurationFailure,
                                                            e.getMessage(), node);
            }
            if (sudoResponder2.isSudoEnabled()
                && sudoResponder2.matchesCommandPattern(CLIUtils.generateArgline(null, command, false))) {
                logger.debug("Enable second sudo responder");

                sudoResponder2.setDescription("Second " + SudoResponder.DEFAULT_DESCRIPTION);
                sudoResponder.setDescription("First " + SudoResponder.DEFAULT_DESCRIPTION);

                //sequence of the first then the second sudo responder
                responderResultCallable = responder.createSequence(sudoResponder2);
            } else {
                responderResultCallable = responder;
            }

            //set up SSH execution
            if(!forceNewPty){
                sshexec.setAllocatePty(true);
            }
            sshexec.setInputStream(jschInput);
            sshexec.setSecondaryStream(jschOutput);
            sshexec.setDisconnectHolder(resultHandler);

            responderFuture = executor.submit(responderResultCallable);
            //close streams after responder is finished
            responderCleanup = new Runnable() {
                public void run() {
                    logger.debug("SudoResponder shutting down...");
                    try {
                        responderInput.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    try {
                        responderOutput.flush();
                        responderOutput.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //executor pool shutdown
                    executor.shutdownNow();
                }
            };
            executor.submit(responderCleanup);
        }else {
            responderFuture = null;
        }
        if (null != context.getExecutionListener()) {
            context.getExecutionListener().log(3,
                                               "Starting SSH Connection: " + nodeAuthentication.getUsername() + "@"
                                               + node.getHostname() + " ("
                                               + node.getNodename() + ")");
        }
        String errormsg = null;
        FailureReason failureReason=null;
        final long contimeout = nodeAuthentication.getConnectTimeout();
        final long commandtimeout = nodeAuthentication.getCommandTimeout();
        try {
            if(forceNewPty) {
                sshexec.setAllocatePty(true);
            }
            sshexec.execute();
            success = true;
        } catch (BuildException e) {
            final ExtractFailure extractJschFailure = extractFailure(e, node, commandtimeout, contimeout, framework);
            errormsg = extractJschFailure.getErrormsg();
            failureReason = extractJschFailure.getReason();
            context.getExecutionListener().log(0, errormsg);
        }
        if (null != responderCleanup) {
            responderCleanup.run();
        }
        shutdownAndAwaitTermination(executor);
        if (null != responderFuture) {
            try {
                logger.debug("Waiting 5 seconds for responder future result");
                final ResponderTask.ResponderResult result = responderFuture.get(5, TimeUnit.SECONDS);
                logger.debug("Responder result: " + result);
                if (!result.isSuccess() && !result.isInterrupted()) {
                    context.getExecutionListener().log(0,
                                                       result.getResponder().toString() + " failed: "
                                                       + result.getFailureReason());
                }
            } catch (InterruptedException e) {
                //ignore
            } catch (java.util.concurrent.ExecutionException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                //ignore
            }
        }
        final int resultCode = sshexec.getExitStatus();
        if(null!=context.getOutputContext()){
            context.getOutputContext().addOutput("exec", "exitCode", String.valueOf(resultCode));
        }
        if (success) {
            return NodeExecutorResultImpl.createSuccess(node);
        } else {
            return NodeExecutorResultImpl.createFailure(failureReason, errormsg, node, resultCode);
        }
    }

    /**
     * create password source
     * @param nodeAuthentication auth
     * @param prefix prefix
     * @return source
     * @throws IOException if password loading from storage fails
     */
    private PasswordSource passwordSourceWithPrefix(
            final NodeSSHConnectionInfo nodeAuthentication,
            final String prefix
    ) throws IOException
    {
        if (null != nodeAuthentication.getSudoPasswordStoragePath(prefix)) {
            return new BasicSource(nodeAuthentication.getSudoPasswordStorageData(prefix));
        } else {
            return new BasicSource(nodeAuthentication.getSudoPassword(prefix));
        }
    }

    static enum JschFailureReason implements FailureReason {
        /**
         * A problem with the SSH connection
         */
        SSHProtocolFailure
    }

    static ExtractFailure extractFailure(
            BuildException e,
            INodeEntry node,
            long commandTimeout,
            long connectTimeout,
            Framework framework
    )
    {
        String errormsg;
        FailureReason failureReason;

        if (e.getMessage().contains(ExtSSHExec.COMMAND_TIMEOUT_MESSAGE)) {
            errormsg =
                    "Failed execution for node: " + node.getNodename() + ": Execution Timeout period exceeded (after "
                    + commandTimeout + "ms), connection dropped";
            failureReason = NodeStepFailureReason.ConnectionTimeout;
        } else if (e.getMessage().contains(ExtSSHExec.CON_TIMEOUT_MESSAGE)) {
            errormsg =
                    "Failed execution for node: " + node.getNodename() + ": Connection Timeout period exceeded (after "
                    + connectTimeout + "ms).";
            failureReason = NodeStepFailureReason.ConnectionTimeout;
        } else if (null != e.getCause() && e.getCause() instanceof JSchException) {
            JSchException jSchException = (JSchException) e.getCause();
            return extractJschFailure(node, commandTimeout, connectTimeout, jSchException, framework);
        } else if (e.getMessage().contains("Remote command failed with exit status")) {
            errormsg = e.getMessage();
            failureReason = NodeStepFailureReason.NonZeroResultCode;
        } else {
            failureReason = StepFailureReason.Unknown;
            errormsg = e.getMessage();
        }
        return new ExtractFailure(errormsg, failureReason);
    }

    static ExtractFailure extractJschFailure(final INodeEntry node,
                                             final long commandTimeout,
                                             final long connectionTimeout,
                                             final JSchException jSchException, final Framework framework) {
        String errormsg;
        FailureReason reason;

        if (null == jSchException.getCause()) {
            if (jSchException.getMessage().contains("Auth cancel")) {

                String msgformat = FWK_PROP_AUTH_CANCEL_MSG_DEFAULT;
                if (framework.getPropertyLookup().hasProperty(FWK_PROP_AUTH_CANCEL_MSG)) {
                    msgformat = framework.getProperty(FWK_PROP_AUTH_CANCEL_MSG);
                }
                errormsg = MessageFormat.format(msgformat, node.getNodename(), jSchException.getMessage());
                reason = NodeStepFailureReason.AuthenticationFailure;
            } else if (jSchException.getMessage().contains("Auth fail")) {
                String msgformat = FWK_PROP_AUTH_FAIL_MSG_DEFAULT;
                if (framework.getPropertyLookup().hasProperty(FWK_PROP_AUTH_FAIL_MSG)) {
                    msgformat = framework.getProperty(FWK_PROP_AUTH_FAIL_MSG);
                }
                errormsg = MessageFormat.format(msgformat, node.getNodename(), jSchException.getMessage());
                reason = NodeStepFailureReason.AuthenticationFailure;
            } else {
                reason = JschFailureReason.SSHProtocolFailure;
                errormsg = jSchException.getMessage();
            }
        } else {
            Throwable cause = ExceptionUtils.getRootCause(jSchException);
            errormsg = cause.getMessage();
            if (cause instanceof NoRouteToHostException) {
                reason = NodeStepFailureReason.ConnectionFailure;
            } else if (cause instanceof UnknownHostException) {
                reason = NodeStepFailureReason.HostNotFound;
            } else if (cause instanceof SocketTimeoutException) {
                errormsg = "Connection Timeout (after " + connectionTimeout + "ms): " + cause.getMessage();
                reason = NodeStepFailureReason.ConnectionTimeout;
            } else if (cause instanceof SocketException) {
                reason = NodeStepFailureReason.ConnectionFailure;
            } else {
                reason = StepFailureReason.Unknown;
            }
        }
        return new ExtractFailure(errormsg, reason);
    }

    /**
     * Shutdown the ExecutorService
     */
    void shutdownAndAwaitTermination(ExecutorService pool) {
        pool.shutdownNow(); // Disable new tasks from being submitted
        try {
            logger.debug("Waiting up to 30 seconds for ExecutorService to shut down");
            // Wait a while for existing tasks to terminate
            if (!pool.awaitTermination(30, TimeUnit.SECONDS)) {
                logger.debug("Pool did not terminate");
            }
        } catch (InterruptedException ie) {
            // (Re-)Cancel if current thread also interrupted
            pool.shutdownNow();
            // Preserve interrupt status
            Thread.currentThread().interrupt();
        }
    }

    /**
     * Disconnects the SSH connection if the result was not successful.
     */
    private static class DisconnectResultHandler implements ResponderTask.ResultHandler,
                                                            ExtSSHExec.DisconnectHolder {
        private volatile ExtSSHExec.Disconnectable disconnectable;
        private volatile boolean needsDisconnect=false;

        public void setDisconnectable(final ExtSSHExec.Disconnectable disconnectable) {
            this.disconnectable = disconnectable;
            checkAndDisconnect();
        }

        public void handleResult(final boolean success, final String reason) {
            needsDisconnect=!success;
            checkAndDisconnect();
        }

        /**
         * synchronize to prevent race condition on setDisconnectable and handleResult
         */
        private synchronized void checkAndDisconnect() {
            if (null != disconnectable && needsDisconnect) {
                disconnectable.disconnect();
                needsDisconnect = false;
            }
        }
    }

    static class ExtractFailure {

        private String errormsg;
        private FailureReason reason;

        private ExtractFailure(String errormsg, FailureReason reason) {
            this.errormsg = errormsg;
            this.reason = reason;
        }

        public String getErrormsg() {
            return errormsg;
        }

        public FailureReason getReason() {
            return reason;
        }

    }
}


Adventure enthusiasts like different outdoor activities to reinvigorate their mind. Outdoor activities such as- hiking, climbing, hunting, traveling, etc. always provide thrill and excitement to them.
Besides, some people often take their children with them, especially while they are going hunting, for teaching hunting principles and develop hunting skills to their kids from an early age.
And with that, parents also get the chance to make bonding with their children and enjoy the fantastic outdoors experience together.
Besides, some activities can occur dangerous too, until the kids reach the right age. So, parents can also teach their children about how to shoot, camp and hike, etc. by using hunting toys.
Hunting toys help the children to build their skills naturally through playing. In fact, not only the children but also novices can develop their skills by playing with these toys as well.
So, having the best hunting toys is essential to all. Otherwise, it can hamper the process of learning and ruin the mood as well.
Toys aren't always for the kids; sometimes it can be for adults too. Hunting toys are those kinds of stuff by which both children and adults can play as well.
By playing with these toys, we can practice social skills and creative thinking such as empathy, adaptability, choice-making and more. And so our effort of learning can get damaged, if we choose the wrong one.
So, we need to be careful and do some research before purchasing the hunting toys. As there are various hunting toys available in the market, we often face difficulty in selecting the suitable one.
Before choosing the suitable one, you need to check the stiffness and durability along with the price as well. Besides, some toys come with small parts that a baby could swallow.
And if it is for the kids, then we need to make sure the age-range also. So, bearing all crucial facts in minds, we have created a list of best hunting toys that you may like.
Kids Play Accessories manufacture kids Camouflage Toy Bundle. They have come with some appealing toys which are perfect for kids, especially for children who love to play in camouflage dress up.
This Camouflage Toy Bundle features – one cotton drawstring tote backpack, adjustable camouflage cap, toy binoculars, dog tag, sunglass, and silicone bracelets.
Each of them comes in traditional green camouflage. The backpack of durable, high-quality non-woven polyester is lightweight enough that kids can easily carry this tote backpack as well.
The dog tag is another exciting stuff of this set. The tag's length is 2 inches, and it is made of metal. The tag comes with a 24″ metal chain along with a clasp.
You can personalize the Dog Tag with your permanent marker. You also get a camouflage bracelet which is comprised of silicon. Again the sunglass and binocular are well-made to protect eyes from UV arrays.
The compass comes with a belt clip is placed on a soft piece of leather. Lastly, it also comes with an adjustable cap which is made of breathable fabric.
The cap is ideal for the kids because of having soft materials as well. Overall, this toy set can be an excellent gift for your beloved kid or others.
Backyard Safari represents authentic outdoor stuff named Backyard Safari Animal Caller. This animal caller can replicate the exact tone of five North-America's wildest and most majestic animals.
This safari caller can produce the sound of grizzly bears, gray wolf, American eagle, cougar, and the loon. This marvelous stuff is made of durable plastic, and it features a realistic growling bear head.
You will surely get amazed to hear the sensible sound of this backyard caller. To hear the sound, first, you need to choose an animal of which you want to hear by turning the picture dial.
And then you need to press the trigger to let it start. And of course, to get started, it requires 3 AAA batteries which are already included. However, besides the kids, youngsters can also use this caller to sneak up their friends.
Even some people use it to create awareness as well as interest in wildlife. So, you may purchase this caller to surprise your loved one.
If you are searching a handmade hunting tool which can provide the best shot, then you don't need to look much further.
aGreatLife has come up with a wood-carved slingshot that allows you to aim and shot accurately at your target. The manufacturer gives it the classic y-shaped design.
This y-shape is made from high-quality wood and painted with non-toxic paint. You get not only wooden grip with this slingshot, but also it reduces hand and wrist fatigue too.
Besides that, it has a bear sculpture which is placed on the slingshot. For shooting support, there is a well-tied and strong elastic band. This band renders an excellent resistance to generate the best shot.
In this set, you also get a hand-carved wood whistle which is made from solid wood and painted by hand with the maximum care.
Again for easy carrying, you get a cotton pouch. Overall, all these stuff are the sturdy, lightweight and versatile premium option to look at.
The Wild Adventure manufactures wild Adventure Turkey Hunter Action Figure. They are very well-known and reputed brand in making beautiful toys.
This turkey hunter toy features a realistic camouflage design. It is 12 inches long which is ideal as a toy size. The whole toy figure has 10 points of articulation so that user can bend and twist as per needed.
The limbs and arms are also bendable which can make the kids excited. In this toy box, you get other additional accessories including small turkeys, a rifle, and binocular as toys which allow multiple levels of plays. In a nutshell, the turkey action figure can be a fantastic gift to surprise anyone.
This is another excellent equipment which can be used as a hunting toy. The binocular can provide the users with a large field of view. And viewers can see clear as well as closer with this excellent binocular.
It features a 21mm objective diameter which provides 8x magnification. Besides that, it has BAK-4 prism and FMC Green Multicoated optics for the light transmittance.
So, users experience a high-quality view without the color difference. The binocular also features dual focus capability-one is in the right eyepiece and another is in the middle lens.
Aside from that, it has an adjustable focus-knob which is placed in the center of the binocular. And with this, users can adjust the binocular as well as control the parallax.
The binocular has an excellent design to look at. It is also comfortable to hold because it is made of a durable rubber coating. Being lightweight, kids can easily carry and use this for outdoor sports, tour, hiking as well as climbing. Overall, it can be an ideal gift for the kids, family, and friends.
If your child loves archery or wants to practice shooting, then this toy can match the requirement. Besides children, it is perfect for beginners as well. By playing this game, anyone can improve their overall hand and eye coordination.
The manufacturer uses environment-friendly and high-quality materials to build this archery set. And engineers use non-toxic Abs plastic to make it durable.
This set comes with a bow, three arrows, a target board, and a quiver. The bow has light up function and it requires 2AAA batteries (not included).
All arrows have rubber tips so that they can nimbly get attached to the target board. And the target board has a very realistic structure. This board is comprised of sturdy and supreme quality plastic.
Lastly, the quiver features a strap for easy carrying. All of this stuff has a pink color design. As a result, the archery set may be very much likely to girls. In a nutshell, this set can be the best gift idea for the children who are above 3 years.
If you ever experienced hunting, hiking or camping in a group, you probably know the importance of staying connected. In this case, cell networks can't always be a reliable option.
So, as an alternative option, you can use walkie-talkies. And of course, it should be the best walkie-talkies to get the best quality sound. To get the best features, you may choose AVALID Walkie Talkies.
Because these two-way radios can effectively access both the FRS and GMRS bands and their range is up to 5 km in the open places. Besides that, they have 22 channel PMR system for transmitting and receiving data.
And to control the data, it features an adjustable volume level, so you can mute any noise by adjusting. It also has two unique features to notice, and they are the vox mode and economy mode.
Vox mode allows transmitting the data automatically with a little loud. And the economy mode is mainly for saving the battery life when the device is not in use for 6 seconds.
This stuff has an LCD to show all the information such as channels, volume, vox, etc. For safety, there is a keypad lock and anti-lost strap which comes with a clip. So, you can attach the device with your belt.
It is small, lightweight, and fits in all hands. Overall, AVALID Walkie Talkies offers excellent features which may help you while doing outdoor activities and can be the best gift option for your kids as well.
Nerf toys can be a significant choice for children who want to learn the archery safely from an early age. By applying basic principles, they can grow their skill of archery.
In this case, ArtCreativity Monstrous bow and arrow set can encourage the young archery enthusiast. With this set, they can undoubtedly acquire and improve their skills.
The set comes with one bow which is made of high-quality plastic and three arrows. These arrows are comprised of foam, so they are entirely safe for the children. And the set is lightweight; therefore kids can easily play with this toy.
They can play individually or with friends. To shoot the arrow, users need to load the arrow to the bow then they need to grab the handle with one hand and pull back the arrow with another hand and finally release.
As we know, archery game does not only develop the physical power but also it improves the concentration power of the brain. So, assuredly it is an excellent game and exercises as well. And you may prefer the set of bow and arrows for yourself or others.
Gifts2U Tactical Vest Kit represent excellent craftsmanship of the company. The vest kit is made of high-quality two layered nylon. For that, it is sturdy, durable and lightweight.
The vest features breathable mesh fabric for ventilation, and it has elastic bandages for storage. You can attach the darts and clip storage with these bandages.
It also has an additional mesh pocket to keep the dart or other little accessories. The vest comes with an adjustable velcro strap so that it fits both children and adults.
The Tactical Vest Kit features lots of equipment such as a dart pouch, two wristbands, quick reload clip storage, two masks, a protective glass, and twenty soft darts.
The dart pouch has the ability to hold up 20 darts, and the pouch has comfortable belts along with lock catches. Wearing the stars and stripes mask, you will be considered as a member of justice.
And the skull mask refers to the evil members. Besides wearing the mask, you can also wear a protective glass. All features of the vest provide you with the full experience of hunting gear. And it is considered one of the best hunting toys as well. So, you may check this for children or yourself.
SainSmart Jr. Kids Bow and Arrow set is perfect for using as aim toys. This set consists of premium quality ABS material. Being sturdy, it also ensures the maximum durability.
The bow comes with automatic illumination and starts to glow while pulling the string. But for lighting up the bow, it requires 3 AAA batteries which are not included.
Yet, this fantastic feature of this bow is liked by the kids most. Aside from that, this archery set features five arrows and a quiver. All arrows have suction cups for secure attachment to the target board.
After finishing the game, kids can keep all those arrows to the quiver which features a comfortable strap for easy carrying. Overall, the set is excellent stuff to play indoors or outdoors.
As the market is flooded with a lot of options, so you have the opportunity to choose the suitable hunting toy that matches your needs. Although you can't use all of these stuff for real hunting, they play an essential role in improving your skill in hunting.
However, after researching and comparing with other toys, we were able to make a list of top ten hunting toys. And you can choose one or as per your need from the list for yourself or to give as a gift. We think our review will prove helpful to you for providing enough information to purchase the best hunting toys.


text:
93 176 34 701-855-577-94891-877-288-30371-877-288-3037
Call at 93 176 34 70Call at 1-855-577-9489Call at 1-877-288-3037Call at 1-877-288-3037
View More Excursions
€ 95 84
Meet your guide and start your tour with a short panoramic drive of Stockholm. Continue to the imposing City Hall, renowned for its architecture, murals and which is the site of the Nobel Prize Banquet. Completed in 1923, this building is the result of a 12 year effort by artists and craftsmen. Pass through the city center to the neighboring Island of Djurgarden, regarded as Stockholm's outdoor recreation center, with Grona Lund Tivoli, Skansen Open-Air Museum and extensive park lands beyond.
While on the island, visit the museum of the Swedish warship 'Vasa', once considered one of the world's largest and the pride of Sweden's mighty navy. The present museum is built around the 17th century warship which sank in Stockholm's inner harbor on her maiden voyage in 1628. Its discovery in 1956 and subsequent salvage in 1961 is one of the most important events in marine archaeology. Painstakingly restored to much of its original magnificence, 'Vasa' represents an authentic piece of living history. You'll also pass by the Old Town before returning to the pier.
Note: City Hall may close with short notice due to special events.
Best of Shanghai
Best of Tenerife


Analisis SWOT: Teknik Membedah Kasus Bisnis (Indonesian Edition): Books – Analisis swot teknik membedah kasus bisnis: reorientasi konsep perencanaan strategis untuk menghadapi abad 21 / Freddy Rangkuti. Analisis SWOT: Teknik membedah Kasus Bisnis Best sites with free public domain books to download. Summertime is prime time for getting a good read in.
For the middle term, it can also help in building strategic planning. Thus, teaching English by using the proposed syllabus for elementary schools students can significantly improve analisis swot teknik membedah kasus bisnis achievement.
Abstract The objectives of the present study are to 1 evaluate the current English syllabus of the fourth grade of elementary school by employing the SWOT analysis; 2 redesign current English syllabus based on such analysis; 3 evaluate the effectiveness of the proposed syllabus.
The proposed syllabus was tried out at the forth grade of St. The purpose of this study is to analisis swot teknik membedah kasus bisnis the appropriate strategy for the company and design systems to support the implementation of the strategy. Results menbedah the formulation of strategy are market penetration strategy. Kurikulum Standark Kompetensi Mata Menbedah. Recommended articles Citing articles 0.
The objectives of the present study are to 1 evaluate the current English syllabus of the fourth grade of elementary school by employing the SWOT analysis; 2 redesign current English syllabus based on such analysis; 3 evaluate the effectiveness of the proposed syllabus.
Teaching English to young Learners in Indonesia: Abstract The key to the success of a company does not only lie in the product or service being offered, but in how far the company's efforts in satisfying the needs of its customers.
Analisis swot teknik membedah kasus bisnis Learning the current condition of strength, weakness, opportunities, and threat SWOT can help a study program in a university in making a decision. Results of the system analysis, shows that problems faced by the company are caused by still not optimal customer services.
E-CRM system is considered to be the most appropriate in implementation of this strategy and overcoming the problems faced by the company. We have been doing a research to provide a software application that may facilitate study program stakeholders to conduct SWOT analysis more quickly and easily. Teknik membedah kasus bisnis, cetakan keenambelas, Jakarta: E-CRM system is expected to make analisis swot teknik membedah kasus bisnis easier for customers to order and get customer service, and also for prospective customers to access accurate company information.
Download full text in PDF Download. Statistika untuk penelitian, cetakan kesembilan, Bandung: Teknik Membedah Kasus Bisnis. Manajemen strategis — konsep, edisi sepuluh, Jakarta: Published by Elsevier B. The model was simplified into six stages: The present study applied research and development design which is proposed by Borg and Gall The system implements sentiment analysis approach to help classification process in constructing SWOT matrix.
The application is analisis swot teknik membedah kasus bisnis providing question-answer system that allow users reveal facts and conditions of their study program.
The result shows the significant achievement. Under a Creative Commons license.
Jakarta Suyanto, Kasihani, E. Cookies are used by this site. Learning the current condition of strength, weakness, opportunities, and threat SWOT can help a study program in a university in making a decision.
IV Analisis swot teknik membedah kasus bisnis 2 Juli Web-based e-CRM systems, focusing on the development and maintenance of long-term relationships with customers that can provide added value to both. Information collecting- this was done by using the SWOT analysis and the strategy of taking the advantages of the opportunities to overcome the weaknesses was adopted to redesign the syllabus, Developing preliminary form of product, Experts and lecturers validation, Product revision, Field testing, Producing final product.
Strategic management in action, cetakan kelima, Jakarta: User Username Password Remember me. It has been tested in try out session. The system adopts assessment criteria of standard accreditation system for Indonesian higher education institution.
Policy Implementation, and Reality. The key to the success of a company does not only lie in the product or service being offered, but in how far the company's efforts in satisfying the needs of its customers. The research shows that the application has a potential to help study program stakeholders to swof SWOT analysis. Analisis swot teknik membedah kasus bisnis more information, visit the cookies page.


There are 10 games on Friday's slate, with some especially interesting DFS matchups. Both Clippers at Suns and Knicks at Lakers could be full of value – the former due to pace and the latter due to injuries.
This contest is far from ideal from a game script perspective. The over/under is the third-lowest on the night, and the Jazz being favored by nine points represents the second-largest spread. A potentially low-scoring blowout makes Jazz players extra risky. Though, at the same time, a blowout shouldn't affect the Cavaliers' minutes – but will they score even 95 points? Both of these teams have been underperforming and volatile, making for few cash options.
I wouldn't be crossing this game off completely from a GPP perspective. Rubio's questionable tag could open up huge value for Dante Exum, who could trend near 10x value in this cakewalk matchup. On the Cleveland side, Friday's marks Tristan Thompson's second game back, and he could see an increase in workload. It's possible $6,000 will be his lowest price for the remainder of the season. The usual trio of Jordan Clarkson, Alec Burks and Rodney Hood have upside of 30 FP.
Kyrie Irving's absence continues to open up value on the Celtics, though picking which Celtic to deploy is a tough task. Terry Rozier and Jayson Tatum (and a much riskier option in Gordon Hayward) have upside for 40 FP, while the potential for 30-plus is there for the likes of Marcus Smart and Jaylen Brown. This game is a quality target for cash contests due to the established roles of many players.
Aside from the myriad of Boston players available, Dallas has interesting GPP options as well. Luka Doncic is playing at an All-Star level and is price almost always feels too low in my opinion. Both Doncic and Harrison Barnes have solid floors to work with. DeAndre Jordan and Dennis Smith Jr. are true GPP plays, seemingly alternating between boom and bust. Playing them simultaneously could make or break your night.
This game script is completely unenticing, and the spread would probably be closer to 10 in favor of the Pacers if the contest was being played in Indiana. Both of these squads are bottom 10 in pace, and Chicago's number is still being held up some by when Fred Hoiberg had them running and gunning. Still, for fantasy owners in cash contests, it's worth leaning on the Pacers considering their established roles, especially in the frontcourt.
Indiana has two players capable of going for 50-plus FP in Victor Oladipo and Myles Turner that can be utilized in GPPs. On the Chicago side, Lauri Markkanen and Kris Dunn have potential for 40-plus FP. There are a couple fliers worth checking out with Justin Holiday traded away, including Antonio Blakeney (four 20-plus FP outings) and Chandler Hutchison (starting at small forward, two 20-plus FP games).
Both of these teams are still trying to do everything they can to make the postseason, so I expect this to be a battle. There's plenty of value on the Wizards side with John Wall and Markieff Moris sidelined, and the likes of Bradley Beal, Thomas Bryant, Tomas Satoransky and Jeff Green can probably be deployed in both cash and GPP settings. Each player is more than capable of going for 5x value.
The Heat are a little tougher to read given the sheer amount of players available. Hassan Whiteside is grandfathered into GPP contention, while Justise Winslow, Dwyane Wade and Tyler Johnson make the cut too, but are at risk of posting real duds. Derrick Jones Jr. may be the most intriguing, as he's just $3,900 after combining for 64.2 FP over the past two outings.
Karl-Anthony Towns regressed Wednesday against the Celtics, "only" going for 51.9 FP after averaging 76.6 FP over the previous three contests. Boston's defense is notably tough, however, so I think it's fair to expect Towns to move back towards 60 FP again in this matchup against Orlando. He, along with the likes of Nikola Vucevic and Aaron Gordon – showing high floors lately – are worth exploring in both cash and GPPs. Jeff Teague's return diminishes Tyus Jones' value, though it would be unexpected to see Teague play close to 30 minutes.
I don't feel confident in many players for GPPs in this contest other than the aforementioned guys. Maybe you can take a flier on Evan Fournier or D.J. Augustin to separate yourself from the pack. I wouldn't take the risk if I was making just one lineup.
A low over/under doesn't make this game appealing, and it was tough for me to identify anyone other than Marc Gasol who I'd want in a cash setting. Mike Conley would normally fall into that category, but his injury gives me pause for anything other than GPPs.
Still, if you run multiple GPPs lineups, you'll probably want to target players from this game to have at least some minimal exposure to. D'Angelo Russell is a tournament staple, but the other names would scare me off if I was making just one lineup. Jaren Jackson Jr, Kyle Anderson and Jarrett Allen can technically go for 40 FP, but it's so few and far between that the idea of paying around $6K is not enticing. Same goes for the remainder of players mentioned above, but with upper-20s to low-30s FP potential.
This contest has the biggest blowout potential on the slate, though that shouldn't affect the minutes for the Hawks, who are in the midst of a tank. It does make deploying Bucks players risky, however. Still, the high total could help make up for it, so I wouldn't be scared off this matchup completely on the Milwaukee side. There are a variety of cash plays on each team, as each squad has established a core group of players.
The GPP plays are pretty standard too, as there aren't any new injuries opening up value. Eric Bledsoe remains one of my favorite tournament plays at his price with 40-plus FP upside, and I don't exactly trust Trae Young to keep Bledsoe in check. Alex Len has been putting in work in limited action as well, with 79.6 FP over the past two games in 51 total minutes.
There are essentially no injuries to keep track of in this contest, so things are relatively straightforward. Ultimately, this is a contest I'll be looking to target due to a close spread and a sky-high over/under. Plus, I think there is tons of value to be had in both cash and GPP, as a variety of players seem to be priced right on target.
Of note, Devin Booker, Deandre Ayton, Tobias Harris, Danilo Gallinari and Lou Williams are all priced low enough for both types of contests. T.J. Warren remains one of my favorite GPP options, and he's only more enticing in this high-paced affair. Despite being just $6,200, the forward has seven performances with at least 40 FP – three of which have come since Dec. 17.
There is a ridiculous amount of potential value in this tilt, especially if Kyle Kuzma ends up sidelined. His absence would make Josh Hart, Brandon Ingram, Lonzo Ball and Kentavious Caldwell-Pope extremely intriguing GPP options – more than they already are. Hart and the consistent trio of Knicks players – Emmanuel Mudiay, Noah Vonleh and Kevin Knox – also make for solid cash options. Luke Kornet recently emerged, but he could function as a cash option too if you don't mind the small sample size.
The amount of GPP plays are almost overwhelming, and fantasy owners making multiple lineups will want tons of exposure. Fantasy owners with three or fewer lineups may want to stick with the GPP options with higher floors – guys who could also be deployed in cash settings.
Nothing is out of the ordinary in here in what should be charged matchup between two teams looking to establish themselves among the top tier of the Western Conference. There are essentially no injuries to report, and all the usual suspects are in play, with Russell Westbrook, Paul George and Steven Adams representing options for both GPPs and cash.
Those looking for some more risk might look towards Jerami Grant and Maurice Harkless. Grant has four games with at least 30 FP over the past seven, but has outings of 21.4 FP and 18.4 FP sprinkled in there as well. Harkless has been over 30 FP in his past three appearances, but averaged 14.7 FP prior.