text:
US Recycling Industry Is Struggling To Figure Out A Future Without China
22-Aug-2019 Intellasia | NPR | 6:02 AM
The US used to send a lot of its plastic waste to China to get recycled. But last year, China put the kibosh on imports of the world's waste. The policy, called National Sword, freaked out people in the US a huge market for plastic waste had just dried up.
Where was it all going to go now?
In March, executives from big companies that make or package everything from water to toothpaste in plastic met in Washington, D.C. Recyclers and the people who collect and sort trash were there too. It was the whole chain that makes up the plastic pipeline. It was a time of reckoning.
John Caturano of Nestle Waters North America, which makes bottled water, said plastic is getting a bad reputation. "The water bottle has in some ways become the mink coat or the pack of cigarettes. It's socially not very acceptable to the young folks, and that scares me," he said during a panel called Life After National Sword.
Sunil Bagaria, who runs recycling company GDB International, took his colleagues to task. "Forever, we have depended on shipping our scrap overseas," he bemoaned. "Let's stop that." European countries, he added, "are recycling 35 percent to 40 percent [of their plastic waste]. The US only recycles 10 percent. How tragic is that?"
Sign Up For The NPR Daily Newsletter
Catch up on the latest headlines and unique NPR stories, sent every weekday.
What's your email?
By subscribing, you agree to NPR's terms of use and privacy policy.
After a couple of days of this, a woman named Kara Pochiro from the Association of Plastic Recyclers stood up and said not to panic. "Plastic recycling isn't dead, and it works, and it's important to protecting our environment, and it's essential to the circular economy," she reassured.
"Circular economy" is now a catchphrase that some say is a way out of the plastic mess. The idea is essentially this: Society needs plastic, but people need to recycle a lot more of it and use it again and again and again. That will eliminate a lot of waste and cut down on the avalanche of new plastic made every year.
So how does circularity actually work? A good place to find out is at a recycling company called TerraCycle in Trenton, N.J. The company's global vice president for research and development is Ernie Simpson. A cheerful man with a Jamaican accent, he works out of a small lab at TerraCycle's headquarters.
He's also a physicist who's part of a collaboration with Procter & Gamble to turn plastic trash into new products. In his lab, Simpson has an array of very sophisticated and expensive equipment a Fourier-transform infrared spectrometer and a calorimeter, which use light or heat, respectively, to determine the chemistry of plastic. What goes into those devices is junk.
Simpson holds up a clear plastic bag. Inside, he says, "is the famous beach plastic from the ocean": wrappers, caps, bottles. To recycle any of it, he has to know what kind of plastic each piece is made of.
How many kinds of plastic are there? "Ohhhh," he sighs. "Indefinite, just about. There are about 20 different categories of material, but there are blends and there are hybrids." Almost all possess their own characteristics, some easily recyclable, many not. Some can be melted down; others shredded mechanically or chemically broken down. They end up as pellets the size of small marbles. These go to fabricators that turn the material back into products.
"And so that's how the famous Head & Shoulders shampoo bottle was created," Simpson says, referring to what P&G calls the "world's first recyclable shampoo bottle made from beach plastic." That's a form of circularity pouring old plastic into new bottles.
There's a catch though. "This particular one," Simpson says of the beach plastic, "is probably three times as expensive as virgin" virgin being brand-new plastic made straight from oil and gas out of the ground. This is one of the obstacles to circularity: It costs a lot. There's not a lot of money to be made from recycling to begin with, and it's tough for recycled plastic to compete with virgin plastic made cheap by the boom in US oil and gas production. And there aren't nearly enough recyclers in the US to handle the tsunami of new plastic pouring out of the petrochemical industry.
"Recycling is the underdog," says Keefe Harrison, CEO of the Recycling Partnership, a non-profit that seeks to boost the industry. "We're fighting an uphill battle to make it cost competitive from day one." One problem, she says, is the US outsourced so much of its recycling to Asia that the domestic industry languished. And there's the fact that plastic manufacturers keep making more and more of it, and consumer brands like Procter & Gamble, Nestle and Walmart keep wrapping more consumer goods in it.
Harrison explains: "So we've got these companies producing this new packaging and new materials and new plastics in such a scientific- and business-driven way, and then [they] rely on the disjointed network that is recycling to get it back. And [recycling] is not robust." That's an assessment shared by others, such as global financial analysis company IHS Markit.
Several petrochemical companies have joined big consumer brands in pledging to make most of their plastic recyclable, reusable or compostable within the next decade or two. Their group, Alliance to End Plastic Waste, has promised to spend $1.5 billion over five years to do that.
But as environmental groups like Greenpeace and Break Free From Plastic point out, just because something can technically be recycled doesn't mean it will be. There has to be an industry robust enough to do it and a profit at the end of the day. And, they say, building up recycling allows plastic producers to keep making 300 million tonnes of new plastic every year (half of which is for single use) and to put the burden of cleaning up the waste on someone else.
Pochiro, of the Association of Plastic Recyclers, says recycling does need help from consumers, for example. "We're trying to make consumers understand that recycling isn't just about putting your container in the bin," she says. "You also need to buy recycled," meaning products that contain recycled plastic.
There's a growing market for such products, stuff like bottles, clothing, packaging or bags, for example. But it's tough to compete against cheap virgin plastic. Recycling companies need huge investments, and to get that, they have to show they have a market for their products. And for that, Pochiro says, they need commitments voluntary or mandated by law by consumer goods companies to buy recycled plastic.
"If a recycler can't be confident enough that they have a market for at least maybe six months to a year," she says, "then they aren't going to want to make that investment in their own facilities" to make more recycled plastic.
But there's a disconnect underlying all this talk by the plastics industry to help recyclers and the circular economy of plastic.
A report from ICIS, a plastics market research company, says the petrochemical industry will likely double its plastic manufacturing capacity from 2016 to 2024. And the American Chemistry Council, which represents, among others, plastics manufacturers, says it expects industry to spend nearly $25 billion to build new plastic manufacturing capacity by 2025. (That compares with the $1.5 billion that the industry plans to spend on cleaning up plastic waste.) The World Economic Forum has issued a report on plastic that predicts a doubling of production in the next two decades.
One thing driving that growth is the belief that demand for petroleum-based fuels will decline the oil and gas industry is looking to produce more plastics from petrochemicals to take up the slack.
So if a new circular plastics economy recycles that is, reuses more old plastic, why is the petrochemical industry spending billions of dollars for a boom in new plastic? Where is all that new plastic going to go? It seems the industry isn't too worried. The American Chemistry Council's analysis includes this statement about new plastic: "In a virtuous cycle, as the manufacturing renaissance accelerates, demand for plastic products will be generated, reinforcing resin [raw plastic] demand."
Essentially, go ahead and make it, and people will find a way to use it.
https://www.npr.org/2019/08/20/750864036/u-s-recycling-industry-is-struggling-to-figure-out-a-future-without-china
Category: China
China coronavirus: 14 medical workers infected by single carrier, officials admit
China keeps lending benchmark LPR steady for second straight month in January
China's post-Sars reporting system may explain long delays in announcing new cases of Wuhan virus
China confirms 291 cases of new coronavirus as of January 20 state media
China confirms human-to-human transmission as SARS-like virus spreads
China repeats call on Canada to release Huawei CFO Meng
Meng Wanzhou extradition hearings finally begin, with defence blasting fraud case against Huawei CFO as 'fiction'
Australian man tested for coronavirus after returning from China with respiratory illness
WHO emergency group to meet on spreading China virus


text:
Q: Cannot read the property 'roles' of undefined I'm making a bot and I have an error that I don't understand in this code : pas
const Discord = require("discord.js");
const client = new Discord.Client();
const token = "";

client.login(token)

client.on("message", async(message) => {
  let staffRole = message.guild.roles.find("name", "Staff");
  let staff = message.guild.member(message.author);

  if (message.author.id === "424974772959444993" || message.member.roles.has(staffRole.id)) {
      return;
  }

  var badWords = [
    'asd',
    'legionmods',
    'verga',
    'vrga',
    'nmms',
    'alv',
    'electromods',
    'remake'
  ];
  var words = message.content.toLowerCase().trim().match(/\w+|\s+|[^\s\w]+/g);
  var containsBadWord = words.some(word => {
    return badWords.includes(word);
  });

  if (containsBadWord) {
    message.delete();
    message.author.send({embed: {
      color: 3447003,
      description: `Has dicho una palabra que no esta permitida en este servidor`
    }

    message.channel.send(`${prefix}tempmute ${message.author}`+" 5m palabra prohibida")
  }
});

This is an error I get :
(node:4952) UnhandledPromiseRejectionWarning: TypeError: Cannot read property
'roles' of null
at Client.client.on (C:\Users\Francisco\Desktop\role\app.js:8:33)

Could someone help me please ? I am not good in debugging errors.

A: message.guild is probably returning null because the message was sent in a dm conversation, not a guild.
You can avoid this problem by writing:
if (message.channel.type !== 'text') return;

Also, a few GuildMemberRoleManager methods have changed a bit since discord.js v12+. You should replace:
let staffRole = message.guild.roles.find("name", "Staff");

With:
let staffRole = message.guild.roles.cache.find(role => role.name === "Staff");

And replace:
message.member.roles.has(staffRole.id)

With:
message.member.roles.cache.has(staffRole.id)

redpajama_set_name: RedPajamaStackExchange


text:
The Real Reason Republicans and Democrats Can't All Just Get Along
Puck/Library of Congress
For many years, experts blamed sharp ideological difference between the two parties for the debilitating gridlock in Washington that led to government shutdowns, budget crises and strong differences over foreign policy and defense issues.
The Pew Research Center in 2014 famously issued a study concluding that Republicans and Democrats "are more divided along ideological lines – and partisan antipathy is deeper and more extensive" -- than at any point in the past 20 years.
Related: How Growing Partisanship Is Splitting the U.S. in Two
Based on extensive polling, Pew researchers discovered that Americans who consistently voiced conservative or liberal views had doubled from 10 percent to 21 percent over the past two decades. "And ideological thinking is now much more closely aligned with partisanship than in the past," the authors of the study wrote.
Now comes a new book, Why Washington Won't Work: Polarization, Political Trust and the Governing Crisis, with a very different take: The reason Republicans and Democrats fight so vehemently is not because of ideological differences, but because they simply don't like each other.
Marc J. Hetherington, author and a professor of political science at Vanderbilt University, writes, "Deeply negative feelings cause more trouble than deep ideological differences would."
"When you disagree with the other side on the issues, you can often find a middle ground. When you don't like the other side, you don't even talk to them…. Absent trust, any bridges that form between the two sides are made of sand."
Hetherington postulates a political dynamic in which lawmakers more often than not reflect the views of their constituents than to try to be thought leaders and influence their voters.
Related: Why Congress Will Get Even Less Done in 2016
This can be highly problematic, especially in the vast majority of congressional districts that are demographically and politically homogenized because of gerrymandering by Republican and Democratic-controlled state legislatures.
For sure, the clash of ideologies also explains perpetual gridlocks in Washington, not to mention the intensely bitter relations between the Obama White House and GOP-dominated Congress.
Hetherington views this visceral negativity as a troubling trend and a reflection of politicians frequently taking cues from their constituents. "Although citizens have it in their capacity to nudge officeholders toward compromise, they don't trust their opponents enough to push their side's representatives to compromise with those they increasingly view as the devil," Hetherington writes.
The end result, he says, is "stagnation" and the kind of gridlock that led, for example, to a near default on U.S. borrowing in 2011, the 2013 government shutdown and former GOP House Speaker John Boehner's forced retirement late last year in the face of a revolt by conservative Republicans who were unwilling to reach a compromise with Democrats on budget and spending issues.
The Clinton Scandal That Still Matters Is Not the One You Think
The Clinton era of the 1990s is remembered as a prosperous time punctuated by a series of scandals. Today, we tend to...
Is This How Trump Would Shrink the Government?
Establishment Republicans upset at the prospect of billionaire Donald Trump becoming their party's nominee aren't...
Sanders' Plan Would Raise Taxes a Staggering $13.6 Trillion over a Decade
Sen. Bernie Sanders of Vermont didn't mince his words during last Monday night's Democratic town hall in Iowa when he...

redpajama_set_name: RedPajamaCommonCrawl


text:
The Bonnie Blue Flag, conosciuta anche come We are a band of brothers, fu un inno non ufficiale degli Stati Confederati d'America molto popolare tra i soldati e i cittadini fin dalla sua prima esecuzione, avvenuta nella primavera del 1861 nel Mississippi. Il compositore, Harry McCarthy, usa come base la stessa della canzone  Irish volunteers, cambiando però le parole.

Testo
1.

We're a band of brothers, native of the soil

Fighting for our liberty, with treasure, blood, and toil.

When first our rights were threatened, and the cry rose near and far

We raised up high the Bonnie Blue Flag that bears a single star!

Hurrah! Hurrah!

For Southern rights, hurrah!

Hurrah for the Bonnie Blue Flag that bears a single star!

2.

As long as the Union was faithful to her trust

Like friends and like brethren, kind were we, and just

But now, when Northern treachery attempts our rights to mar

We hoist on high the Bonnie Blue Flag that bears a single star.

3.

First gallant South Carolina came nobly to the stand

Then came Alabama and took her by the hand

Quickly, followed Mississippi, Georgia, and Florida

All raised on high the Bonnie Blue Flag that bears a single star.

4.

Ye men of valor gather round the banner of the right

Texas and fair Louisiana join us in the fight

Davis, for a President, and Stephens statesmen rare

Now rally round the Bonnie Blue Flag that bears a single star.

5.

Now here's to brave Virginia, the Old Dominion State,

With the young Confederacy at last has sealed her fate,

And spurred by her example, now other states prepare

To hoist high the Bonnie Blue Flag that bears a single star.

(In alternativa:

Now here's to Virginia, the Old Dominion State,

Who with the young Confederacy at length has linked her fate.

Impelled by her example, let other states prepare

To hoist high the Bonnie Blue Flag that bears a single star.)

6.

Then cheer, boys, cheer, raise a joyous shout

For North Carolina and Arkansas now have both gone out,

And let another rousing cheer for Tennessee be given,

For the single star of the Bonnie Blue Flag has grown to be eleven.

7.

Then here's to our Confederacy, strong we are and brave,

Like patriots of old we'll fight, our heritage to save;

And rather than submit to shame, to die we would prefer,

So cheer for the Bonnie Blue Flag that bears a single star.

Collegamenti esterni

Brani musicali di artisti statunitensi
Stati Confederati d'America
Inni

redpajama_set_name: RedPajamaWikipedia


October Mummies - our month is finally here!
Discussion in 'Pregnancy - Third Trimester' started by Hoping, Oct 1, 2008.
I can't believe that the month my baby is due is finally here! My baby is due this month!!! Congrats to all October Mummies to be! Hope you are all cooking mighty fine babies!
Yay, its great 12 days to my C-section!
Yaaaay!! How exiting..though i dont think i will be meeting my LO this month but heyho!!
Awk you will be! he/she will be on time for you!
Mira Preggers #4..It's a girl!
Yay, our month is finally here!
I'm hoping I'm an October mummy, but probably go into November.
I'm a bit worried about that too. I'm due 26th October - my Gran thinks it'll happen on 20th October, she worked it out from the date I first felt movements. Some old wives tale I think but we'll see!
Oooo how exciting... good luck girlies!


I have over 40 years of public accounting experience offering income tax services, business consulting and accounting for small businesses. My experience includes services in the fields of construction, professional services, retail and wholesale, repair, leasing and distribution and agribusiness.
I am licensed as a Certified Public Accountant by the California Board of Accountancy.


Dr.Malpani's Blog: Using Information Therapy to cut out cuts and kickbacks !
Using Information Therapy to cut out cuts and kickbacks !
Today's Times of India has an article documenting corruption in medical practise .
It does a good job with describing the problem, but does not offer any solutions. This is a major tragedy - because it just drives another wedge in the fragile doctor-patient relationship. I wish reporters would talk about success stories rather than focus only on problems !
I feel one effective solution which can create a win-win situation is using websites to provide online Information Therapy !
Ix need not be restricted to just providing medical facts about an illness. By providing information about local and regional medical facilities; the names of specialists; their addresses; and the services they provide and their costs, it can actually help to clean up the medical system. It's a sad fact of life that medical practice has become corrupt today, because consultants, hospitals, diagnostic labs and imaging centers give cuts and kickbacks to doctors to induce them to refer patients to them. Information Therapy can help to cut out cuts and provide a lot of transparency by informing patients about: the costs of procedures; where these are available; and the names of specialists in that field – both in real life and online. Armed with this information, patients need not feel powerless, and can easily get second opinions and shop around for more cost effective treatment options. By cutting out the middleman, they can get better quality services at a lower cost!
Empowering citizens with the RTI Act has helped to encourage them to take a proactive role in governance, thus helping to create a more vibrant democracy. Similarly, embedding Information Therapy within every medical encounter can also help to patients to take a more active and involved role in their healthcare – and this can make for happier patients – and happier doctors !


So, if you want to secure all these outstanding images about (Letter Recommendation Team Leader 13 Easy Rules Of Letter Recommendation Team Leader), simply click save link to save the images in your personal computer. There're ready for obtain, if you love and want to grab it, click save badge in the post, and it'll be directly saved in your desktop computer.} Finally if you want to grab new and recent picture related to (Letter Recommendation Team Leader 13 Easy Rules Of Letter Recommendation Team Leader), please follow us on google plus or bookmark this site, we attempt our best to offer you daily update with fresh and new pictures. Hope you love staying here. For most upgrades and latest news about (Letter Recommendation Team Leader 13 Easy Rules Of Letter Recommendation Team Leader) graphics, please kindly follow us on tweets, path, Instagram and google plus, or you mark this page on bookmark area, We try to offer you up grade periodically with fresh and new graphics, like your surfing, and find the right for you.
Thanks for visiting our site, articleabove (Letter Recommendation Team Leader 13 Easy Rules Of Letter Recommendation Team Leader) published . At this time we are delighted to announce we have found an awfullyinteresting nicheto be reviewed, that is (Letter Recommendation Team Leader 13 Easy Rules Of Letter Recommendation Team Leader) Many people trying to find info about(Letter Recommendation Team Leader 13 Easy Rules Of Letter Recommendation Team Leader) and certainly one of them is you, is not it?


There are fair criticisms to make about the Congresswoman-elect's ideas, but some conservatives are trying a different tactic: claiming she doesn't look poor enough. Ocasio-Cortez connected to voters through stories about her real struggle to make ends meet - such as tweeting photos of her worn-out shoes and discussing her past as a bartender and waitress. After getting elected, she had to move to Washington D.C., where rent is extremely expensive, and her salary doesn't kick in for three months. "I've really been just kind of squirreling away and then hoping that gets me to January," she told the New York Times.
The tweet sparked outrage, as many people found the comment 'sexist.' Seriously, why are right-wing TV personalities mocking Ocasio-Cortez for candidly sharing her financial troubles? Isn't picking yourself up from your bootstraps, and going from nothing to something, like, their whole philosophy? Why spread false statements about her fancy apparel? How many times have they uploaded creepy photos of Congress-men and speculated on the fanciness of their clothing? Anyway, Twitter users responded by savagely mocking Scarry's comment, and the results are hilarious.
Even The Onion got in on it!
After the responses went viral, Scarry deleted his tweet, and tried to say he wasn't making a dumb sexist comment. He claimed just trying to praise Ocasio-Cortez, for looking so well-put-together and "ELEGANT, even!" (Uh-huh, sure.) Fortunately, someone screenshotted his original tweet for posterity.
Meanwhile, Ocasio-Cortez took it all in stride. She tweeted, "The reason journos from @FoxNews to @dcexaminer can't help but obsess about my clothes, rent, or mischaracterize respectful convos as "fights" is bc as I've said, women like me aren't supposed to run for office - or win. & that's exactly why the BX and Queens sent me here."
In another tweet, she explained that there's no way to win with right-wing trolls: "If I walked into Congress wearing a sack, they would laugh & take a picture of my backside. If I walk in with my best sale-rack clothes, they laugh & take a picture of my backside. Dark hates light - that's why you tune it out."
It doesn't seem like a very smart political strategy to mock people in the the 99% for financial struggles, but hey, good luck, conservative pundits.


text:
Information published on 2 June 2015 in the UIC electronic newsletter "UIC eNews" Nr 451.
Portugal: REFER merges with Estradas de Portugal to become Infraestruturas de Portugal
News from UIC members
As per a decree-law dated 29 May and taking effect as of 1 June 2015, Portugal's rail infrastructure manager REFER, E.P.E. has merged with Estradas de Portugal S.S., the Portuguese road manager, creating a new company called 'Infraestruturas de Portugal, S.A.'
All duties and competences of either Estradas de Portugal or REFER, E.P.E., have therefore been transferred to Infraestruturas de Portugal.
(Source: EP, S.A.)
UIC e-News 451
UIC represents the rail sector at the 2015 World Summit of the ITF-OECD International Transport Forum in Leipzig 2nd UIC World Conference on Standardisation will be held on 9 June 2015 in Paris 12th session of the International Working Group on Land Transport Security (IWGLTS) Eress Forum takes place in Amsterdam on 27 May 2015 UIC participates in the OSJD Rail Freight Conference Capacity4Rail will hold its first dissemination workshop from 10 – 11 June 2015 at UIC HQ, Paris Mineta Research: How underground urban rail systems can manage pedestrian traffic in increasingly crowded stations Japan's maglev train breaks world speed record with 600km/hour test run Central Japan Railway Company and West Japan Railway Company will be launching the "Takayama‐Hokuriku Area Tourist Pass" Israel Railways sets new passenger record: 7.5% more passengers carried in 2014
e-News articles with keyword News from UIC members
Kazakhstan: New rail passenger cars ran for the first time from the capital of Kazakhstan on New Year's Eve (14 January) Paul Godart (Infrabel) retires from UIC TEG chairmanship (14 January) Czech Republic: Regular Passenger Transport Returns to Židlochovice after Forty Years (17 December 2019) Germany: DB Schenker opens fully solar-powered logistics center in Dubai (17 December 2019) United Kingdom: Safety film inspired by Northamptonshire teens turned into comic (10 December 2019)
0 | 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | ... | 1525


Raise the Volume is here to amp up the way you sew with low volume fabrics! Crisp lines, abstract shapes, and eccentric typography is arranged over subtle variations of white to cream that will blend freshly into your sewing projects. Black and cream to tan fabric.


bonnie cove is a 2 mile trail located near Glendora, California that offers scenic views. The trail is rated as moderate and primarily used for hiking, mountain biking, trail running & walking. Dogs are also able to use this trail but must be kept on leash.
lower monroe truck trail is a 11.7 mile out and back trail located near Glendora, California that features beautiful wild flowers. The trail is primarily used for hiking, mountain biking, trail running & walking.
Mystic Canyon Trail is a 2.6 mile out and back trail located near Glendora, California. The trail is rated as difficult and primarily used for hiking, mountain biking & trail running.


After installation it was there, but now its gone.
Which counter, RTSS or FRAPS ?
Try to run a 3D application if it comes back.
(08-04-2014, 06:18 PM)Martin Wrote: Which counter, RTSS or FRAPS ?
Quote: :Added monitoring of FPS counter from RTSS.
Do you have the RTSS running ?
(08-05-2014, 03:54 PM)Martin Wrote: Do you have the RTSS running ?
Please attach a complete screenshot of the sensors window, so I can check..
(08-05-2014, 04:05 PM)Martin Wrote: Please attach a complete screenshot of the sensors window, so I can check..
Try to go into Settings -> Layout and press "Restore Original Order".
You also seem to have some values hidden, isn't this one of them?
(08-05-2014, 08:22 PM)Martin Wrote: Try to go into Settings -> Layout and press "Restore Original Order".
FPS counter is gone. Its not there on portable version either.


The 23-year-old is a potential candidate for breakout star of the tournament. Though diminutive in size, Silva possesses a wand-like left foot. He's sublime in exploiting small pockets of space with his silky touch. Silva routinely whizzes the ball around the park — often opening up space for wingers and strikers to operate. With Portugal, Silva will be the fulcrum in its offensive attack. Don't be shocked to see him careen far up the list by the time the tournament ends.


Menu, The Word Menu Images was posted June 18, 2017 at 12:42 pm by breadandrosesfoodcoop.org . More over The Word Menu Images has viewed by 1034 visitor.
Menu, Menu Template Free Printable Word was posted September 26, 2017 at 9:08 am by breadandrosesfoodcoop.org . More over Menu Template Free Printable Word has viewed by 3602 visitor.
Menu, Free Menu Templates Microsoft Word was posted November 24, 2017 at 6:45 pm by breadandrosesfoodcoop.org . More over Free Menu Templates Microsoft Word has viewed by 1701 visitor.
Menu, Free Menu Templates For Word was posted January 26, 2017 at 4:44 pm by breadandrosesfoodcoop.org . More over Free Menu Templates For Word has viewed by 1473 visitor.
Menu, The Word Menu In Fancy Writing was posted April 20, 2018 at 7:59 pm by breadandrosesfoodcoop.org . More over The Word Menu In Fancy Writing has viewed by 2240 visitor.
Menu, Free Menu Templates For Microsoft Word was posted November 9, 2017 at 12:29 am by breadandrosesfoodcoop.org . More over Free Menu Templates For Microsoft Word has viewed by 1675 visitor.
Menu, Menu Word Clipart was posted October 20, 2018 at 12:47 pm by breadandrosesfoodcoop.org . More over Menu Word Clipart has viewed by 1331 visitor.
Menu, Drink Menu Templates Microsoft Word was posted November 3, 2017 at 7:57 am by breadandrosesfoodcoop.org . More over Drink Menu Templates Microsoft Word has viewed by 1671 visitor.
Menu, Wedding Menu Word Art was posted April 11, 2017 at 7:21 am by breadandrosesfoodcoop.org . More over Wedding Menu Word Art has viewed by 1911 visitor.
Menu, The Word Menu was posted September 8, 2018 at 1:33 pm by breadandrosesfoodcoop.org . More over The Word Menu has viewed by 748 visitor.


text:
Artists at the Center: MALACARNE & Alice Gosti
Artists At the Center is a multi-year collaboration between Seattle Office of Arts & Culture and Seattle Center, with support from Uptown Arts & Culture Coalition and the communities adjacent to Seattle Center campus. The project is made possible by a 10-year grant from Climate Pledge Arena and Seattle Kraken.
Join us as we introduce emerging and established artists and celebrate their talent on a newly revitalized Seattle Center campus. Artists are given a performance opportunity, allowing them to connect with new audiences, display their talents and advance their careers. Visitors to campus and the surrounding neighborhood benefit from surprising and delightful pop-up performances throughout the year. Each year, artists are selected with an equity and social justice lens, ensuring equitable representation for underserved and emerging artists. Artistic genres include music, dance, theater, cultural demonstrations, and multi-disciplinary work.
Same Day Events Showing Events on March 03, 2023
View Similar Events
Hot Chocolate 15K/5K 2326703C : Expo & Packet Pick-up
Carmela Full of Wishes
The Murder of Roger Ackroyd
Between Two Knees: Preview Performance
Art Battle Seattle : Regionals


It may be one of the smallest incorporated towns in Texas (official population: 90), but don't let that fool you—the little town of Round Top makes for some big trippin'. Visit during the biannual Texas Antiques Week and you'll find thousands of "junkers" filling every available cow pasture with vintage collectibles. But even on a normal day, this hamlet has plenty of charm.
First up: coffee. The fresh scent filling Henkel Square emanated from Two Sparrows Roasting Co. Since it was already a little toasty outside, I opted for a cup of frothy nitro cold brew, made in house—it was definitely the right choice.
To view the Round Top episode visit thedaytripper.com.
After my morning pick-me-up, I walked Henkel Square Market, which made me feel like I had stepped onto a movie set with its shops housed in historic homes, barns, and a church. I perused the quirky paintings at Humble Donkey Studio and sniffed the candles at Indian Creek. My favorite store was The Dapper Deer Co., boasting an awesome selection of manly antiques including vintage watches, bowler hats, and English sporting jackets.
For lunch, I found Teague's Tavern, owned by longtime Houston news anchor Don Teague on the edge of the square. This restaurant serves up modern American fare with Don's Emmy Award decorating the shelf above the bar. I started my meal with some delicious fried pickles, then enjoyed a plate of meatloaf and thick-cut fries.
I followed a mysterious-looking road and stumbled upon Festival Hill, one of the most exquisite concert halls I've ever seen. This 1,000-seat venue opened in 1971 as a training and performing facility for talented classical musicians. Its intricate woodwork and detail rival the opera houses of Europe. I quickly marked my calendar to return for a concert.
For visitor information, contact the Round Top Area Chamber of Commerce at 979-249-4042 or roundtop.org.
I was hitting a midday slump, so I followed my stomach to Royers Pie Haven where a dozen flavors of homemade pie awaited. After much debate, I opted for a slice of Junkberry, complete with raspberries, blueberries, strawberries, apples, and peaches. I ordered it a la mode and it went down so quickly that I had to order another. This time, I chose the Texas Trash Pie and dug into its sweet, salty, chocolatey, caramelly goodness as I sat on the front porch. After that, I really felt like taking a nap.
Needing to rally, I cruised down the road, and a pink Suburban on the lawn of the Junk Gypsy Company caught my eye. Its name is "Large Marge." The store, run by sisters Amie and Jolie Sikes of Junk Gypsy fame, features a collection of new and vintage finds presented in a way that only the crafty sisters could pull off. I was tempted to buy a mounted buffalo but opted instead for an embroidered shirt that made me feel like Roy Rogers.
Ready for dinner, I had one destination on my mind: Royers Round Top Café—the parent restaurant to the pie joint I visited earlier in the day. Judging by the crowd, others had the same idea. I squeezed into the small dining room as posters, shirts, and memories from the eatery's 31 years hung above my head. More than typical country classics, the menu offers a delicious array of upscale comfort food. I had beef tenderloin topped with a glaze of mushrooms, wine, and butter—perfection.
I wasn't quite ready to call it a night and could hear muffled music coming from The Stone Cellar, a cool honky-tonk with a dance floor catering to two-steppers. I grabbed a cold beer and sat down with a group of friendly cowboys as we toasted to the perfect day trip.
As the music swelled, I couldn't think of a better way to end my day in Round Top. While Antiques Week may be fun, this town really shines when the masses are gone. Who knows, I might make it "Population: 91" someday. So whether you follow my footsteps or forge your own path, I hope to see you on the road.


When the daughter of a trade union organiser announces her relationship with a black man, the revelation exposes deep prejudice and hidden conflicts in her family.
The post-World War II years saw the beginning of large-scale immigration to Britain, with race relations becoming a major issue for the first time. Ted Willis 's 'Hot Summer Night' premiered on stage in November 1958, just a few months after Britain's first race riots erupted on the streets of Notting Hill. The confrontations depicted in Willis 's play are a little more restrained, but only just.
The play made a quick transition from stage to television, no doubt aided by the desire of newly-installed producer Sydney Newman to present drama on Armchair Theatre (ITV, 1956-74) which reflected the real world concerns of its audience. In the theatre, the play had focused as much on the neglect of Nell Palmer by her husband, Jacko, as on their daughter Kathie's relationship with the Jamaican, Sonny. For television, the emphasis was shifted more squarely onto the drama resulting from the proposed mixed marriage.
'Hot Summer Night' was one of the first television dramas to tackle issues of race. Whereas the BBC 's A Man from the Sun (tx. 8/11/1956) had dramatised the experience of Caribbean immigrants and touched upon work-place racism, 'Hot Summer Night' took a domestic approach. By concentrating on the beliefs and instincts of one family and one immigrant, Willis is able to explore some of the fundamental issues of racial integration: mixed relationships, instinctive dislike of the 'other', and community double standards. Nell reveals a violent revulsion at the thought of the mixing of black and white skin; Jacko, a good Union man, is exposed as a hypocrite, fighting colour bar at work but opposing mixed relationships at home; Sonny is made ashamed of his skin, wanting only to marry the girl he loves.
'Hot Summer Night' asks difficult questions of its characters and audience, and provides no easy answers. Its ending is at least vaguely optimistic, with Kathie and Sonny maintaining their determination to marry despite the prejudice and social obstacles they know they will face.
The play was later remade as the feature film Flame in the Street (d. Roy Ward Baker, 1961), with the action opened up to encompass more of the workplace and local community. The exclusively domestic setting of 'Hot Summer Night' , however, is one of its greatest strengths; it is recognisable to all viewers and can only have aided the audience's identification with the drama's characters and engagement with its underlying issues.


text:
Articles from the April 30, 2009 edition
Sorted by date Results 1 - 25 of 46
By Shannon Burns News April 30, 2009
MCA district chief accused of impaired driving
A Mohawk Council of Akwesasne district chief has allegedly been charged with impaired driving while away on an MCA business trip on March 24, 2009 in Ontario. Chief Nona Benedict of the Kawehno:ke...
AMS students compete in annual Tom Longboat Run
Every year pre-kindergarten through grade 6 students at the Ahkwesahsne Mohawk School take part in a decades long tradition: Competing in the Tom...
AMS students compete in annual Tom Longboat Run Part 2
Tribe pro-actively preparing for possible swine flu
St. Regis Mohawk Tribe's Health Services is taking steps to monitor and prevent cases of swine flu in the Akwesasne territory which include preventive measures and keeping track of any unusual numbe...
5-mile cancer walk raises over $13,000
A 5-mile walk/run was organized in Akwesasne and held Sunday morning in Tsi Snaihne (Snye) to support the Akwesasne Cancer Support Group. An astoundin...
Unity rally planned as Canada prepares to arm border guards
The community of Akwesasne will come together Friday morning on Kawehno:ke (Cornwall Island) for a unity rally that is in part intended to send a message to Government Canada that Mohawks are against...
Obituaries April 30, 2009
Harry P. Cook
Mr. Harry P. Cook, age 57, of 400 St. Regis Road died very unexpectedly at his home, Thursday April 23, 2009. Harry was born June 15, 1951, in...
Leonard M. Bintz
Mr. Leonard M. Bintz, 77, of 14 Danforth Place, Massena, died Saturday morning April 25, 2009 at the St. Regis Nursing Home. He had been a patient...
Esther C. Loran
HOGANSBURG - Mrs. Esther C. Loran, age 74, of 289 State Route 37, passed away on Monday, April 27, 2009 at Upstate Medical Center in Syracuse...
HARVEY N. COOK
Mr. Harvey N. "Herky"Cook, 83, of 428 St. Regis Road, Hogansburg, passed away on Tuesday, April 29, 2009 afternoon at Tsiionkwanonhso:te,...
By Doug George Kanentiio Opinion April 30, 2009
Our Living History
It is beneficial for us to remember our history, both personal and communal, since the events of the past flow through our lives, giving it dimension, direction and power. Some of those occurrences ma...
Opinion April 30, 2009
April 23, 2009 Appalled at the Salmon River Central School District! I've been called to the school on a number of occasions regarding my children. I had no idea that ACFS gave birth to my child as...
Note: The following letter was written by a sixth-grader in Mrs. LaSala's St. Regis Mohawk School class as part of a class assignment. Dear Editor, The problem that I want to fix is dog fighting in...
Niawen Kowa
Niawen Kowa The family of Nancy 'Kwanentawi' Bova Chaussi would like to thank all the people who showed kindness and comfort during our difficult time. Thank you to Stanley and Joanne Thompson...
Thank you The Akwesasne Boys & Girls Club would like to send a Niawen:kowa to The American Legion Members, Auxiliary and Sons of the American Legion...
Niawenko:wa / Thank You for supporting our Iakhinoronhkwa Language Nest Fundraisers.
Niawenko:wa / Thank You for supporting our Iakhinoronhkwa Language Nest Fundraisers. Niawenko:wa to Debbie Soloman for giving us a place to have our Garage Sale on March 28, 2009. Tewentahawihtha...
Election season gets underway in Akwesasne
Akwesasne will soon be inundated with political talk as elections are set to take place on both sides of the border this year, at the St. Regis Mohawk Tribe and Mohawk Council of Akwesasne. The...
Saiowisakeron Day 2009
The first day of May 2009 marks the 110th anniversary of the passing of Saiowisakeron, also known as 'Jake Ice.' John Saiowisakeron Fire and his brother Chief Jake Ohnehtotake Fire were early...
Valium possession arrest
Brittany L. Benedict, 26, of 396 St. Regis Road, Hogansburg, was arrested Sunday at the U.S. Port of Entry. According to police, Benedict was referred for a secondary inspection when entering the...
By Robin Lazore News April 30, 2009
Mohawk Basketmakers of Akwesasne
As a basket maker here at Akwesasne, I came across this wonderful story of baskets that was written when my daughter Robin was in school. Even back th...
PTO hosts Family Fun Night
The newly formed Parent Teacher Organization of the St. Regis Mohawk School organized a Family Fun Night last week. The event was part of a larger ser...
Route 37 Homes officially opens with model home open house
Rosalie Jacobs, owner of Route 37 Homes, along with Manager Tonya Laughing and St. Regis Mohawk Tribal Sub-Chief Stacy Adams cut the ribbon Friday to...
Community members use creativity in birdhouse-building contest
An impressive 34 birdhouses were built from scratch in the past few weeks as part of the Akwesasne Housing Authority's 25th Anniversary Celebration...
Akwesasne Housing Authority's Anniversary Logo Contest Winners
The following are local artists whose logos were featured in last week's issue of Indian Time for having won the Akwesasne Housing Authority's...
AMBE staff participate in Big Bike for Heart and Stroke
The Ahkwesahsne Mohawk Board of Education (AMBE) administration and school personnel participated in the Big Bike for Heart and Stroke on April 24, 20...
Nicandri Nature Center...
Vandalism on Mohawk As...Mahlon Smoke
Nova Scotia RCMP arres...
Stay Off the Ice
Alaska Native artist s...


Both the cook stove and water projects continue to move forward in Eritrea as last month we initiated our stakeholder consultation for a new community safe water programme in Zoba Anseba. The meeting, held in the local hall, was well attended by representatives from all the surrounding villages and the feedback received truly showed that the importance of water resources is highly valued. The project will identify communities that don't currently have access to improved water sources because of broken boreholes and rehabilitate them to good working order.
Though the meeting was led by our project partners to give details of the project and take feedback, we were pleased to see active discussion between village members about how to best preserve the pumps once they have been fixed. The importance of borehole maintenance and awareness of water resource management were both raised and will be part of project over its lifetime.
The success of the cook stove project in Zoba Anseba has continued and recently completed its second verification under Gold Standard. The project funded the training and construction of more than 3,600 'Adhanet' stoves in the district. Hugely popular in the region, the stoves have shown reductions in wood use of as much as 70% and over; a huge improvement making a significant impact on rural families.
By embedding training on stove construction and borehole maintenance in to the programme, it strengthens the sustainability of the projects and furthers the sustainable livelihoods and sustainable communities across Eritrea.
Since the beginning of our Uganda projects in 2013, co2balance with the help of its partner Organisation WAACHA in Kaliro District and Project Officers in the Lango sub-region have continuously worked with the communities right from rehabilitating hand-pumped boreholes to maintaining them annually and doing reactive repairs when need arises. This has been done hand in hand with the community who provide unskilled labor when required. They also use their borehole user fees to contribute towards minor repairs at the boreholes which has given them a sense of ownership of these projects.
On a recent visit to the projects, I was joined by our Carbon Projects Officer Tom Urry who was visiting Uganda for the very first time and also meeting the communities that are beneficiaries to the project. We visited some boreholes and also had a chance to engage with the community and get their feedback on the project.
During our visit in Kaliro, we had the privilege to be joined by a team from Climate Neutral Group who had a chance to meet the borehole users. committee and also interact with the users of Mwanga and Masuna boreholes.
We visited a number of boreholes, met their water user committee members and had some community engagement sessions. From our interaction, we learnt that the communities were putting into practice all that they had learnt from the last Water Sanitation and Hygiene (WASH) training they received. They said that that much as they have learnt basic hygiene practices like washing hands after toilet use and before preparing and eating food, getting soap has continued to be a big challenge. Some afford it occasionally while for others, it doesn't lead as a basic priority hence they do without it.
To address the challenge of difficulty in getting soap, as part of a WASH campaign, our partners WAACHA in Kaliro District decided to start training women groups attached to the boreholes in local soap making using plant materials and herbs. Apart from using this at home, they can also sell the soap and earn an extra income to meet other basic needs in their households.
With the training received from co2balance on basic hygiene in homes, the borehole users with the help of Village Health trainers have been able to improve on their sanitation facilities and also construct simple tippy taps near their toilets. This is to help cultivate the culture of washing hands after using the toilet.
In a bid to get the community involved in the projects, topping to the monthly monitoring visits, we were able to meet the communities, discuss their concerns and rising challenges and get their feedback on the project.
We were able to visit some of the old water sources that the borehole users entirely depended on before the boreholes were rehabilitated. This would prompt them to cut down more trees in order to get wood fuel for boiling their water but with this continued practice, wood became more scarce and expensive. This left some of them with no option but to take unsafe water hence getting waterborne diseases like diarrhea, typhoid, cholera among others.
With the government being one of our support systems in implementing these boreholes projects, we have continued to engage with them for the success of the project. Through the District Water officers and other local government staff, we are able to identify the boreholes to rehabilitate, monitor them, get household information among others.
We had the chance of paying a courtesy call to the sub-county offices at Omoro in Alebtong district which is home to many of our boreholes, with the latest addition being a solar pumped borehole rehabilitated recently to expand on the Lango Safe Water project.
On overall, the Kaliro and Lango sub-region borehole users are very happy with the projects and this is shown by their active involvement and prompt implementation of whatever recommendations they receive from the project officers' monthly visits.


text:
Q: Log4j: Route logs to logger based on method-stack i would like to know if it is possible to configure log4j in such a manner that all log messages that are issued from a given class will be written in an extra file, regardless wether they are issued directly by this class or indirectly (through method calls of other classes).
Let's say we have parts of our buisiness logic in class foo.bar.BL. Log4j is configured to output all logs of package foo.bar to a file. We have an interface to a customer realized in class foo.bar.interfaces.CustomerIF. To process the requests from the customer, foo.bar.interfaces.CustomerIF calls some methods from foo.bar.BL. Now we want to seperate the logs originated by a customer-request to an extra log file, including the log messages issued in foo.bar.BL.
Any ideas how we can achieve the desired behaviour?
Thanks in advance,
takki


text:
Baywatch filming closes roads near Forsyth Park
Updated: 9:56 AM EDT Mar 21, 2016
Ashley Liotus
SAVANNAH, Ga. (WJCL) - Baywatch will continue filming in Savannah Monday near Forsyth Park. Portions of Gaston and Bull Street will be closed.Gaston Street between Drayton and Whitaker will be closed Monday from 5 a.m. until 11 p.m. Bull Street will also be closed between Gordon and Gaston during the same time. There will also be intermittent road closures along Drayton Street throughout the day.Crews will be filming Baywatch in the northern end of Forsyth Park. Equipment trucks will be parked along those roads, so parking in the area will be limited. Use caution if you are driving in these areas. All roads should be open by 11 p.m. Monday evening.
SAVANNAH, Ga. (WJCL) - Baywatch will continue filming in Savannah Monday near Forsyth Park. Portions of Gaston and Bull Street will be closed.
Gaston Street between Drayton and Whitaker will be closed Monday from 5 a.m. until 11 p.m. Bull Street will also be closed between Gordon and Gaston during the same time. There will also be intermittent road closures along Drayton Street throughout the day.
Crews will be filming Baywatch in the northern end of Forsyth Park. Equipment trucks will be parked along those roads, so parking in the area will be limited.
Use caution if you are driving in these areas. All roads should be open by 11 p.m. Monday evening.


Our aim is to provide you and your family with the standards of care and service you expect. Your views, good or bad, are always welcome as they help us to keep our standards high. If you want to comment, if you are concerned about any aspect of the service you have received from us or if you want to make a complaint, you are welcome to do so. Ask to speak to Miss Glen Garton.
Please note, we welcome constructive comments and suggestions about our service and have a suggestion box in reception.


text:
Q: Send email using Graph API only from few user accounts in background process I have a background application ( azure function ) which needs to send email from our service account to set of the users under same tenant . I am planning to use the GRAPH api to send the email and I can achieve it using below steps
a. Register an app in azure directory
b. Assign the application permission to send email as any user
c. Get the admin consent for that permission
d. write c# code to get the token and call graph api to send email
I do not see issue with the above approach except the fact that we will be getting the consent to send email as any user , which is quiet dangerous , this will enable me to send email as CEO or CFO of our company
could you please help or guide me if there is any way to send email on behalf of other user using graph api for demon applications ?
Regards,
Kumar

A: You can scope the Service principal permission just to the mailboxes you need to send as https://learn.microsoft.com/en-us/graph/auth-limit-mailbox-access. The other way is to have a service account and the grant it delegate access to mailboxes you want to send as but this is generally less secure and harder to maintain (eg you have username and password).


Fashion meets comfort in the Motif Women's Bootie. An adjustable strap and a contrasting suede panel amp up the style of this leather boot. This bootie features the EurSole Comfort System and a dual-density removable cork/EVA footbed has a layer of memory foam. This combo offers springy comfort, while the memory foam will form to the shape of your foot. The footbed has a leather lining while the interior sides of the boot have an antimicrobial microfiber lining. A nylon shank and an arch stabilizing disk provide excellent arch support while the flexible midsole allows you to move with easy comfort, absorbing the impact of your steps to cushion your foot. With a recycled rubber outsole that's oil-resistant and slip-resistant, your foot will be secure on slippery surfaces.


text:
Super Bowl Owner Falls to Alzheimer's as Super Crooner Diagnosed
One man lost his battle to Alzheimer's as another man gets diagnosed. Because they are well known the world knows but the impact of dementia, including Alzheimer's hits many American families.
George H.W. Bush, the 41st President, Dies at Age 94
The 41st President of the United States, has battled numerous health issues, including vascular parkinsonism, passes away at the age of 94.
Tim Conway Dead at Age 85 Following Long-Term Care
America's TV & movie icons are getting older. Many need long-term care services. Tim Conway's family had to deal with the consequences of aging.
5 Min Read Linda Maxwell
Barbara Bush's Death Highlights End-Of-Life Care
Many people don't think of end-of-life issues. Hospice, comfort care or palliative care makes it easier on both the person and the family. Barbara Bush's end-of-life decision may bring comfort to other families.
Lady Gaga Cancelled Tour with Concern for Health
Like many Americans, pop star Lady Gaga is suffering from fibromyalgia, a painful condition which can impact activity and even cause future long-term care. Advance plan with LTC insurance will help provide quality care.
Neil Diamond Retires Following Parkinson's Diagnosis
Superstar singer Neil Diamond retires from performing following a diagnosis of Parkinson's disease. He becomes yet another celebrity impacted by the degenerative disorder which causes Long-Term Care
David Cassidy - Did He Die with Dementia?
David Cassidy, pop culture idol of the 1970s, died Tuesday, November 21, 2017, at a Fort Lauderdale, Florida, area hospital. He was 67. He said he had dementia but did he?
NHL Star Bryan Bickell Retires - Diagnosed with MS
People need Long Term Health Care due to illnesses, accidents or the impact of aging. MS can cause physical, emotional and financial burden on family.
Eric Clapton Career May End, Peripheral Neuropathy
The pop & rock stars that played on your radio are now aging, just like you.


text:
'use strict';

const gulp = require('gulp');
const config = require('../config');
const bump = require('gulp-bump');
const args = require('yargs').argv;

module.exports = function() {

  let options = {
    type: 'patch',
  };

  if (args.hasOwnProperty('ma')) {
    options.type = 'major';
  } else if (args.hasOwnProperty('mi')) {
    options.type = 'minor';
  }

  return gulp.src(config.bump.files)
    .pipe(bump(options))
    .pipe(gulp.dest('./'));
};

redpajama_set_name: RedPajamaGithub


text:
"""Convex decomposition of the link geometry of the robot.

.. image:: ../../images/databases/convexdecomposition.jpg
  :width: 640

`[source] <../_modules/openravepy/databases/convexdecomposition.html>`_

**Running the Generator**

.. code-block:: bash

  openrave.py --database convexdecomposition --robot=robots/barrettsegway.robot.xml

**Showing the Decomposition**

.. code-block:: bash

  openrave.py --database convexdecomposition --robot=robots/barrettsegway.robot.xml --show

Usage
-----

Dynamically load the convex hulls for a robot:

.. code-block:: python

  cdmodel = openravepy.databases.convexdecomposition.ConvexDecompositionModel(robot)
  if not cdmodel.load():
      cdmodel.autogenerate()

Description
-----------

Approximates each of the links with a set of convex hulls using John Ratcliff's `convexdecomposition library`_.

.. _`convexdecomposition library`: http://codesuppository.blogspot.com/2009/11/convex-decomposition-library-now.html

.. image:: ../../images/databases/convexdecomposition_wamenv.jpg
  :height: 250

Command-line
------------

.. shell-block:: openrave.py --database convexdecomposition --help

Class Definitions
-----------------

"""
from __future__ import with_statement # for python 2.5
__author__ = 'Rosen Diankov'
__copyright__ = 'Copyright (C) 2009-2012 Rosen Diankov <rosen.diankov@gmail.com>'
__license__ = 'Apache License, Version 2.0'

if not __openravepy_build_doc__:
    from numpy import *

from numpy import reshape, array, float64, int32, zeros, isnan

from ..misc import ComputeGeodesicSphereMesh, ComputeBoxMesh, ComputeCylinderYMesh
from ..openravepy_int import KinBody, RaveFindDatabaseFile, RaveDestroy, Environment, TriMesh, RaveCreateModule, GeometryType
from ..openravepy_ext import transformPoints, transformInversePoints
from . import DatabaseGenerator

import numpy
import time
import os.path
from os import makedirs
from optparse import OptionParser
from itertools import izip

try:
    from cStringIO import StringIO
except:
    from StringIO import StringIO

import logging
log = logging.getLogger('openravepy.'+__name__.split('.',2)[-1])

try:
    from .. import convexdecompositionpy
except Exception, e:
    print 'failed to import convexdecompositionpy', e

class ConvexDecompositionError(Exception):
    def __init__(self,msg=u''):
        self.msg = msg
    def __unicode__(self):
        return u'Convex Decomposition Error: %s'%self.msg
    def __str__(self):
        return unicode(self).encode('utf-8')

class ConvexDecompositionModel(DatabaseGenerator):
    """Computes the convex decomposition of all of the robot's links"""
    def __init__(self,robot,padding=0.0):
        """
        :param padding: the desired padding
        """
        DatabaseGenerator.__init__(self,robot=robot)
        self.linkgeometry = None
        self.convexparams = None
        self._padding = padding
        self._graspermodule = None # for convex hulls

    def clone(self,envother):
        clone = DatabaseGenerator.clone(self,envother)
        #TODO need to set convex decomposition?
        return clone

    def has(self):
        return self.linkgeometry is not None and len(self.linkgeometry)==len(self.robot.GetLinks())

    def getversion(self):
        return 2

    def save(self):
        try:
            self.SaveHDF5()
        except ImportError:
            log.warn('python h5py library not found, will not be able to speedup database access')
            self.SavePickle()

    def load(self):
        try:
            try:
                return self.LoadHDF5()
            except ImportError:
                log.warn('python h5py library not found, will not be able to speedup database access')
                return self.LoadPickle()
        except Exception, e:
            log.warn(e)
            return False

    def SavePickle(self):
        DatabaseGenerator.save(self,(self.linkgeometry,self.convexparams))

    def SaveHDF5(self):
        import h5py
        filename=self.getfilename(False)
        log.info(u'saving model to %s',filename)
        try:
            makedirs(os.path.split(filename)[0])
        except OSError:
            pass

        f=h5py.File(filename,'w')
        try:
            f['version'] = self.getversion()
            gparams = f.create_group('params')
            for name,value in self.convexparams.iteritems():
                gparams[name] = value
            f['padding'] = self._padding
            glinkgeometry = f.create_group('linkgeometry')
            for ilink, linkgeometry in enumerate(self.linkgeometry):
                glink = glinkgeometry.create_group(str(ilink))
                for ig, geometryhulls in linkgeometry:
                    glinkhulls = glink.create_group(str(ig))
                    glinkhulls['igeometry'] = ig
                    ghulls = glinkhulls.create_group('hulls')
                    for j, hull in enumerate(geometryhulls):
                        ghull = ghulls.create_group(str(j))
                        for name,values in izip(['vertices','indices','planes'],hull):
                            if len(values) == 0:
                                ghull.create_dataset(name,[],dtype=values.dtype)
                            else:
                                ghull[name] = values
        finally:
            f.close()

    def LoadPickle(self):
        try:
            params = DatabaseGenerator.load(self)
            if params is None:
                return False
            self.linkgeometry,self.convexparams = params
            if not self.has():
                return False
            return True
        except e:
            return False

    def LoadHDF5(self):
        import h5py
        filename = self.getfilename(True)
        if len(filename) == 0:
            return False

        self._CloseDatabase()
        f = None
        try:
            f=h5py.File(filename,'r')
            if f['version'].value != self.getversion():
                log.error(u'version is wrong %s!=%s ',f['version'],self.getversion())
                return False

            self.convexparams = {}
            gparams = f['params']
            for name,value in gparams.iteritems():
                self.convexparams[name] = value.value
            self._padding = f['padding'].value
            glinkgeometry = f['linkgeometry']
            self.linkgeometry = []
            for ilink, glink in glinkgeometry.iteritems():
                linkgeometry = []
                for ig, glinkhulls in glink.iteritems():
                    ghulls = glinkhulls['hulls']
                    geometryhulls = []
                    for j, ghull in ghulls.iteritems():
                        hull = [ghull['vertices'].value, ghull['indices'].value, ghull['planes'].value]
                        geometryhulls.append(hull)
                    linkgeometry.append((int(ig),geometryhulls))
                while len(self.linkgeometry) <= int(ilink):
                    self.linkgeometry.append(None)
                self.linkgeometry[int(ilink)] = linkgeometry
            self._databasefile = f
            f = None
            return self.has()

        except Exception,e:
            log.debug(u'LoadHDF5 for %s: ',filename,e)
            return False
        finally:
            if f is not None:
                f.close()

    def setrobot(self):
        with self.env:
            for link,linkcd in izip(self.robot.GetLinks(),self.linkgeometry):
                for ig,hulls in linkcd:
                    if link.GetGeometries()[ig].IsModifiable():
                        link.GetGeometries()[ig].SetCollisionMesh(self.GenerateTrimeshFromHulls(hulls))

    def getfilename(self,read=False):
        filename = 'convexdecomposition_%.3f.pp'%self._padding
        return RaveFindDatabaseFile(os.path.join('robot.'+self.robot.GetKinematicsGeometryHash(), 'convexdecomposition_%.3f.pp'%self._padding),read)

    def autogenerate(self,options=None):
        if options is not None:
            self.generate(padding=options.padding,skinWidth=options.skinWidth, decompositionDepth=options.decompositionDepth, maxHullVertices=options.maxHullVertices,concavityThresholdPercent=options.concavityThresholdPercent, mergeThresholdPercent=options.mergeThresholdPercent, volumeSplitThresholdPercent=options.volumeSplitThresholdPercent, useInitialIslandGeneration=options.useInitialIslandGeneration, useIslandGeneration=options.useIslandGeneration,convexHullLinks=options.convexHullLinks.split(','))
        else:
            self.generate()
        self.save()
    def generate(self,padding=None,minTriangleConvexHullThresh=None,convexHullLinks=None,**kwargs):
        """
        :param padding: the padding in meters
        :param minTriangleConvexHullThresh: If not None, then describes the minimum number of triangles needed to use convex hull rather than convex decomposition. Although this might seem counter intuitive, the current convex decomposition module cannot handle really complex meshes and it takes a long time if it does handle them.
        :param convexHullLinks: a list of link names to compute convex hulls instead of decomposition
        """
        self.convexparams = kwargs
        if padding is None:
            padding = self._padding
            if padding is None:
                padding = 0.0
        if convexHullLinks is None:
            convexHullLinks = []
        log.info(u'Generating Convex Decomposition: %r',self.convexparams)
        starttime = time.time()
        self.linkgeometry = []
        with self.env:
            links = self.robot.GetLinks()
            for il,link in enumerate(links):
                geomhulls = []
                geometries = link.GetGeometries()
                for ig,geom in enumerate(geometries):
                    if geom.GetType() == KinBody.Link.GeomType.Trimesh or padding > 0:
                        trimesh = geom.GetCollisionMesh()
                        if len(trimesh.indices) == 0:
                            geom.InitCollisionMesh()
                            trimesh = geom.GetCollisionMesh()
                        if link.GetName() in convexHullLinks or (minTriangleConvexHullThresh is not None and len(trimesh.indices) > minTriangleConvexHullThresh):
                            log.info(u'computing hull for link %d/%d geom %d/%d',il,len(links), ig, len(geometries))
                            orghulls = [self.ComputePaddedConvexHullFromTriMesh(trimesh,padding)]
                        else:
                            log.info(u'computing decomposition for link %d/%d geom %d/%d',il,len(links), ig, len(geometries))
                            orghulls = self.ComputePaddedConvexDecompositionFromTriMesh(trimesh,padding)
                        cdhulls = []
                        for hull in orghulls:
                            if any(isnan(hull[0])):
                                raise ConvexDecompositionError(u'geom link %s has NaNs', link.GetName())
                            cdhulls.append((hull[0],hull[1],self.ComputeHullPlanes(hull)))
                        geomhulls.append((ig,cdhulls))
                self.linkgeometry.append(geomhulls)
        self._padding = padding
        log.info(u'all convex decomposition finished in %fs',time.time()-starttime)

    def ComputePaddedConvexDecompositionFromTriMesh(self, trimesh, padding=0.0):
        if len(trimesh.indices) > 0:
            orghulls = convexdecompositionpy.computeConvexDecomposition(trimesh.vertices,trimesh.indices,**self.convexparams)
        else:
            orghulls = []
        if len(orghulls) > 0:
            # add in the padding
            if padding != 0:
                orghulls = [self.PadMesh(hull[0],hull[1],padding) for hull in orghulls]
        return orghulls

    def ComputePaddedConvexHullFromTriMesh(self, trimesh, padding=0.0):
        """computes a padded convex hull from all the links and returns it as a list of trimeshes
        """
        if len(trimesh.indices) > 0:
            if self._graspermodule is None:
                self._graspermodule = RaveCreateModule(self.env,'grasper')
                self.env.AddModule(self._graspermodule,self.robot.GetName())
            cmd = StringIO()
            cmd.write('ConvexHull returnplanes 0 returnfaces 0 returntriangles 1 points %d %d '%(len(trimesh.vertices),3))
            for v in trimesh.vertices:
                cmd.write('%.15e %.15e %.15e '%(v[0],v[1],v[2]))
            res = self._graspermodule.SendCommand(cmd.getvalue()).split()
            if res is None:
                raise ConvexDecompositionError(u'failed to compute convex hull')

            offset = 0
            #numplanes = int(res[offset]); offset += 1
            #planes = reshape(array(res[offset:(offset+4*numplanes)], float64), (numplanes,4))
            #offset += 4*numplanes
            numtriangles = int(res[offset]); offset += 1
            return self.PadMesh(trimesh.vertices,reshape(array(res[offset:(offset+3*numtriangles)],int32),(numtriangles,3)), padding)

    @staticmethod
    def PadMesh(vertices,indices,padding):
        """pads a mesh by increasing towards the normal
        """
        M = mean(vertices,0)
        facenormals = array([cross(vertices[i1]-vertices[i0],vertices[i2]-vertices[i0]) for i0,i1,i2 in indices])
        facenormals *= transpose(tile(1.0/sqrt(sum(facenormals**2,1)),(3,1)))
        # make sure normals are facing outward
        newvertices = zeros((0,3),float64)
        newindices = zeros((0,3),int32)
        originaledges = []
        for i in range(len(facenormals)):
            if dot(vertices[indices[i,0]]-M,facenormals[i]) < 0:
                facenormals[i] *= -1
            offset = len(newvertices)
            newvertices = r_[newvertices,vertices[indices[i,:]]+tile(facenormals[i]*padding,(3,1))]
            newindices = r_[newindices,[[offset,offset+1,offset+2]]]
            for j0,j1 in [[0,1],[0,2],[1,2]]:
                if indices[i,j0] < indices[i,j1]:
                    originaledges.append([indices[i,j0],indices[i,j1],offset+j0,offset+j1])
                else:
                    originaledges.append([indices[i,j1],indices[i,j0],offset+j1,offset+j0])
        # find the connecting edges across the new faces
        originaledges = array(originaledges)
        offset = 0
        verticesofinterest = {}
        for i,edge in enumerate(originaledges):
            inds = flatnonzero(logical_and(edge[0]==originaledges[i+1:,0],edge[1]==originaledges[i+1:,1]))
            if len(inds) > 0:
                # add 2 triangles for the edge, and 2 for each vertex
                cedge = originaledges[i+1+inds[0]]
                if not edge[0] in verticesofinterest:
                    verticesofinterest[edge[0]] = len(newvertices)+offset
                    offset += 1
                if not edge[1] in verticesofinterest:
                    verticesofinterest[edge[1]] = len(newvertices)+offset
                    offset += 1
                newindices = r_[newindices,[[edge[2],edge[3],cedge[3]],[edge[2],cedge[3],cedge[2]],[edge[2],cedge[2],verticesofinterest[edge[0]]],[edge[3],cedge[3],verticesofinterest[edge[1]]]]]
        if offset > 0:
            newvertices = r_[newvertices,zeros((offset,3))]
        # for every vertex, add a point representing the mean of surrounding extruded vertices
        for originalvertex, newvertex in verticesofinterest.iteritems():
            vertexindices = flatnonzero(indices==originalvertex)
            assert(len(vertexindices) > 0)
            newvertices[newvertex,:] = mean(newvertices[vertexindices],0)
        assert(not any(isnan(newvertices)))
        # make sure all faces are facing outward
        for inds in newindices:
            if dot(cross(newvertices[inds[1]]-newvertices[inds[0]],newvertices[inds[2]]-newvertices[inds[0]]),newvertices[inds[0]]-M) < 0:
                inds[1],inds[2] = inds[2],inds[1]
        return newvertices,newindices

    @staticmethod
    def ComputeHullPlanes(hull,thresh=0.99999):
        """computes the planes of a hull

        The computed planes point outside of the mesh. Therefore a point is inside only if the distance to all planes is negative.
        """
        vm = mean(hull[0],0)
        v0 = hull[0][hull[1][:,0],:]
        v1 = hull[0][hull[1][:,1],:]-v0
        v2 = hull[0][hull[1][:,2],:]-v0
        normals = cross(v1,v2,1)/sqrt(sum(v1**2)*sum(v2**2)) # need to multiply by lengths because of floating-point precision problems
        planes = c_[normals,-sum(normals*v0,1)]
        meandist = dot(planes[:,0:3],vm)+planes[:,3]
        planes = r_[planes[flatnonzero(meandist<-1e-7)],-planes[flatnonzero(meandist>1e-7)]]
        if len(planes) == 0:
            return planes
        normalizedplanes = planes/transpose(tile(sqrt(sum(planes**2,1)),(4,1)))
        # prune similar planes
        uniqueplanes = ones(len(planes),bool)
        for i in range(len(normalizedplanes)-1):
            uniqueplanes[i+1:] &= dot(normalizedplanes[i+1:,:],normalizedplanes[i])<thresh
        return planes[uniqueplanes]

    def testPointsInside(self,points):
        """tests if a point is inside the convex mesh of the robot.

        Returns an array the same length as points that specifies whether the point is in or not. This method is not meant to be optimized (use C++ for that).
        """
        with self.env:
            inside = zeros(len(points),bool)
            leftinds = arange(len(points))
            leftpoints = points[:]
            for ilink,link in enumerate(self.robot.GetLinks()):
                if len(leftinds) == 0:
                    break
                for ig,geom in enumerate(link.GetGeometries()):
                    T = dot(link.GetTransform(),geom.GetTransform())
                    localpoints = transformInversePoints(T,leftpoints)
                    cdhulls = [cdhull for ig2,cdhull in self.linkgeometry[ilink] if ig2==ig]
                    if len(cdhulls) > 0:
                        for ihull,hull in enumerate(cdhulls[0]):
                            insideinds = numpy.all(dot(localpoints,transpose(hull[2][:,0:3]))+tile(hull[2][:,3],(len(localpoints),1))<=0,1)
                            inside[leftinds[flatnonzero(insideinds)]] = True
                            outsideinds = flatnonzero(insideinds==0)
                            if len(outsideinds) > 0:
                                leftpoints = leftpoints[outsideinds]
                                leftinds = leftinds[outsideinds]
                                localpoints = localpoints[outsideinds]
                            if len(leftinds) == 0:
                                break
                        continue
                    elif geom.GetType() == KinBody.Link.GeomType.Box:
                        insideinds = numpy.all(numpy.less_equal(abs(localpoints), geom.GetBoxExtents()) ,1)
                    elif geom.GetType() == KinBody.Link.GeomType.Sphere:
                        insideinds = numpy.less_equal(sum(localpoints**2,1), geom.GetSphereRadius()**2)
                    elif geom.GetType() == KinBody.Link.GeomType.Cylinder:
                        insideinds = numpy.less_equal(abs(localpoints[:,1]), 0.5*geom.GetCylinderHeight()) and numpy.less_equal(localpoint[:,0]**2+localpoint[:2]**2, geom.GetCylinderRadius()**2)
                    else:
                        continue
                    inside[leftinds[flatnonzero(insideinds)]] = True
                    outsideinds = flatnonzero(insideinds==0)
                    if len(outsideinds) > 0:
                        leftpoints = leftpoints[outsideinds]
                        leftinds = leftinds[outsideinds]
                    if len(leftinds) == 0:
                        break
        return inside

    def GetGeometryInfosFromLink(self,ilink,preservetransform=False):
        """gets a list of geometries for the link
        :param preservetransform: if True, will set the same geometry transform as the original geometry. Otherwise will pre-multiply with the new trimesh.
        """
        with self.env:
            geometryinfos = []
            geometries = self.robot.GetLinks()[ilink].GetGeometries()
            for ig,hulls in self.linkgeometry[ilink]:
                ginfo = KinBody.GeometryInfo()
                ginfo._vDiffuseColor = [0,0,0.4]
                ginfo._type = GeometryType.Trimesh
                ginfo._meshcollision = TriMesh()
                if preservetransform:
                    ginfo._t = geometries[ig].GetTransform()
                else:
                    ginfo._t = eye(4)
                numvertices = 0
                numindices = 0
                for hull in hulls:
                    numvertices += len(hull[0])
                    numindices += len(hull[1])
                ginfo._meshcollision.vertices = zeros((numvertices,3),float64)
                ginfo._meshcollision.indices = zeros((numindices,3),int)
                voffset = 0
                ioffset = 0
                for hull in hulls:
                    if preservetransform:
                        ginfo._meshcollision.vertices[voffset:(voffset+len(hull[0])),:] = hull[0]
                    else:
                        ginfo._meshcollision.vertices[voffset:(voffset+len(hull[0])),:] = transformPoints(geometries[ig].GetTransform(),hull[0])
                    ginfo._meshcollision.indices[ioffset:(ioffset+len(hull[1])),:] = hull[1]+voffset
                    voffset += len(hull[0])
                    ioffset += len(hull[1])
                geometryinfos.append(ginfo)
            return geometryinfos

    @staticmethod
    def GenerateTrimeshFromHulls(hulls):
        allvertices = zeros((0,3),float64)
        allindices = zeros((0,3),int)
        for hull in hulls:
            allindices = r_[allindices,hull[1]+len(allvertices)]
            allvertices = r_[allvertices,hull[0]]
        return TriMesh(allvertices,allindices)

    @staticmethod
    def transformHull(T,hull):
        """hull can be (vertices,indices) or (vertices,indices,planes)
        """
        vertices = dot(hull[0],transpose(T[0:3,0:3]))+tile(T[0:3,3],(len(hull[0]),1))
        if len(hull) == 2:
            return vertices,hull[1]
        return vertices,hull[1],dot(hull[2],linalg.inv(T))

    def show(self,options=None):
        if self.env.GetViewer() is None:
            self.env.SetViewer('qtcoin')
            time.sleep(0.4) # give time for viewer to initialize
        self.env.UpdatePublishedBodies()
        T = self.env.Triangulate(self.robot)
        log.info('total vertices: %d, total triangles: %d',len(T.vertices),len(T.indices)/3)
        volumecolors = array(((1,0,0,0.5),(0,1,0,0.5),(0,0,1,0.5),(0,1,1,0.5),(1,0,1,0.5),(1,1,0,0.5),(0.5,1,0,0.5),(0.5,0,1,0.5),(0,0.5,1,0.5),(1,0.5,0,0.5),(0,1,0.5,0.5),(1,0,0.5,0.5)))
        handles = []
        try:
            jointvalues = None
            while True:
                newvalues = self.robot.GetDOFValues()
                if jointvalues is not None and all(abs(jointvalues-newvalues)<0.01):
                    time.sleep(0.5)
                    continue
                jointvalues = newvalues
                handles = []
                colorindex = 0
                for ilink,link in enumerate(self.robot.GetLinks()):
                    hulls = []
                    for ig,geom in enumerate(link.GetGeometries()):
                        cdhulls = [cdhull for ig2,cdhull in self.linkgeometry[ilink] if ig2==ig]
                        if len(cdhulls) > 0:
                            hulls += [self.transformHull(geom.GetTransform(),hull) for hull in cdhulls[0]]
                        elif geom.GetType() == KinBody.Link.GeomType.Box:
                            hulls.append(self.transformHull(geom.GetTransform(),ComputeBoxMesh(geom.GetBoxExtents())))
                        elif geom.GetType() == KinBody.Link.GeomType.Sphere:
                            hulls.append(self.transformHull(geom.GetTransform(),ComputeGeodesicSphereMesh(geom.GetSphereRadius(),level=1)))
                        elif geom.GetType() == KinBody.Link.GeomType.Cylinder:
                            hulls.append(self.transformHull(geom.GetTransform(),ComputeCylinderYMesh(radius=geom.GetCylinderRadius(),height=geom.GetCylinderHeight())))
                    handles += [self.env.drawtrimesh(points=transformPoints(link.GetTransform(),hull[0]),indices=hull[1],colors=volumecolors[mod(colorindex+i,len(volumecolors))]) for i,hull in enumerate(hulls)]
                    colorindex+=len(hulls)
            raw_input('Press any key to exit: ')
        finally:
            # close all graphs
            handles = None
    def ShowLink(self,ilink,progressive=False):
        if self.env.GetViewer() is None:
            self.env.SetViewer('qtcoin')
            time.sleep(0.4) # give time for viewer to initialize
        self.env.UpdatePublishedBodies()
        volumecolors = array(((1,0,0,0.5),(0,1,0,0.5),(0,0,1,0.5),(0,1,1,0.5),(1,0,1,0.5),(1,1,0,0.5),(0.5,1,0,0.5),(0.5,0,1,0.5),(0,0.5,1,0.5),(1,0.5,0,0.5),(0,1,0.5,0.5),(1,0,0.5,0.5)))
        link = self.robot.GetLinks()[ilink]
        hulls = []
        for ig,geom in enumerate(link.GetGeometries()):
            cdhulls = [cdhull for ig2,cdhull in self.linkgeometry[ilink] if ig2==ig]
            if len(cdhulls) > 0:
                hulls += [self.transformHull(geom.GetTransform(),hull) for hull in cdhulls[0]]
            elif geom.GetType() == KinBody.Link.GeomType.Box:
                hulls.append(self.transformHull(geom.GetTransform(),ComputeBoxMesh(geom.GetBoxExtents())))
            elif geom.GetType() == KinBody.Link.GeomType.Sphere:
                hulls.append(self.transformHull(geom.GetTransform(),ComputeGeodesicSphereMesh(geom.GetSphereRadius(),level=1)))
            elif geom.GetType() == KinBody.Link.GeomType.Cylinder:
                hulls.append(self.transformHull(geom.GetTransform(),ComputeCylinderYMesh(radius=geom.GetCylinderRadius(),height=geom.GetCylinderHeight())))
        try:
            if not progressive:
                handles = [self.env.drawtrimesh(points=transformPoints(link.GetTransform(),hull[0]),indices=hull[1],colors=volumecolors[mod(i,len(volumecolors))]) for i,hull in enumerate(hulls)]
                raw_input('Press any key to exit: ')
            else:
                ihull = 0
                while ihull < len(hulls):
                    hull = hulls[ihull]
                    handles = [self.env.drawtrimesh(points=transformPoints(link.GetTransform(),hull[0]),indices=hull[1],colors=volumecolors[mod(ihull,len(volumecolors))])]
                    cmd = raw_input(str(ihull))
                    if cmd == 'p':
                        ihull -= 1
                    else:
                        ihull += 1
        finally:
            handles = None

    @staticmethod
    def CreateOptionParser():
        parser = DatabaseGenerator.CreateOptionParser(useManipulator=False)
        parser.description='Computes the set of convex hulls for each triangle mesh geometry.using convexdecomposition'
        parser.usage='openrave.py --database convexdecomposition [options]'
        parser.add_option('--skinWidth',action='store',type='float',dest='skinWidth',default=0.0,
                          help='Skin width on the convex hulls generated, convex decomposition side (default=%default)')
        parser.add_option('--padding',action='store',type='float',dest='padding',default=0.005,
                          help='The distance to move the hull planes along their respective normals (default=%default)')
        parser.add_option('--decompositionDepth',action='store',type='int',dest='decompositionDepth',default=8,
                          help='recursion depth for convex decomposition (default=%default)')
        parser.add_option('--maxHullVertices',action='store',type='int',dest='maxHullVertices',default=64,
                          help='maximum number of vertices in output convex hulls (default=%default)')
        parser.add_option('--concavityThresholdPercent',action='store',type='float',dest='concavityThresholdPercent',default=5.0,
                          help='The percentage of concavity allowed without causing a split to occur (default=%default).')
        parser.add_option('--mergeThresholdPercent',action='store',type='float',dest='mergeThresholdPercent',default=30.0,
                          help='The percentage of volume difference allowed to merge two convex hulls (default=%default).')
        parser.add_option('--volumeSplitThresholdPercent',action='store',type='float',dest='volumeSplitThresholdPercent',default=5.0,
                          help='The percentage of the total volume of the object above which splits will still occur (default=%default).')
        parser.add_option('--useInitialIslandGeneration',action='store',type='int',dest='useInitialIslandGeneration',default=1,
                          help='whether or not to perform initial island generation on the input mesh (default=%default).')
        parser.add_option('--useIslandGeneration',action='store',type='int',dest='useIslandGeneration',default=0,
                          help='Whether or not to perform island generation at each split.  Currently disabled due to bug in RemoveTjunctions (default=%default).')
        parser.add_option('--convexHullLinks',action='store',type='str',dest='convexHullLinks',default='',
                          help='comma separated list of link names to compute convex hull for instead')
        return parser
    @staticmethod
    def RunFromParser(Model=None,parser=None,args=None,**kwargs):
        """Executes the ConvexDecompositionModel database generation
        """
        if parser is None:
            parser = ConvexDecompositionModel.CreateOptionParser()
        (options, leftargs) = parser.parse_args(args=args)
        env = Environment()
        try:
            if Model is None:
                Model = lambda robot: ConvexDecompositionModel(robot=robot,padding=options.padding)
            DatabaseGenerator.RunFromParser(env=env,Model=Model,parser=parser,allowkinbody=True,args=args,**kwargs)
        finally:
            env.Destroy()
            RaveDestroy()

def run(*args,**kwargs):
    """Command-line execution of the example. ``args`` specifies a list of the arguments to the script.
    """
    ConvexDecompositionModel.RunFromParser(*args,**kwargs)


BROWNS COW serves delicious Bassetts Ice Cream, a premium ice cream brand in the Philadelphia area since 1861.
Visit us, one block off Bridge Street, at 30 South Main in Phoenixville, for a cool sweet treat that will delight your senses. Flavors subject to change throughout the seasons.
BROWNS COW is the proud recipient of one of the 2012 Best of Philly awards!


text:
Declaration Tour! Preservation Series Review! Plus a Giveaway!
Preservation (Preservation #1) by Rachael Wade
Genre: New Adult (Contemporary Romance)
Publisher: Rabbit Hole Press
Fear is sabotage's sweetest weapon.
Kate has no time for meaningless romantic charades, and definitely no time for hot college professors who are full of themselves and smitten with her. Constantly battling eviction notices, tuition she can't afford, and a sick, dependent mother, the last thing she needs is to be distracted with someone else's complicated baggage.
When she stumbles into Ryan Campbell's creative writing class, he is only "Mr. Campbell" to her, until Ryan finds himself captivated by her writing and she is forced to face their mutual attraction. His cocky know-it-all syndrome is enough to send her running in the other direction, and his posse of female admirers and playboy reputation are enough to squander any odds in her favor.
But underneath Ryan's abrasive facade is something to behold, and she can't stay away for long. Ryan and Kate must decide who they're willing to become and fight against their former selves if they want to make things work. That's if academia, vicious vixens, old skeletons, and their own mastery at self-destruction don't pummel their efforts first.
Preservation is the first book in the Preservation series by Rachael Wade. Kate and Ryan are hiding behind some pretty major baggage, and they use it to keep themselves from getting close to anyone. The title, Preservation, is perfect because that's what this is about. Self Preservation. It makes them act out in crazy and ridiculous ways, but I think that makes it more believable. When it all boils down, they want love, which I think is why they are both so quick to fall for each other after pushing other people away for so long. I think they recognize that kindred spirit in one another. Even with the quick attraction, they are just as quick to push each other away. It becomes a vicious cycle. That's what people do though. They lash out when they're hurt and afraid. They both made me so angry at times. Ryan does something especially vicious, and I would like to know why. If I were Kate I would have needed more of an explanation or I don't know.. something, but we didn't really get one. She forgave him pretty easily. That was probably the only major issue I had. Dean and Carter were amazing supporting characters. I could hang out with these guys. It's easy to see why Kate loves them so much. I really can't see how she never fell for one of them.
Preservation by Rachael Wade was kindly provided to me by the Xpresso Book Tours for review. The opinions are my own.
Reservation (Preservation #2) by Rachael Wade
Ryan Campbell is not only leaving his title of Professor behind to move on to bigger and better things at Simon and Warden Publishing, he's also become Seattle's rising literary star. Sitting on the overwhelming cusp of newfound fame, he learns soon enough that being popular has its downside.
Attracted to the buzz surrounding his new career, former lovers begin to creep back into his life, and potential ones emerge with enticing advances. While he works to juggle reserved, yet stressful, wedding plans with Kate and his new public image, he has enough to manage without worrying about Carter and Dean—Kate's loveable albeit eccentric friends—and their latest shenanigans.
Surrounded by a lifestyle that includes temptation at every turn, Ryan finds himself immersed in a world full of scandal and lies, where his oldest weaknesses thrive and his ghosts return to haunt him. Questioning whether his life with Kate is his best path, he must discover if he's still capable of being the man he aspired to be when she first became his, or if happily ever after is only an illusion.
Reservation is the second book in the Preservation series by Rachael Wade. Reservation is told from Ryan's point of view while Kate is in St. Lucia. Ryan's world is changing completely. He's gone from college professor to famous author almost overnight, and quite honestly he's not handling it well. He makes bad decisions and has no sense. He made me so mad so many times during this book it was pure craziness. Would a real person really be this ridiculous? I don't know. I sure hope not. On the up side, I think he learned some pretty good lessons.
Reservation by Rachael Wade was kindly provided to me by the Xpresso Book Tours for review. The opinions are my own.
Declaration (Preservation #3) by Rachael Wade
Date Published: October 7, 2013
Featuring characters from Love and Relativity.
Carter Montgomery spent most of his life blending in, and he liked it that way. It was always better to be seen, not heard. And while a theatric streak and friendly demeanor might have fooled most people, he knew the truth—he was the shy one. The quiet kid most people forgot about. Some might have considered that a bad thing, but those people all wanted to be in the spotlight.
The only place Carter didn't mind attention was on stage, with The Hellions. Once content in his comfort zone in Seattle, Washington, he only knew three things: confrontation was to be avoided, keeping the peace was priority, and the moment he lost Kate Parker to Professor Ryan Campbell, he had no clue what to do with his life. Playing gigs, working at Pike Place Market, and watching BBC after the love of his life sailed off into the sunset just wasn't going to cut it anymore.
Desperate to escape his rut, he takes a cue from Kate and chooses a random place to relocate—a small island across the country, where no one knows his name and memories of unrequited love aren't found at every turn. Just when he thinks he's found the perfect place to unwind and sink back into the shadows, in bursts Whitney Sinclair, a saucy firecracker who loves life and refuses to settle for second best. Full of contagious energy, she dares him to be brave, convincing him that it might finally be time to tell the world what he wants.
It might be time to make a declaration.
Declaration is the third book in the Preservation series by Rachael Wade. In Declaration, we finally get Carter's point of view. I'm completely Team Carter by the way. He has character and personality. He's irresistibly unique. I don't know what Kate was thinking. She was pretty selfish in her expectations of him, so I'm glad he finally put his needs in front of hers for once. Anyway, Carter has moved off to Florida to start over. He meets Whitney. She's spunky, and fun, and seemingly care free. They seem to be just what the other needs, but of course it's not an easy road. I loved getting to know Carter. I knew he was my favorite character in this series, this book just cemented that for me. This was my favorite book in the series, and I especially liked the Epilogue!
Declaration by Rachael Wade was kindly provided to me by the Xpresso Book Tours for review. The opinions are my own.
Rachael Wade writes edgy New Adult and Adult romance and science fiction. She is the author of the Amazon bestselling PRESERVATION SERIES, THE REPLACEMENT, and LOVE AND RELATIVITY, as well as the paranormal romance series THE RESISTANCE TRILOGY. When she's not writing, she's busy going to concerts, watching too many movies, and learning how to protect animals and the environment. She's an avid Brandi Carlile fan and loves all things Tim Burton. Also visit her at Lights ON Outreach or come chat with her on Twitter @RachaelWade.
To learn more about Rachael Wade and her books, visit her website.You can also find her on Goodreads, Facebook, and Twitter.
Open to US and Canada:
--a Declaration guitar pick necklace, and an e-book copy of Declaration
By What's Beyond Forks? at March 27, 2014
Labels: Adult Fiction , Adult Fiction - Romance , Blog Tours , Book Review , Book Tours , Contemporary Romance , Declaration , Preservation , Rachael Wade , Reservation
Thanks for the awesome giveaway!!
Giselle March 27, 2014 at 9:27 AM
I love series like this where every books is a new POV and you really get to know each character to the core. Glad you liked the series, it sounds right up my alley!
www.RachaelWade.com April 1, 2014 at 7:52 PM
Thanks so much for reviewing the series! I'm glad you enjoyed it and I appreciate you being a part of the tour. :)


text:
Elizabeth Gilbert is the number one bestselling author of Eat Pray Love, which has sold over 15 million copies worldwide and been translated into over 46 languages, and several other international bestselling books of fiction and non-fiction. Her story collection Pilgrims was a finalist for the PEN/Hemingway award; The Last American Man was a finalist for both the National Book Award and the National Book Critics Circle Award. Her follow-up memoir to Eat Pray Love, Committed, became an instant...See more
Elizabeth Gilbert is the number one bestselling author of Eat Pray Love, which has sold over 15 million copies worldwide and been translated into over 46 languages, and several other international bestselling books of fiction and non-fiction. Her story collection Pilgrims was a finalist for the PEN/Hemingway award; The Last American Man was a finalist for both the National Book Award and the National Book Critics Circle Award. Her follow-up memoir to Eat Pray Love, Committed, became an instant number one New York Times bestseller. She has published two novels, Stern Men and The Signature of All Things, which was longlisted for the Baileys Women's Prize for Fiction and shortlisted for the Wellcome Book Prize. She lives in New Jersey. ... / @GilbertLiz See less
Elizabeth Gilbert book subjects
Biography & Autobiography > Personal Memoirs
Biography & Autobiography > Women
Fiction > Literary
Gilbert, Elizabeth
Elizabeth Gilbert's Featured Books
City of Girls
Big Magic: Creative Living...
Eat Pray Love 10th...
The Last American Man
Committed: A Love Story
Eat Pray Love: One Woman's...
Committed: A Skeptic Makes...
Stern Men
Come, Reza, AMA / Eat, Pray,...
Libera Tu Magia / Big Magic
Bess the Barn Stands Strong
Eat, Pray, Love: Film Tie-In...
Ciudad de Mujeres / City of...
City of Girls: The Sunday...
Eat, Pray, Love: One Woman's...
Eat Pray Love Made Me Do it:...
La Firma de Todas las Cosas
Big Magic: How to Live a...
Arthur Wants a Balloon
Elizabeth Gilbert book reviews
by Barry A, Mar 4, 2016
Every now and then one comes across a book like this or a movie like this ("Into the Wild") whose message is that we need to get back to nature or to go rogue or to do something out of the realm of ... Read More
A bit off track
by Holly H, Aug 14, 2014
If you loved Eat, Pray, Love then you'll probably like this book. The author strays off topic throughout the book giving a history of marriage instead of telling her own story, which would make for ... Read More
by Pat, Jan 12, 2012
The chapter on marriage was fascinating. However, compared to the author's earlier book, "Eat, Pray, Love", it lacks the compelling drama and wording that riveted your attention to every page and ... Read More
by Kathryn Stockett
by Stieg Larsson
Noticia de Un Secuestro