When last we heard from early-bird Ward 3 council candidate Jonathan Rees, he was spamming Craigslist and papering my neighborhood with campaign posters. He's still up to those things (see some of the Craigslist posts and fallout), and his campaign site (available at both www.rees-for-citycouncil.com and the oddly generic www.dc2006.net) still reminds me of the Time Cube site, but things have gotten weirder recently.
Now that current Ward 3 councilmember Kathy Patterson is planning to run for council chair, Sam Brooks has entered the Ward 3 race. Recently someone has been posting white-supremacist and anti-gay messages on Craigslist and other forums under Brooks's name, as reported in the Post and the Blade. Rees denies any connection to the messages.
But some newer anti-Brooks messages have Rees's fingerprints all over them.
Once again, they're in various sections of Rees's favorite place to spam, Craigslist. This time they concentrate on accusing Brooks of election fraud (apparently because he only recently moved to Ward 3, something that according to DC law he doesn't even have to do until he wins the primary) and claiming that the Post and the City Paper declared Brooks unqualified last year when he ran for an at-large seat (because they endorsed other candidates, who were not of course Rees). The posts are interspersed with posts that seem to be from the Rees campaign, but that's no evidence of their author.
The Washington Post & City Paper Says No To Sam Brooks!
Would you marry a man who does not have a stable work history let alone date one?
Would you vote for a 27 year old man who still mooches off his mother?
Is this the kind of man?
You would want as your Next Councilman?
The page has the same (lack of) design as Rees's site and like his site shows signs of having been created with Microsoft Word 2002. The source code of the page contains comments listing the creator's company as "Rees for DC City Council", just like Rees's own page, but the author as Sam Brooks. That still would be easy enough to forge if you wanted to go to the trouble.
The more damning evidence is the site the page is hosted on. The site is for Executive Dental Service, and the domain is registered to Michael Griffiths of 3100 20th Street NE (the zip code is part of the domain). Griffiths is the dentist who runs Institutional Dental Care at that address, and Rees is the business manager there.
So Rees is behind these posts attacking Brooks, unless someone is going to a great deal of trouble to construct false clues to make it look like he is. I'm betting on the simpler explanation, considering Rees's past behavior and the general vibe his acknowledged writings give off.
The primary is still ten months away, so there's plenty of time for the Ward 3 campaign to get worse. Joy!
Yeah, what's the deal with the guy? I've had to spend a lot of time removing his crap, and am tempted to turn it over to the cops.
Thanks for stopping by, Craig, and I wish you luck in ridding yourself of the annoyance. Maybe you should get together with Sam Brooks and pool your resources to get the guy (though unfortunately it's probably more trouble than it's worth).
I should just note that you don't often post a note about Craig's List, when Craig Newmark stops by. Way Cool.
On the campaign ad, I happened to be taking a break from watching "Bush's Brain." The similarity to a Rove campaign is kind of freaky.
hey, cool research, i'm glad you found some stuff about it. how bizarre.
might be behind the smear campaign just to get some free press.
I have never seen a campaign where both sides aren't bad mouthing each other.
Keith I do not believe for one minute that you are who you say you are.
I believe that you are someone associated with the Brooks campaign and your side is just as guilty as Rees' side of this internet crap and everything else.
Thus you are not fooling anyone or convincing about your man Brooks.
When I vote, I usually go with the Democratic candidate in a primary who has the best educational level and the most years of experience in the political arena and guess what, your man Brooks comes up short in a big way.
Thus unless someone else comes along who has impressive credentials, I will chose the lesser of the evils and go with Rees.
Based on this posting on CL http://washingtondc.craigslist.org/com/109424370.html , I heard that Mr. Epstein has refused calls from news reporters and Mr. Marshall admits what he did but denies that he was doing it in conjunction with any candidate.
I was wondering how long it would take you to arrive.
Note to readers: "Gloria Guiterrez" and "Leonardo Green" are posting from the same IP address. They are at best cooperating and at worst one person posting under two names. I'm happy that they've revealed that by posting here, where I have access to the logs, as I suspected that the Rees supporters seen in various web forums weren't actually as numerous as they appeared.
I have no connection with Sam Brooks or any other council candidate. I researched the antics of Jonathan Rees and his supporters this weekend only after becoming curious about the Craigslist posts. I know nothing about Rees other than what I've seen on his own website and in Internet postings by his supporters. If he is unhappy about people's reactions to his advertising content and methods, he has only himself to blame — not some conspiracy of Brooks backers.
Rees's supporters have not responded to the most damning part of my post: the evidence that the amateurish "Ladies!" page was created by Rees's campaign, not by Brooks trying to make Rees look bad. Now, it's not illegal to produce such a silly piece of propaganda, but it certainly calls into question a candidate's professionalism and fitness for office.
My opponent in a published interviews in DC states that the only reason that he is running for public office right out of college and does not need any work experience in all the right areas to hold an important position on our DC City Council is because his mother told him he did not have to and that he was destined for greatness!
I have gotten out and literally walked every street of Ward 3 to hand out my political flyer and completed all of Ward 3 in under three months to get my message to voters and Sam Brooks has yet to get out and his strategy to get known is to manufacture/self-inflict wrongs to gain media attention.
While I humbly do my thing not taking anything for granted, Sam Brooks treks around DC with an aurora of arrogance, abrasive treatment of people, intimidating tactics and advocates a socio-political agenda liking to the era of Marion Barry and his economic policies which caused our economic calamity and the seizing of our government by a federal control board.
My opponent's philosophy is that of a these great but failed programs of the past but due to his lack of any real work experience, and what he advocates, would bankrupt our city and doesn't address our history of gross mismanagement of all forms of resources.
Sam Brooks has no original ideas and like his senior year thesis on Marion Barry, his entire career has been a cut and pasting from the hard work others.
1. The District deserves a better choice for city council.
2. He doesn't come anywhere close in the needed experience overall in representing the city.
3. He is long on energy and ambition but short on community service, and lacks substantive knowledge of the problems confronting the city and ideas for solving them.
4. The District needs someone who knows how the government works, is familiar with the city other than through a political door-to-door campaign and who doesn't need on-the-job training in the basics.
Sam Brooks talks about his youth and compares himself to Adrian Fenty but the big difference is, Adrian Fenty had an education in the right area to serve in government and Sam Brooks does not; Adrian Fenty had four to five years of work experience under his belt and Sam Brooks does not and can't hold any job for long as the public record supports and Sam Brooks reminds people of many young people just out of college that walk through the door with no real work history believing they should be paid $50k to begin with only to get a chuckle.
"Ward 3 D.C. Council candidate Sam Brooks might consider putting in a call to New York Sen. Hillary Rodham Clinton for some campaign advice".
That 91% of all Ward 3 voters SAID NO TO SAM BROOKS.
That 99% of all African American voters SAID NO TO SAM BROOKS.
That 96% of all Latino voters SAID NO TO SAM BROOKS.
That 81% of all Caucasian voters SAID NO TO SAM BROOKS.
That 87% of all GLBT voters SAID NO TO SAM BROOKS.
Sam Brooks' website talks of a great future for us, what he would like to see take place but it totally lacks any specifics as to how he would achieve anything.
My platform is one that says that until we reign in the gross mismanage- ment of all levels of DC Government we cannot begin to achieve any of the goals we have set down like improving our schools, better healthcare, lower taxes, luring in and keeping people and business, and addressing other things like crime and it is very specific.
The bottom line is, the voters have a choice between a candidate educated in management with over twenty (20) years at it (vs.) a candidate with no such education and less than 1 ½ years of any work experience whatsoever.
In sum, when you look carefully at the two candidates, it is night and day but to even think of electing a person with no real work history like Sam Brooks own Résumé shows, a work history where he can't sit still and stay for long on any job, who talks a lot about what we should do but he has never bothered to jump into the trenches and actually do any of what he advocates and then asks you to vote for and trust him is like asking you to play a form of [Reverse Russian Roulette] where all the chambers but one are full of bullets.
Yes sir, we are all over here at PG County Hospital at a meeting of health care professionals including the front runner Rees who got a better rating on the yearly score card for DC political candidates above the mayoral ones from the American Medical Association and the American Civil Libterities Union and other candidates are here too. So we all thought we would mess with your head Keith.
Interesting that "Gloria" is appearing here. I noted on the DC Pages, Politics section that "Gloria" has posted twice. Once as "Gloria" and once as Rees himself.
When will the real Gloria/Rees/Alex multiple personality disorder stand up?
I moderate the Cleveland Park Listserv, www.cleveland-park.com, Washington, DC's largest neighborhood email list. We've had to ban Jonathan Rees and his numerous aliases from our listserv. Rees has tried –mostly unsuccessfully– to spam our email list many times under many different identities.
I'd be happy to work with Craig Newmark and any other list owners to help put a stop to this spammer.
Not surprisingly, the comment from Jonathan Rees and the third comment from "Leonardo Green" came from the same IP address as the earlier comments.
Thanks, Bill, for keeping the Cleveland Park list free of this junk. I've been a subscriber for some time. You and Craig might want to talk to the admin at DC Pages. They've had the Rees spam problem there too, mainly in DC Politics but also in various irrelevant categories.
I guess Jonathan Rees really believes there's no such thing as bad publicity. We'll find out over the coming months whether that's true.
You've really done an impressive research job, and a great service to DC.
neighborhood or a little bit of mud slinging. He seems a bit mentally unstable.
This is so bizarro. He's posting on the Logan Circle list serve too (or, "Gloria" is), but Logan Circle isn't even in Ward 3! Why not post on gwhoops.com or something also, weirdo.
it's interesting to read about some local crazy people.
If it weren't for the fact that he's become a notorious spammer, Rees' posts would be laughable.
Contempt for sending an Email?
with the judiciary would infringe on Rees' right to free speech.
the DCist.com comment thread on their post about this is hilarious, if you haven't seen it already.
Wow, and I thought DCDL was a sleepy, relaxed kinda place! Turn my back for a week of personal drama and I miss all the fun!!
I guess it is Mr. Rees and all of his aliases conversing 24/7.
It totally is! Well, except for one brave soul who's actually tried to engage the alters in rational discussion. Once you realize that it's all Rees talking to Rees, basically, it's like the best comedy series ever!
When will a real reporter reveal what's behind the curtain? It's got to be a good story.
Check out his loony group today. He's posted a creepy account of how his round-the-clock spamming Craigslist non-political forums (and ad hominem attacks on other people's blogs) has resulted in his being 'attacked." See, HE wasn't wrong for violating posting policies. He's actually the VICTIM, see? HIS attacks weren't attacks, but the responses to them are. And HIS spam isn't spam at all.
It's eerily similar to the way people with borderline personality disorder respond when criticised.
I'm closing comments on this post. The anti-Rees commenters are becoming nearly as obsessive as Rees himself (and who knows, maybe they're all part of the same "there's no such thing as bad publicity" campaign). Those interested in Rees's latest antics can check out DCist or Craigslist or whoever he's plaguing at the moment. If there are ever interesting new developments, maybe I'll make a new post.


The first step before departing on a trip is to pack, and with the holiday season rolling in, you may be loading up your suitcase more often than not. Love or hate it, if done right, this pre-travel task can be an easy way to start your vacation off on a high note. The key is to make your travel experience as close to first class as you can by assembling what will become your go-to arsenal of carry-on travel essentials — and it's easier than you'd think.
The hustle and bustle of the airport and the uncomfortable nature of a plane can all contribute to a less-than-pleasurable beginning to your trip. Securing items to give you the luxury travel vibe (without paying hefty airfare) is a surefire way to upgrade your overall in-flight experience. Begin by looking for items that can easily be tucked away into your carry-on when not in use, but will provide the comfort you seek when you're 35,000 feet in the air.
No matter how long or short your trip is, there's nothing like being able to catch some Z's while flying. A must-have item to help you in securing some shut-eye is an eye mask. Toss your old cotton styles and treat your skin to silk this season with the Slipsilk Pure Silk Sleep Mask for $50. Flights can leave your skin feeling dehydrated, but the Mulberry silk absorbs less moisture and will allow your skin to breathe, leaving you fresh-faced for landing.
For the ultimate sleep, pair your eye mask with a silk pillowcase. For only $59, slide your pillow into a silk case from Brooklinen to bring a bit of home on your travels. This soft case will not only provide for a more restful flight, but will keep your face feeling cool and your hair smooth.
Airplanes are notoriously chilly, which can lead you to a lot of shifting around in your seat or digging through your luggage for anything to keep you warm. This year, be prepared and have a cozy layer within easy reach. A cashmere wrap that can double as a blanket, like this one from Naked Cashmere for $250, is a piece that'll become your travel companion for domestic to international jaunts. Drape this luxe style over your shoulders as you head through the terminal for an effortless airport look and wrap it around you as you prepare for takeoff.
If you haven't blocked out the unpredictable noise of an airplane, you surely won't be feeling relaxed. A sleek pair of headphones is a necessary purchase to ensure you're able to sleep soundly or listen to music without interruption. Bang & Olufsen's H9i will not only take care of the sound, but do the job in style. The leather trimmed headphones have built-in memory foam pads with control buttons allowing you to answer a call, change a song, or turn up the volume with ease. These features make this style especially handy when moving through the airport. Plus, the wireless design means no more tangled cords in your carry-on.
Before you head to the airport, up your travel game by shopping carry-on essentials that are sure make your seat mates jealous and help you actually enjoy those crowded flights.
Just because you are flying doesn't mean you can't sleep on silk. This style will have you feeling cool and comfortable as you travel.
A sleep mask is a key component to feeling rested and refreshed when you land. This style is available in three additional colors.
Get cozy in this cashmere wrap. It'll keep you warm from takeoff to landing.
Upgrade your old carry-on bag to this luxe, sleek style.
Block out all the noise and sleep peaceful with a stylish pair of headphones.
You'll want to take off your shoes and slip on a pair of these cashmere socks before the plane is in the air.
For longer flights, pull on these soft sweatpants before you board for extra comfort.
This clear case will make locating your hand cream and sheet masks for in-flight pampering a breeze.


text:
Sunny Piggy is a 2000 Chinese romantic fantasy comedy-drama television series. It stars Xu Zheng as Zhu Bajie, a foolish pig (and farting machine) who wanted to become human, and Tao Hong as a kindhearted dragon princess who loved him unconditionally until her death. Most characters, including Zhu Bajie, are taken from the 16th-century novel Journey to the West and Chinese mythology.

The series was filmed in 1999 jointly by Jiangsu Television, Zhejiang Television, Sichuan Television and Dragon Television, in conjunction with Suzhou Southern Pai Culture Media, China Federation of Literary and Art Circles Publishing Corporation, and Sky Creation. Copyrights were sold to 13 national television stations, which began broadcasting it almost simultaneously in January 2000.

It achieved ratings over 30% in several provinces, prompting over 20 smaller local stations to show its reruns. Xu Zheng, virtually unknown before the series, rode its popularity to stardom. He and Tao Hong became close friends, and eventually married in 2002.

The show has since spawned several sequels and remakes.

Cast
 Xu Zheng as Zhu Bajie (Pig)
 Xu Zheng also portrayed Zhu Fengchun, Zhu Bajie's owner whose body Zhu Bajie possessed
 Tao Hong as Xiaolongnü (Dragon Maiden)
 Yvonne Yung as Cat Devil
 Yvonne Yung also portrayed Miaomiao, a girl whose body Cat Devil possessed
 Chu Chung-heng as Sun Wukong (Monkey)
 Jin Qiaoqiao as Dragon Maiden's sister
 Lee Li-chun as Dragon King of the East Sea
 Chen Hong as Chang'e (Moon Goddess)
 Sun Xing as Taibai Jinxing (Great White Golden Star)
 Wang Bozhao as Jade Emperor
 Dai Chunrong as Xi Wangmu (Queen Mother of the East)
 Liu Xiaofeng as Wu Gang
 Kou Zhanwen as Houyi
 Lin Jifan as Taishang Laojun (Grand Supreme Elderly Lord)
 Xu Zhen as Erlangshen
 Zhu Jingui as Turtle
 Li Zhigui as Yue Lao (Old Man Under the Moon)
 Doze Niu as Dragon King of the North Sea

International broadcast
 China – Beijing Television, Tianjin Television, Shanghai Television, Jiangsu Television, Guangdong Television, Fujian Television, Sichuan Television, Anhui Television, Shanxi Television, Hebei Television, Nei Mongol Television etc. — January/February 2000
 Taiwan - Eastern Television (ETTV Variety) — July 2000
 Hong Kong - Asia Television (ATV Home) — May 2001
 Vietnam - Vĩnh Long Television (THVL) — June 2011

Sequels and remakes
Producer Fan Xiaotian, who became known as the Piggy Godfather, has since produced 4 live-action TV series and a number of animation TV series derived from the series.
These include:
 Lucky Piggy (福星高照豬八戒), a 2004 sequel, starring Huang Haibo as Zhu Bajie, also starring Fan Bingbing and Han Xue.
 Happy Piggy (喜氣洋洋豬八戒), a 2005 sequel to the 2004 series, starring Gao Hongxian as Zhu Bajie
 Sunny Piggy, a 2006 animation remake
 Sunny Piggy 2, a 2010 sequel, also an anime series
 Sister Sunny Piggy (春光燦爛豬九妹), a 2011 spin-off, starring Joe Chen as Zhu Jiumei (Zhu Bajie's female version)
 The Happy Marshal (春光燦爛之歡樂元帥), a 2012 remake, starring Leo Ku as Zhu Shuaishuaige (essentially the same character as Zhu Bajie), also starring Charlene Choi and Gillian Chung.

However, none of them was nearly as popular or well-received as the original.

References

2000 Chinese television series debuts
2000 Chinese television series endings
Chinese comedy-drama television series
Television shows based on Journey to the West
Mandarin-language television shows

redpajama_set_name: RedPajamaWikipedia


Hermetic Solutions Group Acquires Sinclair Manufacturing Co.
The Partners of ShoreView Industries are pleased to announce that Hermetic Solutions Group, LLC ("HSG"), a ShoreView portfolio company, has acquired Sinclair Manufacturing Co. ("Sinclair").
Based in Norton, Massachusetts, Sinclair designs and manufactures hermetic packaging solutions for the aerospace & defense, medical, telecom and industrial end markets. Sinclair's products are complementary to HSG's existing portfolio and include hermetic packages, connections and feedthrus, and headers. The addition of Sinclair expands HSG's manufacturing capabilities and provides cross-selling opportunities within the combined customer base.
ShoreView assisted HSG in its acquisition of Sinclair. This represents the third acquisition for HSG during ShoreView's ownership period.


text:
Home | Press Centre | Press Releases
OXFAM and the Aga Khan Foundation establish 5 ECD centres in Khatlon, Tajikistan.
OXFAM and the Aga Khan Foundation establish 5 ECD centres in Khatlon, Tajikistan
In an effort to increase the number of Early Childhood Development (ECD) centres and contribute to the implementation of national educational programmes, OXFAM and the Aga Khan Foundation (AKF) established five ECD centres in Tajikistan.
AKTC receives two awards, for Sustainable Development and Excellence, from UNESCO
The Aga Khan Trust for Culture has won two important awards from UNESCO's Asia-Pacific regional office – for cultural heritage conservation and sustainable development – in Delhi's Sunder Nursery. The prizes include the 2020 Award for Special Recognition for Sustainable Development and the 2020 Award for Excellence.
AKTC completes conservation works on Abdur Rahim Khan-i-Khanan's Mausoleum in Delhi
The Aga Khan Trust for Culture (AKTC), in partnership with the Archaeological Survey of India and the InterGlobe Foundation, completed the conservation of Abdur Rahim Khan-i-Khanan's Mausoleum in Delhi, India, on 17 December 2020.
Aga Khan Agency for Habitat wins World Habitat Awards Gold Award
The Aga Khan Agency for Habitat won the World Habitat Awards 2020 Gold Award today for its "Integrating Indigenous Knowledge and Technology for Safer Habitat" project.
Aga Khan reaffirms commitment to Afghan peoples and to a peaceful, pluralistic Afghanistan
Environment and climate (2) Apply Environment and climate filter
Financial inclusion (1) Apply Financial inclusion filter
Historic Cities (9) Apply Historic Cities filter
Humanitarian Assistance (3) Apply Humanitarian Assistance filter
Industrial Development (1) Apply Industrial Development filter
Infrastructure development (3) Apply Infrastructure development filter
(-) Remove Burundi filter Burundi
Democratic Republic of Congo (2) Apply Democratic Republic of Congo filter
Egypt (15) Apply Egypt filter
(-) Remove Ivory Coast filter Ivory Coast
Mali (17) Apply Mali filter
Syria (22) Apply Syria filter
United States of America (45) Apply United States of America filter
Aga Khan Agency for Microfinance (1) Apply Aga Khan Agency for Microfinance filter
Aga Khan Trust for Culture (18) Apply Aga Khan Trust for Culture filter
Electricity expansion begins at Azito Power Station in Côte d'Ivoire
Setting a global benchmark for regional power generation
Improving quality of life of women through menstrual health management and awareness programmes
Aga Khan Agency for Habitat and UN-Habitat in partnership
Aga Khan Academies celebrate graduating 1,000 global leaders
The Aga Khan Agency for Habitat participates in an emergency response exercise related to earthquakes in India
His Highness the Aga Khan meets with Governor and Chief Minister of Maharashtra on last day of 10-day visit to India
His Highness the Aga Khan arrives in Mumbai
Aga Khan meets with Governor of Andhra Pradesh and Telangana and Deputy Chief Minister of Telangana in Hyderabad
Aga Khan arrives in Ahmedabad, Gujarat on second stop of his 10-day official visit to India

redpajama_set_name: RedPajamaCommonCrawl


I am originally from Valdosta, GA. I took gymnastics for 5 years and have been coaching gym since 1983 (and at the YMCA since 1985). I am the current Head Team Coach. I have traveled all over the United States for Training Workshops & competitions. I have been to Reno, Indianapolis, Phoenix, Nassau, Bahamas, Tampa, Tallahassee, Atlanta, Moultrie, Savannah, Valdosta , Pennsylvania, Tennessee, Jacksonville, Thomasville, Washington and Michigan and have had gymnasts win championship titles at local, state, regional and national competitions. My husband Jeff and I have two sons, T.J., Matt and a daughter, Rylie and a grand-daughter, Amelia. My hobbies include crafty projects, biking and spending time with my family and animals. I have coached all levels from Pre-School to Level 9. I graduated Valdosta Technical College with a degree in Cosmetology (1986) and Computerized Accounting(1994) but my love of gymnastics has always kept me at the YMCA. . I currently hold the following certifications: USAG Professional Membership, Skill Evaluator, Womens Meet Director, KAT (Kinder Accreditation for Teachers), MELPD (Movement Education Lesson Plan Development), Safety and Risk Management, Fundamentals of Gymnastics Instruction, School of Recreational Gymnastics Director and USA Gymnastics University Instructor.


text:
var Angle = require('../math/angle/Between');
var Class = require('../utils/Class');
var Distance = require('../math/distance/DistanceBetween');
var FuzzyEqual = require('../math/fuzzy/Equal');
var SmoothStepInterpolation = require('../math/interpolation/SmoothStepInterpolation');
var Vector2 = require('../math/Vector2');

/**
 * @classdesc
 * A Pointer object encapsulates both mouse and touch input within Phaser.
 *
 * By default, Phaser will create 2 pointers for your game to use. If you require more, i.e. for a multi-touch
 * game, then use the `InputPlugin.addPointer` method to do so, rather than instantiating this class directly,
 * otherwise it won't be managed by the input system.
 *
 * You can reference the current active pointer via `InputPlugin.activePointer`. You can also use the properties
 * `InputPlugin.pointer1` through to `pointer10`, for each pointer you have enabled in your game.
 *
 * The properties of this object are set by the Input Plugin during processing. This object is then sent in all
 * input related events that the Input Plugin emits, so you can reference properties from it directly in your
 * callbacks.
 *
 * @class Pointer
 * @memberof Phaser.Input
 * @constructor
 * @since 3.0.0
 *
 * @param {Phaser.Input.InputManager} manager - A reference to the Input Manager.
 * @param {integer} id - The internal ID of this Pointer.
 */
var Pointer = new Class({

    initialize:

    function Pointer (manager, id)
    {
        /**
         * A reference to the Input Manager.
         *
         * @name Phaser.Input.Pointer#manager
         * @type {Phaser.Input.InputManager}
         * @since 3.0.0
         */
        this.manager = manager;

        /**
         * The internal ID of this Pointer.
         *
         * @name Phaser.Input.Pointer#id
         * @type {integer}
         * @readonly
         * @since 3.0.0
         */
        this.id = id;

        /**
         * The most recent native DOM Event this Pointer has processed.
         *
         * @name Phaser.Input.Pointer#event
         * @type {(TouchEvent|MouseEvent)}
         * @since 3.0.0
         */
        this.event;

        /**
         * The DOM element the Pointer was pressed down on, taken from the DOM event.
         * In a default set-up this will be the Canvas that Phaser is rendering to, or the Window element.
         *
         * @name Phaser.Input.Pointer#downElement
         * @type {any}
         * @readonly
         * @since 3.16.0
         */
        this.downElement;

        /**
         * The DOM element the Pointer was released on, taken from the DOM event.
         * In a default set-up this will be the Canvas that Phaser is rendering to, or the Window element.
         *
         * @name Phaser.Input.Pointer#upElement
         * @type {any}
         * @readonly
         * @since 3.16.0
         */
        this.upElement;

        /**
         * The camera the Pointer interacted with during its last update.
         *
         * A Pointer can only ever interact with one camera at once, which will be the top-most camera
         * in the list should multiple cameras be positioned on-top of each other.
         *
         * @name Phaser.Input.Pointer#camera
         * @type {Phaser.Cameras.Scene2D.Camera}
         * @default null
         * @since 3.0.0
         */
        this.camera = null;

        /**
         * A read-only property that indicates which button was pressed, or released, on the pointer
         * during the most recent event. It is only set during `up` and `down` events.
         *
         * On Touch devices the value is always 0.
         *
         * Users may change the configuration of buttons on their pointing device so that if an event's button property
         * is zero, it may not have been caused by the button that is physically left–most on the pointing device;
         * however, it should behave as if the left button was clicked in the standard button layout.
         *
         * @name Phaser.Input.Pointer#button
         * @type {integer}
         * @readonly
         * @default 0
         * @since 3.18.0
         */
        this.button = 0;

        /**
         * 0: No button or un-initialized
         * 1: Left button
         * 2: Right button
         * 4: Wheel button or middle button
         * 8: 4th button (typically the "Browser Back" button)
         * 16: 5th button (typically the "Browser Forward" button)
         *
         * For a mouse configured for left-handed use, the button actions are reversed.
         * In this case, the values are read from right to left.
         *
         * @name Phaser.Input.Pointer#buttons
         * @type {integer}
         * @default 0
         * @since 3.0.0
         */
        this.buttons = 0;

        /**
         * The position of the Pointer in screen space.
         *
         * @name Phaser.Input.Pointer#position
         * @type {Phaser.Math.Vector2}
         * @readonly
         * @since 3.0.0
         */
        this.position = new Vector2();

        /**
         * The previous position of the Pointer in screen space.
         *
         * The old x and y values are stored in here during the InputManager.transformPointer call.
         *
         * Use the properties `velocity`, `angle` and `distance` to create your own gesture recognition.
         *
         * @name Phaser.Input.Pointer#prevPosition
         * @type {Phaser.Math.Vector2}
         * @readonly
         * @since 3.11.0
         */
        this.prevPosition = new Vector2();

        /**
         * An internal vector used for calculations of the pointer speed and angle.
         *
         * @name Phaser.Input.Pointer#midPoint
         * @type {Phaser.Math.Vector2}
         * @private
         * @since 3.16.0
         */
        this.midPoint = new Vector2(-1, -1);

        /**
         * The current velocity of the Pointer, based on its current and previous positions.
         *
         * This value is smoothed out each frame, according to the `motionFactor` property.
         *
         * This property is updated whenever the Pointer moves, regardless of any button states. In other words,
         * it changes based on movement alone - a button doesn't have to be pressed first.
         *
         * @name Phaser.Input.Pointer#velocity
         * @type {Phaser.Math.Vector2}
         * @readonly
         * @since 3.16.0
         */
        this.velocity = new Vector2();

        /**
         * The current angle the Pointer is moving, in radians, based on its previous and current position.
         *
         * The angle is based on the old position facing to the current position.
         *
         * This property is updated whenever the Pointer moves, regardless of any button states. In other words,
         * it changes based on movement alone - a button doesn't have to be pressed first.
         *
         * @name Phaser.Input.Pointer#angle
         * @type {number}
         * @readonly
         * @since 3.16.0
         */
        this.angle = 0;

        /**
         * The distance the Pointer has moved, based on its previous and current position.
         *
         * This value is smoothed out each frame, according to the `motionFactor` property.
         *
         * This property is updated whenever the Pointer moves, regardless of any button states. In other words,
         * it changes based on movement alone - a button doesn't have to be pressed first.
         *
         * If you need the total distance travelled since the primary buttons was pressed down,
         * then use the `Pointer.getDistance` method.
         *
         * @name Phaser.Input.Pointer#distance
         * @type {number}
         * @readonly
         * @since 3.16.0
         */
        this.distance = 0;

        /**
         * The smoothing factor to apply to the Pointer position.
         *
         * Due to their nature, pointer positions are inherently noisy. While this is fine for lots of games, if you need cleaner positions
         * then you can set this value to apply an automatic smoothing to the positions as they are recorded.
         *
         * The default value of zero means 'no smoothing'.
         * Set to a small value, such as 0.2, to apply an average level of smoothing between positions. You can do this by changing this
         * value directly, or by setting the `input.smoothFactor` property in the Game Config.
         *
         * Positions are only smoothed when the pointer moves. If the primary button on this Pointer enters an Up or Down state, then the position
         * is always precise, and not smoothed.
         *
         * @name Phaser.Input.Pointer#smoothFactor
         * @type {number}
         * @default 0
         * @since 3.16.0
         */
        this.smoothFactor = 0;

        /**
         * The factor applied to the motion smoothing each frame.
         *
         * This value is passed to the Smooth Step Interpolation that is used to calculate the velocity,
         * angle and distance of the Pointer. It's applied every frame, until the midPoint reaches the current
         * position of the Pointer. 0.2 provides a good average but can be increased if you need a
         * quicker update and are working in a high performance environment. Never set this value to
         * zero.
         *
         * @name Phaser.Input.Pointer#motionFactor
         * @type {number}
         * @default 0.2
         * @since 3.16.0
         */
        this.motionFactor = 0.2;

        /**
         * The x position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
         *
         * If you wish to use this value _outside_ of an input event handler then you should update it first by calling
         * the `Pointer.updateWorldPoint` method.
         *
         * @name Phaser.Input.Pointer#worldX
         * @type {number}
         * @default 0
         * @since 3.10.0
         */
        this.worldX = 0;

        /**
         * The y position of this Pointer, translated into the coordinate space of the most recent Camera it interacted with.
         *
         * If you wish to use this value _outside_ of an input event handler then you should update it first by calling
         * the `Pointer.updateWorldPoint` method.
         *
         * @name Phaser.Input.Pointer#worldY
         * @type {number}
         * @default 0
         * @since 3.10.0
         */
        this.worldY = 0;

        /**
         * Time when this Pointer was most recently moved (regardless of the state of its buttons, if any)
         *
         * @name Phaser.Input.Pointer#moveTime
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.moveTime = 0;

        /**
         * X coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
         *
         * @name Phaser.Input.Pointer#downX
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.downX = 0;

        /**
         * Y coordinate of the Pointer when Button 1 (left button), or Touch, was pressed, used for dragging objects.
         *
         * @name Phaser.Input.Pointer#downY
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.downY = 0;

        /**
         * Time when Button 1 (left button), or Touch, was pressed, used for dragging objects.
         *
         * @name Phaser.Input.Pointer#downTime
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.downTime = 0;

        /**
         * X coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
         *
         * @name Phaser.Input.Pointer#upX
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.upX = 0;

        /**
         * Y coordinate of the Pointer when Button 1 (left button), or Touch, was released, used for dragging objects.
         *
         * @name Phaser.Input.Pointer#upY
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.upY = 0;

        /**
         * Time when Button 1 (left button), or Touch, was released, used for dragging objects.
         *
         * @name Phaser.Input.Pointer#upTime
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.upTime = 0;

        /**
         * Is the primary button down? (usually button 0, the left mouse button)
         *
         * @name Phaser.Input.Pointer#primaryDown
         * @type {boolean}
         * @default false
         * @since 3.0.0
         */
        this.primaryDown = false;

        /**
         * Is _any_ button on this pointer considered as being down?
         *
         * @name Phaser.Input.Pointer#isDown
         * @type {boolean}
         * @default false
         * @since 3.0.0
         */
        this.isDown = false;

        /**
         * Did the previous input event come from a Touch input (true) or Mouse? (false)
         *
         * @name Phaser.Input.Pointer#wasTouch
         * @type {boolean}
         * @default false
         * @since 3.0.0
         */
        this.wasTouch = false;

        /**
         * Did this Pointer get canceled by a touchcancel event?
         *
         * Note: "canceled" is the American-English spelling of "cancelled". Please don't submit PRs correcting it!
         *
         * @name Phaser.Input.Pointer#wasCanceled
         * @type {boolean}
         * @default false
         * @since 3.15.0
         */
        this.wasCanceled = false;

        /**
         * If the mouse is locked, the horizontal relative movement of the Pointer in pixels since last frame.
         *
         * @name Phaser.Input.Pointer#movementX
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.movementX = 0;

        /**
         * If the mouse is locked, the vertical relative movement of the Pointer in pixels since last frame.
         *
         * @name Phaser.Input.Pointer#movementY
         * @type {number}
         * @default 0
         * @since 3.0.0
         */
        this.movementY = 0;

        /**
         * The identifier property of the Pointer as set by the DOM event when this Pointer is started.
         *
         * @name Phaser.Input.Pointer#identifier
         * @type {number}
         * @since 3.10.0
         */
        this.identifier = 0;

        /**
         * The pointerId property of the Pointer as set by the DOM event when this Pointer is started.
         * The browser can and will recycle this value.
         *
         * @name Phaser.Input.Pointer#pointerId
         * @type {number}
         * @since 3.10.0
         */
        this.pointerId = null;

        /**
         * An active Pointer is one that is currently pressed down on the display.
         * A Mouse is always considered as active.
         *
         * @name Phaser.Input.Pointer#active
         * @type {boolean}
         * @since 3.10.0
         */
        this.active = (id === 0) ? true : false;

        /**
         * Is this pointer Pointer Locked?
         *
         * Only a mouse pointer can be locked and it only becomes locked when requested via
         * the browsers Pointer Lock API.
         *
         * You can request this by calling the `this.input.mouse.requestPointerLock()` method from
         * a `pointerdown` or `pointerup` event handler.
         *
         * @name Phaser.Input.Pointer#locked
         * @readonly
         * @type {boolean}
         * @since 3.19.0
         */
        this.locked = false;

        /**
         * The horizontal scroll amount that occurred due to the user moving a mouse wheel or similar input device.
         *
         * @name Phaser.Input.Pointer#deltaX
         * @type {number}
         * @default 0
         * @since 3.18.0
         */
        this.deltaX = 0;

        /**
         * The vertical scroll amount that occurred due to the user moving a mouse wheel or similar input device.
         * This value will typically be less than 0 if the user scrolls up and greater than zero if scrolling down.
         *
         * @name Phaser.Input.Pointer#deltaY
         * @type {number}
         * @default 0
         * @since 3.18.0
         */
        this.deltaY = 0;

        /**
         * The z-axis scroll amount that occurred due to the user moving a mouse wheel or similar input device.
         *
         * @name Phaser.Input.Pointer#deltaZ
         * @type {number}
         * @default 0
         * @since 3.18.0
         */
        this.deltaZ = 0;
    },

    /**
     * Takes a Camera and updates this Pointer's `worldX` and `worldY` values so they are
     * the result of a translation through the given Camera.
     *
     * Note that the values will be automatically replaced the moment the Pointer is
     * updated by an input event, such as a mouse move, so should be used immediately.
     *
     * @method Phaser.Input.Pointer#updateWorldPoint
     * @since 3.19.0
     *
     * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera which is being tested against.
     *
     * @return {this} This Pointer object.
     */
    updateWorldPoint: function (camera)
    {
        var x = this.x;
        var y = this.y;

        if (camera.resolution !== 1)
        {
            x += camera._x;
            y += camera._y;
        }

        //  Stores the world point inside of tempPoint
        var temp = camera.getWorldPoint(x, y);

        this.worldX = temp.x;
        this.worldY = temp.y;

        return this;
    },

    /**
     * Takes a Camera and returns a Vector2 containing the translated position of this Pointer
     * within that Camera. This can be used to convert this Pointers position into camera space.
     *
     * @method Phaser.Input.Pointer#positionToCamera
     * @since 3.0.0
     *
     * @param {Phaser.Cameras.Scene2D.Camera} camera - The Camera to use for the translation.
     * @param {(Phaser.Math.Vector2|object)} [output] - A Vector2-like object in which to store the translated position.
     *
     * @return {(Phaser.Math.Vector2|object)} A Vector2 containing the translated coordinates of this Pointer, based on the given camera.
     */
    positionToCamera: function (camera, output)
    {
        return camera.getWorldPoint(this.x, this.y, output);
    },

    /**
     * Calculates the motion of this Pointer, including its velocity and angle of movement.
     * This method is called automatically each frame by the Input Manager.
     *
     * @method Phaser.Input.Pointer#updateMotion
     * @private
     * @since 3.16.0
     */
    updateMotion: function ()
    {
        var cx = this.position.x;
        var cy = this.position.y;

        var mx = this.midPoint.x;
        var my = this.midPoint.y;

        if (cx === mx && cy === my)
        {
            //  Nothing to do here
            return;
        }

        //  Moving towards our goal ...
        var vx = SmoothStepInterpolation(this.motionFactor, mx, cx);
        var vy = SmoothStepInterpolation(this.motionFactor, my, cy);

        if (FuzzyEqual(vx, cx, 0.1))
        {
            vx = cx;
        }

        if (FuzzyEqual(vy, cy, 0.1))
        {
            vy = cy;
        }

        this.midPoint.set(vx, vy);

        var dx = cx - vx;
        var dy = cy - vy;

        this.velocity.set(dx, dy);

        this.angle = Angle(vx, vy, cx, cy);

        this.distance = Math.sqrt(dx * dx + dy * dy);
    },

    /**
     * Internal method to handle a Mouse Up Event.
     *
     * @method Phaser.Input.Pointer#up
     * @private
     * @since 3.0.0
     *
     * @param {MouseEvent} event - The Mouse Event to process.
     */
    up: function (event)
    {
        if ('buttons' in event)
        {
            this.buttons = event.buttons;
        }

        this.event = event;

        this.button = event.button;

        this.upElement = event.target;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, event.pageX, event.pageY, false);

        //  0: Main button pressed, usually the left button or the un-initialized state
        if (event.button === 0)
        {
            this.primaryDown = false;
            this.upX = this.x;
            this.upY = this.y;
            this.upTime = event.timeStamp;
        }

        this.isDown = false;

        this.wasTouch = false;
    },

    /**
     * Internal method to handle a Mouse Down Event.
     *
     * @method Phaser.Input.Pointer#down
     * @private
     * @since 3.0.0
     *
     * @param {MouseEvent} event - The Mouse Event to process.
     */
    down: function (event)
    {
        if ('buttons' in event)
        {
            this.buttons = event.buttons;
        }

        this.event = event;

        this.button = event.button;

        this.downElement = event.target;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, event.pageX, event.pageY, false);

        //  0: Main button pressed, usually the left button or the un-initialized state
        if (event.button === 0)
        {
            this.primaryDown = true;
            this.downX = this.x;
            this.downY = this.y;
            this.downTime = event.timeStamp;
        }

        this.isDown = true;

        this.wasTouch = false;
    },

    /**
     * Internal method to handle a Mouse Move Event.
     *
     * @method Phaser.Input.Pointer#move
     * @private
     * @since 3.0.0
     *
     * @param {MouseEvent} event - The Mouse Event to process.
     */
    move: function (event)
    {
        if ('buttons' in event)
        {
            this.buttons = event.buttons;
        }

        this.event = event;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, event.pageX, event.pageY, true);

        if (this.locked)
        {
            //  Multiple DOM events may occur within one frame, but only one Phaser event will fire
            this.movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
            this.movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
        }

        this.moveTime = event.timeStamp;

        this.wasTouch = false;
    },

    /**
     * Internal method to handle a Mouse Wheel Event.
     *
     * @method Phaser.Input.Pointer#wheel
     * @private
     * @since 3.18.0
     *
     * @param {WheelEvent} event - The Wheel Event to process.
     */
    wheel: function (event)
    {
        if ('buttons' in event)
        {
            this.buttons = event.buttons;
        }

        this.event = event;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, event.pageX, event.pageY, false);

        this.deltaX = event.deltaX;
        this.deltaY = event.deltaY;
        this.deltaZ = event.deltaZ;

        this.wasTouch = false;
    },

    /**
     * Internal method to handle a Touch Start Event.
     *
     * @method Phaser.Input.Pointer#touchstart
     * @private
     * @since 3.0.0
     *
     * @param {Touch} touch - The Changed Touch from the Touch Event.
     * @param {TouchEvent} event - The full Touch Event.
     */
    touchstart: function (touch, event)
    {
        if (touch['pointerId'])
        {
            this.pointerId = touch.pointerId;
        }

        this.identifier = touch.identifier;
        this.target = touch.target;
        this.active = true;

        this.buttons = 1;

        this.event = event;

        this.downElement = touch.target;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, touch.pageX, touch.pageY, false);

        this.primaryDown = true;
        this.downX = this.x;
        this.downY = this.y;
        this.downTime = event.timeStamp;

        this.isDown = true;

        this.wasTouch = true;
        this.wasCanceled = false;

        this.updateMotion();
    },

    /**
     * Internal method to handle a Touch Move Event.
     *
     * @method Phaser.Input.Pointer#touchmove
     * @private
     * @since 3.0.0
     *
     * @param {Touch} touch - The Changed Touch from the Touch Event.
     * @param {TouchEvent} event - The full Touch Event.
     */
    touchmove: function (touch, event)
    {
        this.event = event;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, touch.pageX, touch.pageY, true);

        this.moveTime = event.timeStamp;

        this.wasTouch = true;

        this.updateMotion();
    },

    /**
     * Internal method to handle a Touch End Event.
     *
     * @method Phaser.Input.Pointer#touchend
     * @private
     * @since 3.0.0
     *
     * @param {Touch} touch - The Changed Touch from the Touch Event.
     * @param {TouchEvent} event - The full Touch Event.
     */
    touchend: function (touch, event)
    {
        this.buttons = 0;

        this.event = event;

        this.upElement = touch.target;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, touch.pageX, touch.pageY, false);

        this.primaryDown = false;
        this.upX = this.x;
        this.upY = this.y;
        this.upTime = event.timeStamp;

        this.isDown = false;

        this.wasTouch = true;
        this.wasCanceled = false;

        this.active = false;

        this.updateMotion();
    },

    /**
     * Internal method to handle a Touch Cancel Event.
     *
     * @method Phaser.Input.Pointer#touchcancel
     * @private
     * @since 3.15.0
     *
     * @param {Touch} touch - The Changed Touch from the Touch Event.
     * @param {TouchEvent} event - The full Touch Event.
     */
    touchcancel: function (touch, event)
    {
        this.buttons = 0;

        this.event = event;

        this.upElement = touch.target;

        //  Sets the local x/y properties
        this.manager.transformPointer(this, touch.pageX, touch.pageY, false);

        this.primaryDown = false;
        this.upX = this.x;
        this.upY = this.y;
        this.upTime = event.timeStamp;

        this.isDown = false;

        this.wasTouch = true;
        this.wasCanceled = true;

        this.active = false;
    },

    /**
     * Checks to see if any buttons are being held down on this Pointer.
     *
     * @method Phaser.Input.Pointer#noButtonDown
     * @since 3.0.0
     *
     * @return {boolean} `true` if no buttons are being held down.
     */
    noButtonDown: function ()
    {
        return (this.buttons === 0);
    },

    /**
     * Checks to see if the left button is being held down on this Pointer.
     *
     * @method Phaser.Input.Pointer#leftButtonDown
     * @since 3.0.0
     *
     * @return {boolean} `true` if the left button is being held down.
     */
    leftButtonDown: function ()
    {
        return (this.buttons & 1) ? true : false;
    },

    /**
     * Checks to see if the right button is being held down on this Pointer.
     *
     * @method Phaser.Input.Pointer#rightButtonDown
     * @since 3.0.0
     *
     * @return {boolean} `true` if the right button is being held down.
     */
    rightButtonDown: function ()
    {
        return (this.buttons & 2) ? true : false;
    },

    /**
     * Checks to see if the middle button is being held down on this Pointer.
     *
     * @method Phaser.Input.Pointer#middleButtonDown
     * @since 3.0.0
     *
     * @return {boolean} `true` if the middle button is being held down.
     */
    middleButtonDown: function ()
    {
        return (this.buttons & 4) ? true : false;
    },

    /**
     * Checks to see if the back button is being held down on this Pointer.
     *
     * @method Phaser.Input.Pointer#backButtonDown
     * @since 3.0.0
     *
     * @return {boolean} `true` if the back button is being held down.
     */
    backButtonDown: function ()
    {
        return (this.buttons & 8) ? true : false;
    },

    /**
     * Checks to see if the forward button is being held down on this Pointer.
     *
     * @method Phaser.Input.Pointer#forwardButtonDown
     * @since 3.0.0
     *
     * @return {boolean} `true` if the forward button is being held down.
     */
    forwardButtonDown: function ()
    {
        return (this.buttons & 16) ? true : false;
    },

    /**
     * Checks to see if the left button was just released on this Pointer.
     *
     * @method Phaser.Input.Pointer#leftButtonReleased
     * @since 3.18.0
     *
     * @return {boolean} `true` if the left button was just released.
     */
    leftButtonReleased: function ()
    {
        return (this.button === 0 && !this.isDown);
    },

    /**
     * Checks to see if the right button was just released on this Pointer.
     *
     * @method Phaser.Input.Pointer#rightButtonReleased
     * @since 3.18.0
     *
     * @return {boolean} `true` if the right button was just released.
     */
    rightButtonReleased: function ()
    {
        return (this.button === 2 && !this.isDown);
    },

    /**
     * Checks to see if the middle button was just released on this Pointer.
     *
     * @method Phaser.Input.Pointer#middleButtonReleased
     * @since 3.18.0
     *
     * @return {boolean} `true` if the middle button was just released.
     */
    middleButtonReleased: function ()
    {
        return (this.button === 1 && !this.isDown);
    },

    /**
     * Checks to see if the back button was just released on this Pointer.
     *
     * @method Phaser.Input.Pointer#backButtonReleased
     * @since 3.18.0
     *
     * @return {boolean} `true` if the back button was just released.
     */
    backButtonReleased: function ()
    {
        return (this.button === 3 && !this.isDown);
    },

    /**
     * Checks to see if the forward button was just released on this Pointer.
     *
     * @method Phaser.Input.Pointer#forwardButtonReleased
     * @since 3.18.0
     *
     * @return {boolean} `true` if the forward button was just released.
     */
    forwardButtonReleased: function ()
    {
        return (this.button === 4 && !this.isDown);
    },

    /**
     * If the Pointer has a button pressed down at the time this method is called, it will return the
     * distance between the Pointer's `downX` and `downY` values and the current position.
     *
     * If no button is held down, it will return the last recorded distance, based on where
     * the Pointer was when the button was released.
     *
     * If you wish to get the distance being travelled currently, based on the velocity of the Pointer,
     * then see the `Pointer.distance` property.
     *
     * @method Phaser.Input.Pointer#getDistance
     * @since 3.13.0
     *
     * @return {number} The distance the Pointer moved.
     */
    getDistance: function ()
    {
        if (this.isDown)
        {
            return Distance(this.downX, this.downY, this.x, this.y);
        }
        else
        {
            return Distance(this.downX, this.downY, this.upX, this.upY);
        }
    },

    /**
     * If the Pointer has a button pressed down at the time this method is called, it will return the
     * horizontal distance between the Pointer's `downX` and `downY` values and the current position.
     *
     * If no button is held down, it will return the last recorded horizontal distance, based on where
     * the Pointer was when the button was released.
     *
     * @method Phaser.Input.Pointer#getDistanceX
     * @since 3.16.0
     *
     * @return {number} The horizontal distance the Pointer moved.
     */
    getDistanceX: function ()
    {
        if (this.isDown)
        {
            return Math.abs(this.downX - this.x);
        }
        else
        {
            return Math.abs(this.downX - this.upX);
        }
    },

    /**
     * If the Pointer has a button pressed down at the time this method is called, it will return the
     * vertical distance between the Pointer's `downX` and `downY` values and the current position.
     *
     * If no button is held down, it will return the last recorded vertical distance, based on where
     * the Pointer was when the button was released.
     *
     * @method Phaser.Input.Pointer#getDistanceY
     * @since 3.16.0
     *
     * @return {number} The vertical distance the Pointer moved.
     */
    getDistanceY: function ()
    {
        if (this.isDown)
        {
            return Math.abs(this.downY - this.y);
        }
        else
        {
            return Math.abs(this.downY - this.upY);
        }
    },

    /**
     * If the Pointer has a button pressed down at the time this method is called, it will return the
     * duration since the button was pressed down.
     *
     * If no button is held down, it will return the last recorded duration, based on the time
     * the Pointer button was released.
     *
     * @method Phaser.Input.Pointer#getDuration
     * @since 3.16.0
     *
     * @return {number} The duration the Pointer was held down for in milliseconds.
     */
    getDuration: function ()
    {
        if (this.isDown)
        {
            return (this.manager.time - this.downTime);
        }
        else
        {
            return (this.upTime - this.downTime);
        }
    },

    /**
     * If the Pointer has a button pressed down at the time this method is called, it will return the
     * angle between the Pointer's `downX` and `downY` values and the current position.
     *
     * If no button is held down, it will return the last recorded angle, based on where
     * the Pointer was when the button was released.
     *
     * The angle is based on the old position facing to the current position.
     *
     * If you wish to get the current angle, based on the velocity of the Pointer, then
     * see the `Pointer.angle` property.
     *
     * @method Phaser.Input.Pointer#getAngle
     * @since 3.16.0
     *
     * @return {number} The angle between the Pointer's coordinates in radians.
     */
    getAngle: function ()
    {
        if (this.isDown)
        {
            return Angle(this.downX, this.downY, this.x, this.y);
        }
        else
        {
            return Angle(this.downX, this.downY, this.upX, this.upY);
        }
    },

    /**
     * Takes the previous and current Pointer positions and then generates an array of interpolated values between
     * the two. The array will be populated up to the size of the `steps` argument.
     *
     * ```javaScript
     * var points = pointer.getInterpolatedPosition(4);
     *
     * // points[0] = { x: 0, y: 0 }
     * // points[1] = { x: 2, y: 1 }
     * // points[2] = { x: 3, y: 2 }
     * // points[3] = { x: 6, y: 3 }
     * ```
     *
     * Use this if you need to get smoothed values between the previous and current pointer positions. DOM pointer
     * events can often fire faster than the main browser loop, and this will help you avoid janky movement
     * especially if you have an object following a Pointer.
     *
     * Note that if you provide an output array it will only be populated up to the number of steps provided.
     * It will not clear any previous data that may have existed beyond the range of the steps count.
     *
     * Internally it uses the Smooth Step interpolation calculation.
     *
     * @method Phaser.Input.Pointer#getInterpolatedPosition
     * @since 3.11.0
     *
     * @param {integer} [steps=10] - The number of interpolation steps to use.
     * @param {array} [out] - An array to store the results in. If not provided a new one will be created.
     *
     * @return {array} An array of interpolated values.
     */
    getInterpolatedPosition: function (steps, out)
    {
        if (steps === undefined) { steps = 10; }
        if (out === undefined) { out = []; }

        var prevX = this.prevPosition.x;
        var prevY = this.prevPosition.y;

        var curX = this.position.x;
        var curY = this.position.y;

        for (var i = 0; i < steps; i++)
        {
            var t = (1 / steps) * i;

            out[i] = { x: SmoothStepInterpolation(t, prevX, curX), y: SmoothStepInterpolation(t, prevY, curY) };
        }

        return out;
    },

    /**
     * Destroys this Pointer instance and resets its external references.
     *
     * @method Phaser.Input.Pointer#destroy
     * @since 3.0.0
     */
    destroy: function ()
    {
        this.camera = null;
        this.manager = null;
        this.position = null;
    },

    /**
     * The x position of this Pointer.
     * The value is in screen space.
     * See `worldX` to get a camera converted position.
     *
     * @name Phaser.Input.Pointer#x
     * @type {number}
     * @since 3.0.0
     */
    x: {

        get: function ()
        {
            return this.position.x;
        },

        set: function (value)
        {
            this.position.x = value;
        }

    },

    /**
     * The y position of this Pointer.
     * The value is in screen space.
     * See `worldY` to get a camera converted position.
     *
     * @name Phaser.Input.Pointer#y
     * @type {number}
     * @since 3.0.0
     */
    y: {

        get: function ()
        {
            return this.position.y;
        },

        set: function (value)
        {
            this.position.y = value;
        }

    },

    /**
     * Time when this Pointer was most recently updated by a DOM Event.
     * This comes directly from the `event.timeStamp` property.
     * If no event has yet taken place, it will return zero.
     *
     * @name Phaser.Input.Pointer#time
     * @type {number}
     * @readonly
     * @since 3.16.0
     */
    time: {

        get: function ()
        {
            return (this.event) ? this.event.timeStamp : 0;
        }

    }

});

module.exports = Pointer;

redpajama_set_name: RedPajamaGithub


text:
Q: import Excel to DataTable with Asp.net When I use excel table import to Data Table, at the same time need to import SID, CREATE_DATETIME, MODIFY_DATETIME, CREATOR_SID(actorSId)...
But after import i just getting excel data. So How can i import at the same time ?

My Code is here;
 private void BindData(string strConn)
{
    OleDbConnection objConn = new OleDbConnection(strConn);
    objConn.Open();

    // Get the data table containg the schema guid.
    DataTable dt = null;
    dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    objConn.Close();

    //ISystemId SID

    if (dt.Rows.Count > 0)
    {
         // Bind the sheets to the Grids
        foreach (DataRow row in dt.Rows)
        {
            DataTable dt_sheet = null;

            dt_sheet = getSheetData(strConn, row["TABLE_NAME"].ToString());

        }
    }
}

private DataTable getSheetData(string strConn, string sheet)
{
    string sid = Convert.ToString(new SystemId());
    string Ctime = Convert.ToDateTime(DateTime.Now).ToString("yyyyMMddhhmmss");
    string Mtime = Convert.ToDateTime(DateTime.Now).ToString("yyyyMMddhhmmss");
    string actorSId = Convert.ToString(WebPage.CurrentSysUserSId);
    string query = "select * from [" + sheet + "]";
    OleDbConnection objConn;
    OleDbDataAdapter oleDA;
    DataTable dt = new DataTable();
    dt.Columns.Add("SID", typeof(string));
    dt.Columns.Add("CREATE_DATETIME", typeof(string));
    dt.Columns.Add("MODIFY_DATETIME", typeof(string));
    dt.Columns.Add("CREATOR_SID", typeof(string));
    dt.Columns.Add("MODIFIER_SID", typeof(string));
    dt.Columns.Add("MARK_DELETED", typeof(string));
    dt.Columns.Add("ENABLED", typeof(string));
    dt.Columns.Add("SORT", typeof(int));

    objConn = new OleDbConnection(strConn);
    objConn.Open();
    oleDA = new OleDbDataAdapter(query, objConn);
    oleDA.Fill(dt);

    objConn.Close();
    oleDA.Dispose();
    objConn.Dispose();
    return dt;
}

So, who can help me ?

A: I`m already solved my problem.
Changed below code than working clearly.
 private DataTable getSheetData(string strConn, string sheet)
    {
        //string sid = Convert.ToString(new SystemId());
        string Ctime = Convert.ToDateTime(DateTime.Now).ToString("yyyyMMddhhmmss");
        string Mtime = Convert.ToDateTime(DateTime.Now).ToString("yyyyMMddhhmmss");
        string actorSId = Convert.ToString(WebPage.CurrentSysUserSId);
        string query = "select * from [" + sheet + "]";
        OleDbConnection objConn;
        OleDbDataAdapter oleDA;
        DataTable dt = new DataTable();
        dt.Columns.Add("SID", typeof(string));
        dt.Columns.Add("CREATE_DATETIME", typeof(string));
        dt.Columns.Add("MODIFY_DATETIME", typeof(string));
        dt.Columns.Add("CREATOR_SID", typeof(string));
        dt.Columns.Add("MODIFIER_SID", typeof(string));
        dt.Columns.Add("MARK_DELETED", typeof(string));
        dt.Columns.Add("ENABLED", typeof(string));
        dt.Columns.Add("SORT", typeof(int));

        objConn = new OleDbConnection(strConn);
        objConn.Open();
        DataSet dataSet = new DataSet();
        oleDA = new OleDbDataAdapter(query, objConn);
        oleDA.Fill(dt);
        foreach (DataRow dr in dt.Rows) // search whole table
        {
            for (int i = 0; i < dt.Rows.Count - 1; i++)
                if (dt.Rows.Count > i)
                {
                    string sid = Convert.ToString(new SystemId());
                    var row = dt.Rows[i];
                    row["SID"] = sid;
                    row["CREATE_DATETIME"] = Ctime;
                    row["MODIFY_DATETIME"] = Mtime;
                    row["CREATOR_SID"] = actorSId;
                    row["MODIFIER_SID"] = 0;
                    row["MARK_DELETED"] = "N";
                    row["ENABLED"] = "Y";
                    row["SORT"] = 1;
                }
        }
        objConn.Close();
        oleDA.Dispose();
        objConn.Dispose();
        return dt;
    }

redpajama_set_name: RedPajamaStackExchange


text:
package utils

import "unicode"

// CamelCaseToHyphen converts from camel case form to hyphen separated form
// Example: HelloWorld -> hello-world
func CamelCaseToHyphen(s string) string {
	var out []rune
	for i, r := range s {
		if unicode.IsUpper(r) && i != 0 && s[i-1] != '-' {
			out = append(out, '-')
		}
		out = append(out, unicode.ToLower(r))
	}

	return string(out)
}


text:
Q: What is difference between "import {PROPERTY} from 'MODULE'" and "require(MODULE).PROPERTY"? Now I'm studying 'react-native-router-flux' with 'react-redux'.
Beginning of my App.js Code is below.

import { Router } from 'react-native-router-flux';
const RouterWithRedux = connect()(Router);

import { createLogger } from 'redux-logger';
const logger = createLogger();

import ReduxThunk from 'redux-thunk';
const middleware = [logger, ReduxThunk];

I think this code is not neatly because I only use just one of Property from the Modules. Is there any better way to express it?
Maybe the below code is equal with above part of "logger".

const logger = require('redux-logger').createLogger();

How these works are different between import {property} and require.property?

A: if you use import, Babel then transpire under the hood to require. Also require can require files dynamic.
Require is synchronous and import is asynchronous with better performance.
Require is a node.js way to import files.
I think that import export is more declarative.


text:
Detroit Tigers claim left-handed reliever from Marlins off waivers
By Jacob Cox
Aug 27, 2021; Miami, Florida, USA; Miami Marlins starting Sean Guenther (66) pitches against the Cincinnati Reds during the sixth inning at loanDepot Park. Mandatory Credit: Jim Rassol-USA TODAY Sports /
The Detroit Tigers have claimed left-handed reliever Sean Guenther off waivers.
The Detroit Tigers have claimed left-handed reliever Sean Guenther off waivers from the Marlins. Guenther is currently rehabbing from Tommy John surgery.
Guenther, who is just 26 years old, has only played one season in the major leagues, the 2021 season. He was a seventh-round draft pick in 2017 out of the University of Notre Dame.
The lefty underwent Tommy John surgery in April 2022. Before surgery, because sometimes these things change post-surgery, his four-seam fastball works around 93 mph with a slider that sits 82-83 mph. Guenther does have a changeup, but he doesn't throw it that often, mostly only to right-handed hitters.
Sean Guenther was never considered a top prospect for the Marlins, but during the 2021 season, he found himself at the Double-A and Triple-A levels of the minor leagues. In his games in the minor leagues, he had a strikeout rate of around 30 percent with a walk rate below five percent.
When the Miami Marlins called him up late in the 2021 season, Guenther struggled. He walked ten batters in 20.1 innings but did strike out 15 batters. At the end of the day, Guenther needs to simply get outs, the goal of every pitcher.
How does he get outs best? Ground balls. With a four-seam fastball sitting low to mid-90s and a sweeping slider, pairing those up to get ground balls will make him most effective at the major league level.
There is nothing about Guenther that makes me super excited. This isn't a Scott Harris move that will make the front page, but this is a move that is about building a team. A young left-handed reliever that has some work to do, but could be a valuable piece when this team is getting ready to compete.
This move also comes in contrast with left-handed reliever Andrew Chafin opting out of his contract and entering free agency.
Next. Detroit Tigers: International FA needs to be a priority. dark


text:
Linga Sound kan syfta på följande platser:

Storbritannien

 Linga Sound (sund i Storbritannien, Shetlandsöarna), Skottland,
 Linga Sound (sund i Storbritannien, Orkneyöarna), Skottland,

Robotskapade Storbritannienförgreningar


text:
Showing posts with label Courtney Patton. Show all posts
Courtney Patton Performs "Night Like the Old Days"
From her new album out today, Electrostatic.
The latest nonsense from Farcer at 1:00 PM 0 complaints
Labels: Courtney Patton, Live performances
Courtney Patton & Jamie Lin Wilson Perform "Give Me a Break"
Labels: Courtney Patton, Jamie Lin Wilson, Live performances
Gordon Ramsay Country Reaction Gifs
*foul language warning obviously*
If I see Thomas Rhett, Luke Bryan, and FGL all together on the street
When you see that the best mainstream country song of the year, Caylee Hammack's "Small Town Hypocrite" bombed on the charts
The opposite of Vince Gill
Describe Keith Urban's last album
Did you hear about Kane Brown getting lost on his own land?
When your friends says "You're right, mainstream country is awful - give me Tyler Childers and Courtney Patton instead."
If 'that' is a boyfriend country song with snap beats:
When someone says they like Kelsea Ballerini better than Kelsey Waldon
and finally, to mainstream country radio...
Labels: Country Reaction Gifs, Courtney Patton, Florida Georgia Line, Gordon Ramsay, Hell's Kitchen, Kane Brown, Satire, Thomas Rhett, Tyler Childers, Vince Gill
Jamie Lin Wilson, Courtney Patton, Jason Eady Cover The Judds' "Why Not Me"
Labels: Courtney Patton, Jamie Lin Wilson, Jason Eady, The Judds, The Next Waltz
Jason Eady, Courtney Patton, Jamie Lin Wilson Cover Randy's "On the Other Hand"
Labels: Courtney Patton, Jamie Lin Wilson, Jason Eady, Live performances, Randy Travis
Larry Hooper: The FTM Interview 2
Today, we speak with the Texas singer-songwriter-bus-driver, Larry Hopper. I hope you enjoy. (Also, he's taking over Galleywinter's FB page Thursday.)
FTM: Hello, Hopper! It's been a while since we last spoke. I've been meaning to ask you, are you related to Jim Hopper from Stranger Things?
Larry: I said no to this interview.
FTM: Your denial didn't take. So what have you been doing in the 9 1/2 years since our last interview? Prison time?
Larry: I had some good toast about 4 years ago. I wanted to make sure and tell you about that toast. It wasn't any special kind of bread, it was just the EXACT right amount of toasted. Not burnt, not under toasted. Can you imagine? It was so good!! I have some pictures of the toast if you need them.
FTM: I'm good. What are you doing to pass the time during quarantine, besides (insert tired beard grooming joke here)?
Larry: During what? No idea what you're talking about.
FTM: These crazy times, buddy! Hey, when you and your wife are teaching your kids for in-home school, are you in charge of bad jokes and puns training, while she teaches all the other subjects?
Larry: My wife will be offended that you would think for ONE SECOND I would be the one who would teach puns. She has her doctorate in Punning.
FTM: Is it true you co-wrote a song for Cody Jinks?
Larry: With.
FTM: Yeah right, Hopper; is it one that "accidentally got left off the album?"
Larry: It was the title cut of his 2019 release "After the Fire." It was the number one country album for one whole week. Then he released another album the next week and kicked himself off the top spot.
FTM: Oh really? Does Cody owe you money or something?
Larry: I wish. I keep hoping someone will remember that they owe me money. Nobody does.
FTM: Most artists, and I use that term carefully, consume lots of art to keep their creativity flowing. What sort of books, movies, and music keep your muse alive? I'm assuming there will be a follow up question about coloring books, Tom Green films, and Hoobastank.
Larry: I only watch my extensive collection of Puppy Bowl recordings. I recently read a book about a little dog named Meli that went to the vet. It was quite the thrill ride. I don't want to spoil the ending, but page 12 will surprise you!!! As for what I listen to, mostly my interior monologue of self doubt and fear and neurosis and anxiety and guilt . Also John Prine.
FTM: So I see you've been doing streaming concerts during the pandemic. What does that mean?
Larry: It just makes sense. Staying home is the best way for people to come see me.
FTM: No, I meant "pandemic," I've always assumed that had something to do with pandas.
Larry: This is why I said no to the interview. Plus you barely even seemed interested in my really good toast story. The toast was excellent, the story was really good.
FTM: You live a wild life, Barry. I haven't been stalking you, I promise, but I've noticed there are always a ton of kids in your social media photos. Are you starting a cult?
Larry: I hear there's good money in it.
FTM: If your cult will have brisket and singalongs, I'm interested. Let's talk about that later. Right now, I need to know what you think about how Red Dirt, independent country, and Americana music are kinda sorta mainstream these days. When we did that first interview, I'd have never dreamed that our buddy Drew Kennedy would be modestly more well known in 2020. It's wild.
Larry: I don't know who that is, but the meshing of all the different musical subsets is bound to happen. It's a cycle. Some kids get sick of mainstream music and there's a movement of a new sound, it becomes popular and in that popularity gets watered down and pushed towards a more generic sound to appeal to more people. theres art and then there's business and the 2 can only coexist in a small window before it becomes more business. That's not to say anyone is wrong for that that's just the nature of the beast. Radio stations have to sell ads to keep the lights on. They have the seemingly impossible task of staying true to their format but appealing to as many people as possible. People get mad at radio stations if they play a song that that person doesn't think belongs. That's bizarre to me. Just.. don't listen to that song? I don't like calling myself an artist but I'm sure not a business man. That's why most people reading this think you're interviewing the guy from the Lawrence Welk show, But there's always good music to listen to. Mainstream or not. I'll check out Drew Kennedy though.
FTM: Oh you know who he is; he asked me to tell you to stop texting him asking to open his shows all the time. It's getting awkward for everyone. Next question: Are you working on any new music?
Larry: I'm always writing. I have plenty of songs for a new album I just haven't had time or money to record. And with the covidteen going on I have no idea what everything will look like when shows start up again.
FTM: You didn't have to go on for so long. I don't really care, it's just something I have to ask since this is a music blog. But since we're on the subject, will you be doing any boyfriend country songs?
Larry: I don't know what that means.
FTM: Nobody does. Hey, it's bizarre that I've "known" you online for over 15 years and I still don't know your favorite N-Sync member. Care to elaborate?
Larry: Timberlake is the only one I can even name.
FTM: Who are some of your favorite songwriters these days?
Larry: Other than the standards, Lori Mckenna is just unspeakably good. I keep expecting to move on from my Isbell fanboyness but he's just such a great writer. The writing BJ did on the new AA record is so good. Courtney Patton is better than most. So are Jacob Furr and Gabe Wootton. Mike Ethan Messick. Jackie Darlene for sure.
FTM: Again, don't actually care. Did you watch Tiger King? That was some crazy sh*t.
Larry: I did. It was sad.
FTM: I see you're still not going to come out and admit that you were the fake Cowboy Troy troll on that Americana message board we used to frequent. Why is that?
Larry: I think the record will show that the Cowboy Troy user had better spelling and grammar than me.
FTM: Okay, I think this has gone on for long enough. I'm as bored as you are, if not more. Let's do the lightning round! Do you have a Larry Hopper face Covid mask on your merch site?
Larry: yes. It comes in the shape of a shirt and you have to DIY your mask.
FTM: That's a missed opportunity. Alright, favorite flavor of Swisher Sweets?
Larry: I don't use them because of poisons. I need to stay healthy so I can overeat for longer.
FTM: That's a hoax. Tobacco is grown from the earth, so it's healthy. Bigly. Do your research. Next question is multiple choice: Are these times A)uncertain B)crazy C)troubling 4)frowsty?
Larry: Can I put "exhausting" as a write in answer?
FTM: If Sam Hunt asked to cowrite a song with you, what color would the Land Rover you bought with the royalties be?
Larry: I don't think you can buy a Land Rover with royalty money anymore. I might could get me an old Isuzu trooper.
FTM: Jay or Jeff?
Larry: Jay
FTM: No, I meant Jay Cutler or Jeff Garcia. Read the room.
Larry: Jeff Garcia from the Grateful Dead?
FTM: You don't know soccer at all, Lawrence. Who is the coolest celebrity you've ever met?
Larry: Henry Winkler
FTM: Ayyyy! Favorite Juice WRLD song?
Larry:
FTM: That is an acceptable answer. What's the first restaurant you're going to sit down and eat at when it's finally safe again?
Larry: Somewhere with chips and salsa
FTM: You thought that was going to be a trick question, but these are very serious. What is the highest number of feral hogs that has ever run into your yard?
Larry: 28-48
FTM: When you're writing a song: lyrics or music first?
Larry: Lyrics
FTM: Another serious question! I'm getting good at this! Spell "Thibodaux."
Larry: Thibodeaux. I learned that from an episode of King of the Hill.
FTM: I was talking about the city in Louisiana and with this being an email interview, I gave you the answer and you still missed it. Anyway.. if you were doing a big nationwide tour, what particular food or drink would be on your tour rider?
Larry: 4 fried chickens and a coke.
FTM: Alright, now it's the requisite time in a Farce the Music interview when we give you the opportunity to speak poorly of mainstream country. If you don't say something funny, pithy, or meaningful here, you may lose legions of fans. No pressure.
Larry: jokes on you, I don't have legions of fans.
Mainstream Country is awful but so is a lot of other stuff. I just don't listen. I don't care what they're doing. It's not for me. I am not their target. Honestly the only reason I even know the names of most of them is because of Farce The Music, haha. And it's just name recognition. If I'm in a store and mainstream country is playing it lets me know that I still am not interested, but that's the extent of how much I think about it. I don't like most Jazz music, so I just don't listen to Jazz music.i don't have to make shirts about how much I hate it. I used to get worked up about what they were calling country music but labels are for the masses and the record execs. Something I work hard on reminding myself, and I wish more people understood: you don't have to have an opinion on everything. In the time of this constant barrage of new information or media or whatever, we feel like we have to know about it all and have an informed opinion on every single thing. Just pick a few. I just choose to not care, as you can fell by the massive paragraph I just wrote on the matter.
FTM: So much for "lightning." What do you think the water from inside a waterbed would taste like?
Larry: Pall Mall cigarettes and bad decisions.
FTM: Possibly. It's just something I've been wondering about. Okay, last question: Would you rather have a sack full of punch or a punch in the sack?
Larry: I really said I wasn't going to do another one of these interviews.
Thanks Larry! Go listen to his music, buy his shirts, and hit up his online shows!
Labels: American Aquarium, Cody Jinks, Courtney Patton, Cowboy Troy, Drew Kennedy, Interviews, Jason Isbell, John Prine, Larry Hooper, Lori McKenna
Courtney Patton Covers Strait's "Nobody in His Right Mind"
Labels: Courtney Patton, George Strait, Live performances
Coronavirus Parody Album Covers: Tyler Childers, Ray Charles, etc.
Labels: Coronavirus, Courtney Patton, Parody Album Covers, Ray Charles, Satire, Tyler Childers, Wayne Cochran
Jamie Lin Wilson, Courtney Patton, Juliet McConkey / "You're No Good" / Mile 0 Fest
Labels: Courtney Patton, Jamie Lin Wilson, Juliet McConkey, Linda Ronstadt, Mile 0 Fest
Can't Wait for CoKo Fest!
inspired by a tweet from Jonathan Tyler
Labels: Cody Braun, Cody Canada, Cody Jinks, Cody Johnson, Colt Ford, concert posters, Courtney Patton, Koe Wetzel, Parody Concert Posters, Satire
Courtney Patton & Jason Eady Perform "Blue Eyes Crying in the Rain"
Labels: Courtney Patton, Jason Eady, Live performances, Willie Nelson
CXCW Classics / Courtney Patton & Larry Hooper / "Milwaukee Here I Come"
Labels: Couch By Couchwest, Courtney Patton, Larry Hooper
Courtney Patton Performs "Fourteen Years"
Traveling On: A Conversation With Jason Eady
By Kevin Broughton
Jason Eady is a country artist with a bluegrass soul. He cut his teeth with his stepfather in central Mississippi, going to picking parties and bluegrass jams, but his six solo albums to date have all been in a traditional country vein. But on the heels of his critically acclaimed self-titled 2017 record, Eady has gone fully unplugged and put his own unique, rocking stamp on the bluegrass ethos. With help from an A-list duo from the genre, he's made his best album to date, I Travel On, released today on Old Guitar Records.
It's a good-time record made by a man at peace with himself and the world. We chatted about being positive while staying authentic, clearing out a Croatian bar in Paris, and jumping out of a perfectly good airplane. And other stuff.
I Travel On is a distinct departure – in several ways -- from your self-titled 2017 album. That one made our top 10, but it was pretty understated and a little somber in places. Musically and thematically this record may be its polar opposite. What were your mindset and/or goals with regard to the musical approach this time?
Well, this record and the last one seem pretty different, but I think of the last record as a bridge to this one. Before the self-titled album, I'd been very electric, with lots of steel guitar – country music. Sonically, they were bigger productions – not huge, though – than the last album. On the last one we kind of pulled it back; it was more of an acoustic album. I Travel On is fully acoustic. So I think there's a sonic thread running through to it. And I had been wanting to move that direction.
About three years ago we played a show in Bozeman, Montana. And this room is fantastic; it's one of those places everyone plays when they go to Montana. But it is small. I don't know the actual capacity, but I would guess 30-40 people, and it's wider than it is deep, so there are only about four rows of chairs. And we started bringing in all our gear, but the thought of cramming all those amps in just seemed weird to me. So we grabbed all our acoustic guitars, stripped down the drum kit and played the whole set that way. And it just sounded great. So I went into the last album with that idea, and toured that way as well.
The first thing I noticed on the opening cut, "I Lost My Mind in Carolina," was that you brought in a stud on acoustic guitar. Got a ringer on Dobro, too. Who are these guys, and what was the recording process like?
Rob Ickes (dobro) and Trey Hensley (guitar) are the two guys. And my favorite thing about this record is that it's real and organic. Our developed the sound by touring around and playing that way, where everybody did their own natural thing. And we came up with a sound that's sort of bluegrass on the top end and a real groove on the bottom. While we were driving around the country we listened to these guys – they're a duo, and they are absolute studs in the bluegrass world; their very first album got nominated for a Grammy in the bluegrass category. They're just phenomenal.
So as it came time to make this record, I wanted it to be our live band, but I didn't want there to be overdubs. I wanted the record to sound like we're all sitting in a room. Our lead player can do all those things, but I didn't want overdubs. So since we had been listening to them, and I just called Trey and said, "Would you guys want to do this?" He said yes. It came from a very real place; we didn't just say, "Who are some studio badasses we can call?" We tracked 100 percent live from top to bottom, no overdubs. Our band would work them up the night before, but we had never played them with Rob and Trey before we recorded. Everything you hear on this record is what you would have heard if you had been standing in the room while we recorded.
Yeah, I know!
There's a real blues/bluegrass feel to the whole thing.
I would never in the world set out and try to make a pure bluegrass record, because I have way too much respect for the genre. To be in that world, you really have to live it your whole life. You can't dabble in bluegrass. But yeah, it was a conscious thing we were going for; we're calling it "groove grass." We wanted to hint at bluegrass, and people will definitely hear that aspect of it, but with pure bluegrass you don't have drums or a bass guitar. "Groove grass" sums it up, really.
I want to get into several specific songs in a minute, but something stands out on the album as a whole and I'd like to get your take on it. Brent Cobb told me a couple of years ago that it's possible to write country or roots songs with authenticity and depth without their all being sad and depressing. I think that's rare, but it certainly holds true for this album of yours – and to a large degree the last one. What do you think of that premise? You seem to be a pretty happy guy.
I am. And I love Brent, by the way, I think he's one of the best artists around today. Just incredible. But he's right. And there's that temptation when you're writing songs that you want to be authentic or real; they can turn out depressing. But I wanted this album to feel good. There are some points on the record where if you want to listen to words and dig into meanings – and I worked hard on the words – there's some depth to latch onto if you want to listen to it that way. But I also wanted this to be a record that you could just put on and play and enjoy. I get that there's a need for feel-good music, where you don't have to just think all the time. There are plenty of examples of people – like John Prine and Paul Simon – who write great songs, but I don't know what they mean half the time. They just feel really good. Just put it on. Move your feet. Move your head.
But Brent's right; you have to pull yourself out of that box, because it seems like there are two extremes in country music right now. It's either said and depressing, or it's so fluffy, about drinking beer on the river on the weekend.
Speaking of being a "Happy Man," there's a song with that very title. Were you making a statement for the record with that one?
I definitely was. I just wanted to get that out there. God forbid if anything happened to me, anyone could listen to that song and know that I'm a happy person and have lived a good life, and these are the reasons why. Because when you boil it down, there's really only a few things that make you happy: There's friends, there's family, there's doing what you love and the experiences you have. Here, there are two verses with three things each that make me happy. And at the end of it, I couldn't think of anything else. The simplicity of it was very intentional.
And the origin of it – I don't want to drag this out but this is a funny story – was overseas last year. We went to Paris, France to play a festival and wound up in a Croatian bar right across from the Notre Dame Cathedral. We could hear music playing inside that was lively, so we went in. This was like a Tuesday night but there was a party going on, so we wandered in. The bartender asks Courtney and me what we were doing there and we told him we were musicians. He asks my name, and dials me up on Spotify, and just started playing my music randomly, however that works. And it was just like three of my most depressing songs, one after another.
Yeah, man. Cleared out the bar. Everyone went outside to smoke all at once. Killed the whole vibe of the room. I started getting depressed! And I thought, "Good gosh, if I heard this for the first time I'd think this fellow is depressed, too. This guy's got problems." So I wanted to get it out there, that it's not the case. I've written plenty of sad songs, but that's just something I like to do sometimes. And ironically, "Happy Man" is one of the slowest songs on the record.
About the only thing that comes close to a downer on this album is "She Had to Run," about a woman getting out of a dangerous domestic situation. Is there a story behind that song?
Yeah, I won't go into the details of it because it's a very personal song, but one I needed to write. And I knew when I got ready to make this album that this song would be the outlier, but it was too important to me. I had to get that one on there. I just hope that maybe there's one person who hears it and thinks about getting out of a situation like that.
I won't pry into specifics, but let me ask: Does the person who inspired it know about the song?
She does. We haven't talked about it a lot because it's still too close, too fresh. She got out, but it was frighteningly close. It was so close that the next person who was with that guy didn't get out.
"Always a Woman" is intriguing. Tonally, it's dark and in a minor key – by the way, is there another chord, or just C minor?
That's it, the whole way through.
Lyrically, it's kind of an ironic Valentine. "There's only one thing between the devil and a good man" is really clever, because it can mean two very different things.
Unpack that song for me.
That's the first song I wrote for this album, and the only one where I had a title set beforehand. Courtney and I were hanging out with a friend who was having a bad time and she asked what was the matter. He kind of shrugged it off and she said, "Is it a woman?" He said, "It's always a woman." I wrote that down, and I sat down with my guitar and just started droning on that C minor chord. And it's a very specific fingerpicking pattern that never stops for four minutes; if you watch me play it my fingers [on the neck] never move.
And like we were just talking about, I didn't want to write another sad song. So I had the first verse and thought, "This song has to turn. 'Always a woman' doesn't have to mean good or bad." So musically we used some dynamics to change things up, and I tried to change that phrase from a positive to a negative as well. And I think the whole theme of the record is finding the positive in things and moving forward. And that's why we called the album "I Travel On." It's about moving forward. A lot of the songs are about physically traveling; this one does it in a mental space.
And the feedback/distortion thing is a nice backbone. Nothing electric there?
No! That's the dobro player raking across the strings, and the fiddle player doing it in some spots, muting his strings. Everybody thinks there are electric instruments on that song and there aren't. We had a videographer come in and shoot while we were recording that song; you'll see it when it comes out.
And I guess you had to include at least a couple waltzes to preserve domestic bliss. I take it that's your bride singing harmony on "Below The Waterline?"
Ha. Yeah, if you hear harmonies on this album there Courtney's. I've always wanted to write a bluegrass power waltz. I love those, because they make the harmonies just scream. Courtney and I wrote that one together.
I was gonna ask if she got a co-write on that one.
She got two. We wrote that one, and "Now or Never," the second track on the album.
This is kinda random but the key of C minor on "Always a Woman" made me wonder: Do you have a favorite key, or one that you end up doing the bulk of your songs in?
I write most of my songs in D and I don't know why. And I had originally written that song in D minor, but when we got into the studio to record we got to that point in the chorus where you go up, and I couldn't quite hit it. And when we lowered it, it kind of came alive, got darker.
Staying with random: You recently went skydiving with your mom and daughter. What possessed y'all, and would you do it again?
That was all my mom's idea. She had originally wanted to do that thing in Vegas where you bungee-jump off of a tower on one of the tall buildings. And later we were together at Christmas and she said something about skydiving, and my daughter wanted to do it with her. So I bought it for my daughter, but every time they tried to go the weather was bad, then my daughter went off to college. She was home a few weeks ago and the weather was perfect. And on the drive over I thought, "When am I ever gonna get to do this again? All three generations are here. This is once in a lifetime."
Tell me about the moment before you went out the door of the airplane.
It's the most terrifying and exhilarating thing. On the way up it's in your head what's gonna happen, but it's just indescribable, the way you feel standing in that door. If you're not afraid looking out, you're not human. There's nothing about it that's natural or normal. You have to try and get it out of your head, and trust the person who's strapped to your back.
That was the worst moment, because we did a high jump. We were at 14,000 feet. I loved it. But there's really no way in the world to use words to describe what it feels like.
Would you do it again?
You know, when I first did it I said there was no way – I was glad I did it but wouldn't do it again. But there are times I find myself thinking about it. I don't think I'd go out of my way to, but if somebody said, "You wanna go do this," I think I probably would.
Y'all are doing something kinda neat, a sightseeing, musical bus tour of Switzerland with 40 fans. I'm familiar with musical cruises; is this something y'all came up with, or have others done it?
Courtney and I have gone to Switzerland five years in a row, I think. We have a promoter over there and we love it there. And you can drive from one corner of the country to the other in five hours. But we did something like this last year, with Reckless Kelly and toured Ireland. We were their guests And Courtney and I decided we had to do this in Switzerland. So it's seven nights and five shows, and we're personally putting it together, where we're gonna stay and eat and the venues we'll play. The response has been great. We're really excited about it.
I Travel On is out today.
Labels: Brent Cobb, Courtney Patton, Interviews, Jason Eady, Kevin Broughton