text:
Peter Obi Appoints Strategic Communication Expert, Charles Okigbo As Campaign Spokesman
The Presidential Candidate of the Labour Party (LP), Mr. Peter Obi has appointed World Celebrated Professor of Strategic Communication, Charles Okigbo, as Campaign Spokesman
Charles Okigbo is Professor Emeritus of Strategic Communication at North Dakota State University (USA), where he conducts research on media coverage of elections, strategic fundraising in higher education, and the processes for leadership development and social change.
He had been Registrar of the APCON, Vice President of ORBICOM, The UNESCO Think Tank at the University of Quebec, Montréal, Canada, and the Executive Coordinator of the African Council for Communication Education
(ACCE) at the University of Nairobi, Kenya.
Dr. Okigbo had taught fulltime or part time at the University of Nigeria, University of Lagos, Daystar University, Nairobi, and the University of Nairobi. He has been consultant and temporary adviser to UNAIDS, UNICEF, UNESCO, WHO, Ford Foundation, and Friedrich
Ebert Stiftung.
He is passionate about providing Executive Edu opportunities in ads & strategic com in Africa, the US, & other parts of the world. Okigbo has published seven books on advertising and public relations,
dev com, strategic health communication, public affairs reporting, and market.
Prof. Charles C. Okigbo is passionate about teaching strategic communication, advertising, public relations, and mixed-methods social research to undergraduate and graduate students, as well as professionals in communication, education, nonprofit organizations, and government service.
Controversy As Ebonyi APC Expels Umahi's Senatorial Ticket Rival
Presidential Ticket: Wike Denies Dragging Atiku, Tambuwal, Others to Court


text:
Dallas woman to enter guilty plea murder-for-hire charge in husband's killing
What would be in a fourth special legislative session? Republican Party of Texas Chair explains
There are growing calls for Governor Abbott to call a fourth special legislative session. Republicans say there's unfinished business that needs to be addressed.
Author: Berna Dean Steptoe
Published: 9:46 AM CST December 5, 2021
Updated: 9:46 AM CST December 5, 2021
DALLAS — This week on Inside Texas Politics:
Colin Allred speaks about Taiwan trip
Inside Texas Politics starts with one of Texas' biggest trading partners - the island of Taiwan. It is 7,700 miles across the Pacific, but Texas companies do $7 billion a year in business with them. However, the Chinese consider Taiwan a breakaway territory. And many worry that a war could be coming. During the Thanksgiving holiday, a bipartisan group from Congress boarded a plane and flew to Taiwan. U.S. Representative Colin Allred was among them. He is a Dallas Democrat.
5th Circuit Court of Appeals decisions
Ross Ramsey, the co-founder and executive editor of the Texas Tribune in Austin, joins Jason Whitely to talk about news across the state of Texas.
The 5th Circuit Court of Appeals made two significant decisions affecting Texas. Both are temporary ones. The first is the Court of Appeals telling school districts that they cannot require students to wear face masks. And in Austin, a federal judge blocked a new Texas law from going into effect. This is the one that forbids social media companies from kicking users off their platforms for their viewpoints. These decisions were good news and bad news for Texas Republicans. Governor Abbott especially. But are they the final decisions?
And President Biden just got Mexico to agree to restart President Trump's remain in Mexico program. Biden wanted to end it altogether. A court said no. How long will this last?
Will there be a fourth special session?
Jason Whitely talks with The Republican Party of Texas Chair Matt Rinaldi about a possible fourth special legislative session.
There are growing calls this weekend for Governor Abbott to call a fourth special legislative session. Republicans say there's unfinished business that needs to be addressed. Specifically, conservatives want to make it illegal for businesses to require workers to get vaccinated. Matt Rinaldi, chairman of the Republican Party of Texas, is also behind this effort.
As goes Texas...
For most of the last 20-years, the politics of Texas created an ideal place for businesses to grow. It was often referred to as the Texas Miracle. But Texas politics are no longer as moderate as they once were. So, does that put this state's explosive growth in jeopardy?
That is a question that UT Austin is studying. And it's also the focus of the latest episode of our Y'all-itics political podcast with Steven Pedigo - the director of the LBJ Urban Lab. Look for Y'all-itics wherever you get your podcasts.
RELATED: The 'Texas Triangle' would rank as the world's 15th largest economy, producing $1.2B in economic output. Could politics possibly undermine this clout?
Reporter Roundtable discusses SCOTUS abortion law and Omicron variant
The Texas Tribune's Ross Ramsey and Bud Kennedy with the Fort Worth Star-Telegram are joined by Berna Dean Steptoe, WFAA's political producer.
Last week, a new Mississippi law that banned abortions after 15-weeks was argued before the Supreme Court. Justices seemed poised to overturn Roe versus Wade. How does that impact the 2022 midterm election? Does it motivate Democrats? Or depress them?
The Omicron variant is spreading in the United States. There's a lot of confusion about booster shots. Are the state and counties doing enough to get the word out? What do we expect from Governor Abbott for this variant? Is this just a new variant of COVID-19, or does it signal another surge in cases?
Inside Texas Politics hands out annual 'Turkey awards'
Beto is running for governor, but after party swaps and retirements, what does 2022 look like for Texas Democrats?
GOP ramps up effort to woo Texas minorities

redpajama_set_name: RedPajamaCommonCrawl


Our client, a Global Fintech, are looking for a Fullstack Automation Tester to work on a bespoke Financial Services Platform within their Asset Management function. The ideal candidate will be working on both the UI and the API side of the platform as well as migrating the existing Winforms and automating further key areas across the project. The team have recently automated their IT Function and the successful candidate will have the chance to come into a cutting edge environment and hit the ground running. As a Test Automation Engineer, you will be regularly liaising with the business, development teams and all offshore teams as well as presenting your own ideas to help the project run smoothly.


text:
Man Utd considering Moyes sacking
The club have been looking at potential candidates for several weeks as part of wide-ranging discussions aimed at turning around their recent travails on the pitch
By Duncan Castles
Manchester United's senior hierarchy is "evaluating all possibilities" as it attempts to arrest the club's steep descent under David Moyes. Contrary to public statements that Sir Alex Ferguson's successor will definitely be granted at least a second season as manager, Moyes' dismissal is prominent among those possibilities.
Though Tuesday's humiliating 3-0 home loss to Manchester City ensured that United's first post-Ferguson season is statistically the club's worst in the Premier League era, the review of potential candidates to replace Moyes should not be regarded as a knee-jerk reaction.
Key decision-makers within the Old Trafford board have been assessing potential replacements as manager for several weeks and further talks are planned.
Having already sanctioned a spend of over €70 million on two headline transfers, handed Wayne Rooney a club-record contract renewal, and approved an unprecedented recruitment spend for this summer, the Glazer family is said to be concerned that the Scot will continue to damage the value of their asset.
Recruited on the recommendation of Ferguson, Moyes was not the majority shareholders' preferred choice for their first managerial appointment as owners of the club.
The award of a six-year contract was essentially a PR play, with Moyes' contractual terms including a break clause that enables the Americans to sack him at far less than the full salary costs of that term.
Promoted to chief executive officer in the same summer that Moyes was appointed, Ed Woodward is also conscious that his effectiveness in the new post has been assessed in the context of results delivered by another man's choice as manager.
In addition to overseeing a series of performances that saw the Premier League champions' title defence effectively end in January, Moyes' managerial decisions have fomented grave internal dissent within United's coaching, scouting and recruitment staff. A strategy of attributing under-performance to the allegedly severely sub-standard squad he inherited from Ferguson has proved particularly divisive.
Key players are said to "have had enough of the way Moyes is destroying their reputation" with his repeated assertions that a squad that won the Premier League by 11 points last season required a radical rebuild to have any chance of retaining the title. On the contrary, they believe the Scot's errant tactics and man management have caused the team's decline.
Senior players talk of Moyes' failure to understand the essence of Manchester United, and the confusions produced by his management following years of crystal-clear leadership under Ferguson.
Characteristic of such problems was Moyes instructing the team to employ a 4-3-3 formation against City at Old Trafford after preparing to play a 4-4-2 in pre-derby training sessions.
Moyes' decision to bring Rooney on board with his tenure by reinstalling a player who had repeatedly placed his own interests above those of the club as the team's most important figure has also angered and perplexed.
The level of discontent with Moyes among United's squad is such that there is now discussion about making a direct request to the board that he be replaced.


text:
Home > Iran Blog > Iran Tourism News > Five billion was spent to organize the Anubani inscription of Ney Sarpol-e Zahab Login / Register
Five billion was spent to organize the Anubani inscription of Ney Sarpol-e Zahab
Jabbar Gohari, head of the General Directorate of Cultural Heritage, Tourism and Handicrafts of Kermanshah province, added: "Most of these credits have been spent on providing office equipment, documenting the prominent role of Anubani Ney and destroying the school janitor."
He added: with the acquisition of the school building next to the Anubani Ney inscription by the Education Department of Cultural Heritage, Tourism and Handicrafts of Sarpol-e-Zahab, by equipping and renovating this building, the city administration and the Sassanid base office of the province Kermanshah was established there.
Gohari, referring to the importance of setting up a Sassanid base office in Kermanshah province in Sarpol-e Zahab city, stated: This city is one of the richest cities in Kermanshah province and even in the west of the country in terms of the number of historical monuments.
He stated: The establishment of a base office in the city will definitely help to improve the protection and restoration of the city's historical monuments.
In the end, referring to the importance of world registration of the Sassanid axis of Kermanshah – Qasr Shirin, the head of the General Directorate of Cultural Heritage, Tourism and Handicrafts of Kermanshah province said: The base should do its best to organize the historical monuments in the axis and complete the required data and studies. Is to see its global record in the coming years.
Anubani reed bas-relief dating back to 4,800 years
The inscription and relief of Anubani Ney, which is 4,800 years old, is located in the heart of Miankel Sarpol-e Zahab mountain in the west of Kermanshah. The four-thousand-year-old lithograph of Anubani Ney, which was located inside the schoolyard and was not accessible to tourists, has been removed from the school by changing its use.
Director General of the Office of World and National Databases said: Kermanshah-Qasr Shirin Sassanid axis is one of the most important historical complexes in the country and a wide range of significant works are located in this axis, which is of special historical and cultural importance.
Farhad Azizi added: "This base started its work a few years ago and now its office has been officially opened in the historical inscription site of Anubani Ney, one of the oldest reliefs in the Middle East in the city of Sarpol-e Zahab."
He continued: "Considering the importance of the Sassanid axis of Kermanshah – Qasr Shirin and the inclusion of this axis in the list of temporary global registration list, it is important to equip and expand the activities of the base to complete the file data."
Referring to the extensive role of cultural heritage sites in cultural development relations, Azizi said: "The site can organize all cultural events in the region."
He added: the location of the base office in the city of Sarpol-e Zahab can be a pilot for the cultural development of the city.
The Director General of the Office of World and National Databases stated: The construction of a handicraft market near the base and the development of cultural programs in accordance with the function of the base can give it a pivotal role.
He continued: "Using the capacity of non-governmental organizations to promote cultural work with a focus on the base for the cultural development of the region is very helpful."
In conclusion, Azizi stressed the need for local and provincial agencies to support the base's programs: "Cultural work must be practiced and continued in order to achieve results."
Leave a Comment on Five billion was spent to organize the Anubani inscription of Ney Sarpol-e Zahab
Souvenir of Sanandaj to the sweetness of honey and the beauty of the mountains
Isfahan Fire Station; Symbol of Persian culture in ancient times
Get acquainted with some of the most famous amusement parks in Istanbul


Our packaging comes from a company that is Sustainable Forestry Initiative® (SFI) certified and makes managed forestry a priority.
Our compact packaging contains 40% recycled content and water-based ink.
Together these features reduce waste and preserve resources.
Our boxes are "rightsized" for our products to optimize transportation, making them lighter and more space-efficient.
Since we also consume less energy when shipping products to our customers, we are further reducing the carbon footprint.
We help our customers reduce their carbon footprint.
The Slip-N-Grip Brand and Petoskey Plastics are committed to sustainable materials management. Our commitment to a sustainable environment includes: helping to create sustainable products, primarily using recycled plastic as the feedstock, reducing petrochemical usage, reducing energy use and reducing the carbon footprint (greenhouse gas emissions). The Environmental Protection Agency (EPA) and the Department of Energy (DOE) foster environmental innovations that are consistent with Petoskey Plastics and the Slip-N-Grip brand commitment.
Petoskey Plastics purchases land-filled bound used plastics. We provide information on the pounds collected, returned and recycled.
Comparison is then created between products made with recycled content vs. prime materials. With the help of our third party consultants, we can provide a direct correlation to the offsets and omission savings.
70% Post-Consumer recycled content at no additional cost.
The Greencore® product line, where we supply both institutional and industrial can liners, are made with our 3-ply construction for added strength and durability.
Read more about our recycling efforts!


In 1979, Richard Rediker, a high school chemistry teacher, was looking for a better way to track classroom attendance. Rediker wrote his own software program to track this without having to rely on paper and pencil. Today, this idea has blossomed into a comprehensive student information system and Rediker Software serves schools in all 50 states in The US and in 115 countries world-wide. Rediker has over 100,000 teachers using the TeacherPlus Web Gradebook with 2 million end users and they processed 75,000 admission forms last year. This growth is backed by a top-class customer support team with an industry high CSAT rating of 92%.
When Rediker Software launched its services, they relied on a shared inbox to field customer queries coming in via email. As Rediker's customer base grew, they realized that a shared inbox was not scalable. John Daigle, Head of Technical Support Operations, was tasked to look for a viable solution. John, a customer support veteran with experience at StubHub and Apple, knew that Rediker needed a customer support platform that is simple to set up and highly scalable to match the company's growth.
While the support team at Rediker was resolving customer queries with a record satisfaction rating, John discovered that they were reacting to issues and not solving the root causes. Any proactive efforts to solve recurrent issues lacked sufficient evidence to convince the development team and management to make upstream changes.
"Due to the usual issues with agent tagging in a support team, we only had five reliable tags to categorize customer calls. Agents spend their time helping customers and often forget to tag tickets or opt for the easiest ones. Even when agents do tag tickets, they often don't tag in a repeatable or consistent way and with too few predefined tags, customer cases will not be accurately represented." This left Rediker with very little actionable information coming back from support on what issues were commonly popping up and how to solve them. Rediker needed a solution that could analyse customer conversations at scale and provide real, actionable data based on what their customers tell them.
Rediker ended their search with Cx MOMENTS, a multi-award winning solution and a partner on the Freshdesk Marketplace. Cx MOMENTS applies Natural Language Processing and Machine Learning techniques to detect and trends, topics in support activity, find customer issues, reasons to contact, bugs and product mentions. In 3 clicks and without a single line of code, Cx MOMENTS groups customer queries into buckets or categories that are relevant to the business and industry.
"After using Cx MOMENTS to categorize our Freshdesk tickets and map it against customer satisfaction, we discovered the discontent our mobile apps created amongst our customers." This was a huge area for customer frustration with satisfaction scores around 33% but was hard to see previously without correctly tagged tickets to provide a strong overview of why your customers are calling.
With the Freshdesk platform as a powerful base to run customer support operations, Cx MOMENTS provides metrics and evidence that allow Rediker to resolve bottlenecks and bugs in their product. This allowed the support team to start the conversation with the development team by sharing real customer feedback and providing hard data points.
"Our development team took what we provided and used it to make course corrections in their product development roadmap." These updates were then monitored in Freshdesk using Cx MOMENTS to measure the improvement in customer satisfaction and the volume of tickets coming in.
Freshworks and Cx MOMENTS working together gave Rediker's tech support a seat at the decision-making table. Regular collaboration between John's team in Tech Support and Product Development is the new normal with a full-time engineer working on feedback powered by Freshdesk and Cx MOMENTS.
Freshdesk made a significant difference to the team at Rediker. The employees took to Freshdesk's intuitive UI and embraced a better way of working. The new customer support platform made employees more efficient in responding to customer queries with clear ownership, SLAs and streamlined processes.
Rediker uses Freshdesk's automation capabilities to streamline daily support tasks. The community forums make it easier for Rediker to broadcast information and create a platform for users to ask questions, seek help and share tips and tricks to get more out of the software.


Displaying 1–10 of 197 matches.
Anonymous, Leadership, Vol. 3, no. 4.
Bruce W. Thielemann, "Telltale Tears," Preaching Today, Tape 40.
Adapted from P. T. Forsyth, "The Grace of the Gospel." Leadership, Vol. 4, no. 3.
C.S. Lewis in The Problem of Pain. Christianity Today, Vol. 32, no. 15.
Unknown, Leadership, Vol. 1, no. 2.
Richard Halverson, "The Question Facing Us," Preaching Today, Tape 46.
Steve Blankenship, Edmond, Oklahoma. Leadership, Vol. 6, no. 1.
Psychology Today, 10/88; Gallup Poll, reported on "The Osgood File," WBBM Radio, 4/2/91. "To Verify," Leadership.
Dag Hammerskjold in Markings. Christianity Today, Vol. 35, no. 2.
William V. Shannon in the Tampa Tribune-Times (May 8, 1988). Christianity Today, Vol. 32, no. 12.


text:
Middle East politics, culture and satire.
Three dictators walk into a bar
World Agrees Hypocrisy Is Our Only Hope
In an unprecedented realisation that represents global consensus such as we have never seen before, the entire world has awoken to the same epiphany today: hypocrisy is our only hope. A week to the day since the attacks on Charlie Hebdo's office in Paris, and after an intense week of debate and argument, reality has sunk in for all Homo sapiens: we cannot ever hope of living up to any shared principles and we must embrace hypocrisy as our only hope of achieving global harmony.
The historic epiphany was experienced first in New Zealand as people started to wake up on the morning of January 14, and made its way across the time zones as people from Australia to Greece were having their morning coffee. In the words of a generic Christian from Sydney: 'I woke up with a crushing sense of despair, I am tired from all the arguments and the bickering, then with the first sip of coffee I had this almost magical epiphany, if we were all equally hypocritical everything would be fine.'
The day before a generic Muslim had argued that since Jews are protected in European countries from being offended, then Muslims should be granted the same right. A generic Hindu felt outraged that such protections are always granted to monotheists but nobody cares about the feelings of polytheists. A generic Buddhist expressed similar opinions. A generic Jew agreed with all of them, saying he or she didn't want special treatment. A generic liberal was more than happy to go along, and apologised for any offences that other liberals might have caused.
It is thought that this sequence of events triggered something in the collective human psyche that night, as it became apparent that rather than fighting hypocrisy the answer is to simply embrace it and make it the universal norm. A still-sleepy Ban Ki-moon, the Secretary General of the United Nations said: 'I am happy we can all finally agree on something. The United Nations is the model for this type of thinking. I am going back to sleep now but tomorrow we will outline a new proposal to embrace this surprising turnaround in the human condition.'
A renowned generic Western postmodern philosopher was quick to embrace this new reality, laying in broad brushstrokes the basis of his or her next best seller. He or she argued convincingly: 'Look there are 7 billion people on the planet, we can't ever hope to achieve consensus among all of them, regardless of how much we reduce them to generic stereotypes. If the population of the Earth was smaller, say about twenty people, we would have a chance. But now it's too difficult. Buy my new book out in two months: 'The Audacity of Hypocirsy'.'
One unexpected outcome of this epiphany was a widespread change of heart towards the participation of world leaders in the solidarity march in Paris a few days ago. The leaders, most of whom have shameful records on human rights and freedom of speech, had come under heavy criticism for their participation in the march because of their apparent hypocrisy. However, everyone now agrees that those leaders had in fact shown the way forward, taking the first steps in the historic march towards embracing hypocrisy as our most valued shared norm.
In the spirit of this new hypocritical world, it was our delight to report on these events. Long live global harmony.
By Karl Sharro at January 14, 2015
Labels: on the lighter side
Karl reMarks is a blog about Middle East politics and culture with a healthy dose of satire.
Karl reMarks Facebook
Karl reMarks Twitter
Follow @karlremarks
Study confirms that Lebanon is indeed the centre of the universe
In what has been dubbed 'the biggest I-told-you-so moment in the history of mankind', a four-year scientific study has confirmed that Leba...
Unprecedented images of Western people looking just like you and me
We have all wondered how Western people look like in everyday situations, behind the veil of exoticism that surrounds their mysterious cu...
إعلان انتخابي: الطائفية تراث حافظ عليها
إضغط على الصورة للمشاهدة من البداية
How would we report the EU referendum if it were happening in the Middle East?
London, Britain. June 2016. You can learn everything you need to know about the EU referendum in the United Kingdom by talking to just...
We Give the Scottish Independence Referendum the Middle East Expert Treatment
These days, everyone is talking about the Scottish Independence Referendum, especially when they're not talking about ISIS. But sadly...
It's ever so simple: a tribal map of the Middle East
Hint: It's not really about the map, which I didn't draw. Source: http://arthurzbygniew.blogspot.co.uk/p/air-bulletin.html The M...
Fascinating Observations of Life in the West by an Iraqi Anthropologist
Until now there have been very few authoritative anthropological studies about the Western World, of which we know very little aside from in...
Sound like an expert with these phrases about Middle East politics
Many people are hesitant to talk about the Middle East and its politics because it seems to be quite a complex place that requires extensi...
The Onion to Sue Lebanon for Making Its Headlines Look Reasonable
It emerged today that the American satirical magazine The Onion is to sue Lebanon for unfair competition practices and for making its head...
Saudi Arabia Announces Historic Decision to Ban Everything
In an unprecedented move in modern governance, Saudi Arabia announced today that it will introduce a ban on everything. The announcement h...
Deconstructing the Theoretical Currents in Middle ...
The Confused Person's Guide to Understanding Yemen...
A Simple Diagram of the Arab Uprisings and Their A...
Far-Right Extremist 'Confused and Upset' After Rea...
Shock As Lebanese Student at US University Comes S...


text:
Q: sync salesforce events (Custom object) to google calendar The client has 1000 + Franchises, and on client corporate gmail account 1000 + Franchise calendars were created and each franchise calendar was shared (read only) to respective Franchise gmail account. When customers create meeting request on franchise website, events will be created in respective franchise calendars, and franchises get notified via email, gmail alerts etc.
Now client moved to Saleforce and each franchise was given access to experience cloud (franchise center details are in serviceterritory object), franchise website linked to salesforce and events are saved in salesforce custom object (attendee name, attendee contact details etc. in Attendee__c object) when customer creates a meeting request.
so how to create the events on franchise google calendar(s) whenever new / cancel meeting request comes to Attendee__c salesforce object?
Can we do this from Salesforce itself?
alternatively is there anyway to accomplish this using mulesoft?
Thanks in advance.

redpajama_set_name: RedPajamaStackExchange


text:
package debian

import (
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"strconv"
	"strings"

	"github.com/dustin/go-humanize"
	"github.com/mattn/go-zglob"
	"github.com/mh-cbon/go-bin-deb/stringexec"
	"github.com/mh-cbon/verbose"
)

var logger = verbose.Auto()

type vcsSrc struct {
	Type string `json:"type"` // Type identifier of the vcs source
	URL  string `json:"url"`  // Url-like to the vcs source
}

func (c vcsSrc) String() string {
	return c.Type + ": " + c.URL
}

type filesInstruction struct {
	From  string `json:"from"`  // Source path to the files
	Base  string `json:"base"`  // Base path to copy files from
	To    string `json:"to"`    // Target path to copy the files to
	Fperm string `json:"fperm"` // Permissions to apply such 0755
	Dperm string `json:"dperm"` // Permissions to apply such 0755
}
type copyright struct {
	Files     string `json:"files"`     // A pattern to describe a files selection
	Copyright string `json:"copyright"` // the text of the copyright
	License   string `json:"license"`   // License to apply to the selected files
	File      string `json:"file"`      // Path to the file containing the license content
}
type menu struct {
	Name            string `json:"name"`           // Name of the shortcut
	Description     string `json:"description"`    //
	GenericName     string `json:"generic-name"`   //
	Exec            string `json:"exec"`           // Exec command
	Icon            string `json:"icon"`           // Path to the installed icon
	Type            string `json:"type"`           // Type of shortcut
	StartupNotify   bool   `json:"startup-notify"` // yes/no
	Terminal        bool   `json:"terminal"`       // yes/no
	DBusActivatable bool   `json:"dbus-activable"` // yes/no
	NoDisplay       bool   `json:"no-display"`     // yes/no
	Keywords        string `json:"keywords"`       // ; separated list
	OnlyShowIn      string `json:"only-show-in"`   // ; separated list
	Categories      string `json:"categories"`     // ; separated list
	MimeType        string `json:"mime-type"`      // ; separated list
}

// Package contaisn informtation about a debian package to build
type Package struct {
	Name                string             `json:"name"`                 // Name of the package
	Maintainer          string             `json:"maintainer"`           // Information of the package maintainer
	Changedby           string             `json:"changed-by"`           // Information of the last package maintainer
	Section             string             `json:"section"`              // Classification of the application area
	Priority            string             `json:"priority"`             // Priority of the package (required,important,standard,optional,extra)
	Arch                string             `json:"arch"`                 // Arch targeted by the package
	Homepage            string             `json:"homepage"`             // Url to the homepage of the program
	SourcesURL          string             `json:"sources-url"`          // Url to the source of the program
	Version             string             `json:"version"`              // Version of the package
	Vcs                 []vcsSrc           `json:"vcs"`                  // Vcs information of the package
	Files               []filesInstruction `json:"files"`                // Files information to copy into the package
	CopyrightSpecURL    string             `json:"copyrights-spec-url"`  // Url to the copyright file specification
	Copyrights          []copyright        `json:"copyrights"`           // Copyrights of the package
	Essential           bool               `json:"essential"`            // Indicate if the package is an essential one
	Depends             []string           `json:"depends"`              // Dependency list
	Recommends          []string           `json:"recommends"`           // Recommendation list
	Suggests            []string           `json:"suggests"`             // Suggestion list
	Enhances            []string           `json:"enhances"`             // Enhancement list
	PreDepends          []string           `json:"pre-depends"`          // Pre-dependency list
	Breaks              []string           `json:"breaks"`               // Breaks list
	Conflicts           []string           `json:"conflits"`             // Conflicts list
	Envs                map[string]string  `json:"envs"`                 // Environment variables to define
	Provides            string             `json:"provides"`             // Provides
	Replaces            string             `json:"replaces"`             // Replaces
	BuiltUsing          string             `json:"built-using"`          // Built-using list
	Description         string             `json:"description"`          // A one-line short description
	DescriptionExtended string             `json:"description-extended"` // A multi-line long description
	PackageType         string             `json:"package-type"`         // Type of the package
	CronFiles           map[string]string  `json:"cron-files"`           // Cron files to use for the package
	CronCmds            map[string]string  `json:"cron-cmds"`            // Cron string to use to generate cron files for the package
	SystemdFile         string             `json:"systemd-file"`         // Systemd unit file
	InitFile            string             `json:"init-file"`            // Init file describing a service for the package
	DefaultFile         string             `json:"default-file"`         // Default init file describing a service for the package
	PreinstFile         string             `json:"preinst-file"`         // Pre-inst script path
	PostinstFile        string             `json:"postinst-file"`        // Post-inst script path
	PrermFile           string             `json:"prerm-file"`           // Pre-rm script path
	PostrmFile          string             `json:"postrm-file"`          // Post-rm script path
	Conffiles           []string           `json:"conf-files"`           // A list of the configuration files
	Mans                []string           `json:"mans"`                 // A list of man page in the package
	ChangelogFile       string             `json:"changelog-file"`       // Post-rm to the changelog file to copy to the package
	ChangelogCmd        string             `json:"changelog-cmd"`        // A cmd to run which generates the content of the changelog file
	Menus               []menu             `json:"menus"`                // Desktop shortcuts
}

// Load given deb.json file
func (d *Package) Load(file string) error {
	if _, err := os.Stat(file); os.IsNotExist(err) {
		m := fmt.Sprintf("json file '%s' does not exist: %s", file, err.Error())
		return errors.New(m)
	}
	byt, err := ioutil.ReadFile(file)
	if err != nil {
		m := fmt.Sprintf("error occured while reading file '%s': %s", file, err.Error())
		return errors.New(m)
	}
	if err := json.Unmarshal(byt, d); err != nil {
		m := fmt.Sprintf("Invalid json file '%s': %s", file, err.Error())
		return errors.New(m)
	}
	return nil
}

// Normalize current metadata
func (d *Package) Normalize(debianDir string, version string, arch string) {

	tokens := make(map[string]string)
	tokens["!version!"] = version
	tokens["!arch!"] = arch
	tokens["!name!"] = d.Name

	d.Version = replaceTokens(d.Version, tokens)
	d.Arch = replaceTokens(d.Arch, tokens)
	d.Homepage = replaceTokens(d.Homepage, tokens)
	d.SourcesURL = replaceTokens(d.SourcesURL, tokens)
	d.CopyrightSpecURL = replaceTokens(d.CopyrightSpecURL, tokens)
	d.Description = replaceTokens(d.Description, tokens)
	d.DescriptionExtended = replaceTokens(d.DescriptionExtended, tokens)
	d.InitFile = replaceTokens(d.InitFile, tokens)
	d.SystemdFile = replaceTokens(d.SystemdFile, tokens)
	d.DefaultFile = replaceTokens(d.DefaultFile, tokens)
	d.PreinstFile = replaceTokens(d.PreinstFile, tokens)
	d.PostinstFile = replaceTokens(d.PostinstFile, tokens)
	d.PrermFile = replaceTokens(d.PrermFile, tokens)
	d.PostrmFile = replaceTokens(d.PostrmFile, tokens)
	d.ChangelogFile = replaceTokens(d.ChangelogFile, tokens)
	d.ChangelogCmd = replaceTokens(d.ChangelogCmd, tokens)

	for i, v := range d.Vcs {
		d.Vcs[i].URL = replaceTokens(v.URL, tokens)
	}
	for i, v := range d.Files {
		d.Files[i].From = replaceTokens(v.From, tokens)
		d.Files[i].Base = replaceTokens(v.Base, tokens)
		d.Files[i].To = replaceTokens(v.To, tokens)
	}
	for i, v := range d.Copyrights {
		d.Copyrights[i].Files = replaceTokens(v.Files, tokens)
		d.Copyrights[i].Copyright = replaceTokens(v.Copyright, tokens)
		d.Copyrights[i].License = replaceTokens(v.License, tokens)
		d.Copyrights[i].File = replaceTokens(v.File, tokens)
	}
	for i, v := range d.CronFiles {
		d.CronFiles[i] = replaceTokens(v, tokens)
	}
	for i, v := range d.CronCmds {
		d.CronCmds[i] = replaceTokens(v, tokens)
	}
	for i, v := range d.Conffiles {
		d.Conffiles[i] = replaceTokens(v, tokens)
	}
	for i, v := range d.Mans {
		d.Mans[i] = replaceTokens(v, tokens)
	}
	for i, v := range d.Menus {
		d.Menus[i].Name = replaceTokens(v.Name, tokens)
		d.Menus[i].Description = replaceTokens(v.Description, tokens)
		d.Menus[i].GenericName = replaceTokens(v.GenericName, tokens)
		d.Menus[i].Exec = replaceTokens(v.Exec, tokens)
		d.Menus[i].Icon = replaceTokens(v.Icon, tokens)
	}

	if d.CopyrightSpecURL == "" {
		d.CopyrightSpecURL = "http://anonscm.debian.org/viewvc/dep/web/deps/dep5/copyright-format.xml?view=markup"
	}
	if d.Version == "" {
		d.Version = version
	}
	if d.Arch == "" {
		d.Arch = arch
	}
	if d.PackageType == "" {
		d.PackageType = "deb"
	}
	if d.Changedby == "" {
		d.Changedby = d.Maintainer
	}
	if d.Section == "" {
		d.Section = "unknown"
	}
	if d.Priority == "" {
		d.Priority = "extra"
	}

	if d.InitFile != "" && contains(d.Conffiles, d.InitFile) == false {
		d.Conffiles = append(d.Conffiles, filepath.Join("etc", "init.d", d.Name+".sh"))
	}
	if d.DefaultFile != "" && contains(d.Conffiles, d.DefaultFile) == false {
		d.Conffiles = append(d.Conffiles, filepath.Join("etc", "default", d.Name+".sh"))
	}

	if len(d.Envs) > 0 {
		d.Conffiles = append(d.Conffiles, filepath.Join("etc", "profile.d", d.Name+".sh"))
	}
}

func replaceTokens(in string, tokens map[string]string) string {
	for token, v := range tokens {
		in = strings.Replace(in, token, v, -1)
	}
	return in
}

// GenerateFiles from sourceDir to pkgDir
func (d *Package) GenerateFiles(sourceDir string, pkgDir string) error {

	dataDir := filepath.Join(pkgDir, "debian")
	debianDir := filepath.Join(pkgDir, "debian", "DEBIAN")
	// create the base structure
	if err := os.MkdirAll(filepath.Join(debianDir), 0755); err != nil {
		return err
	}
	logger.Printf("base structure created: %s", debianDir)

	if err := os.MkdirAll(filepath.Join(dataDir), 0755); err != nil {
		return err
	}
	logger.Printf("data dir created: %s", dataDir)

	// copy the files
	if err := d.ImportFiles(dataDir); err != nil {
		m := fmt.Sprintf("Could not copy the files: %s", err.Error())
		return errors.New(m)
	}
	logger.Println("files structure created")

	// generate shortcuts
	if err := d.WriteShortcuts(dataDir); err != nil {
		m := fmt.Sprintf("Could not generate shortcuts: %s", err.Error())
		return errors.New(m)
	}
	logger.Println("shortcuts created")

	// generate env variable file
	if err := d.WriteEnvProfile(dataDir); err != nil {
		m := fmt.Sprintf("Could not generate etc/profile.d/%s.sh: %s", d.Name, err.Error())
		return errors.New(m)
	}
	logger.Println("env file created")

	// generate the init file
	if err := d.WriteInitFile(dataDir); err != nil {
		m := fmt.Sprintf("Could not generate init file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("init file created\n")

	// generate the unit file
	if err := d.WriteUnitFile(dataDir); err != nil {
		m := fmt.Sprintf("Could not generate unit file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("unit file created\n")

	// generate the default init file
	if err := d.WriteDefaultInitFile(dataDir); err != nil {
		m := fmt.Sprintf("Could not generate default init file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("init default file created\n")

	// generate the conffiles file
	if err := d.WriteConffiles(debianDir); err != nil {
		m := fmt.Sprintf("Could not generate conffiles file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("conffiles file created\n")

	// compute file size
	var size uint64
	s, err := d.ComputeSize(pkgDir)
	if err != nil {
		m := fmt.Sprintf("Could not compute install size: %s", err.Error())
		return errors.New(m)
	}
	size = uint64(s)
	logger.Printf("size=%d\n", size)

	// generate the control file
	if err := d.WriteControlFile(debianDir, uint64(size)); err != nil {
		m := fmt.Sprintf("Could not generate control file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("control file created\n")

	// generate the changelog file
	//  /usr/share/doc/pkg/
	pkgDoc := filepath.Join(dataDir, "usr", "share", "doc", d.Name)
	if err := d.WriteChangelogFile(pkgDoc); err != nil {
		m := fmt.Sprintf("Could not generate changelog file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("changelog file created\n")

	// generate the copyright file
	if err := d.WriteCopyrightFile(pkgDoc); err != nil {
		m := fmt.Sprintf("Could not generate copyright file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("copyright file created\n")

	// generate the cron files
	if err := d.WriteCronFiles(debianDir); err != nil {
		m := fmt.Sprintf("Could not generate cron files: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("cron files created\n")

	// generate the preinst file
	if err := d.WritePreInstFile(debianDir); err != nil {
		m := fmt.Sprintf("Could not generate preinst file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("preinst file created\n")

	// generate the postinst file
	if err := d.WritePostInstFile(debianDir); err != nil {
		m := fmt.Sprintf("Could not generate postinst file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("postinst file created\n")

	// generate the prerm file
	if err := d.WritePreRmFile(debianDir); err != nil {
		m := fmt.Sprintf("Could not generate prerm file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("prerm file created\n")

	// generate the postrm file
	if err := d.WritePostRmFile(debianDir); err != nil {
		m := fmt.Sprintf("Could not generate postrm file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("postrm file created\n")

	// generate the manpage index file
	if err := d.WriteManPageIndexFile(debianDir); err != nil {
		m := fmt.Sprintf("Could not generate man pages index file: %s", err.Error())
		return errors.New(m)
	}
	logger.Printf("man pages index file created\n")

	return nil
}

// GenerateInstall generates install file.
func (d *Package) GenerateInstall(sourceDir string, debianDir string, dataDir string) error {
	var err error
	content := ""
	if sourceDir, err = filepath.Abs(sourceDir); err != nil {
		return err
	}
	for _, fileInst := range d.Files {
		from := fileInst.From
		to := fileInst.To
		base := fileInst.Base

		if filepath.IsAbs(from) == false {
			from = filepath.Join(sourceDir, from)
		}
		if filepath.IsAbs(to) { // to must not be absolute..
			to = to[1:]
		}
		if filepath.IsAbs(base) == false {
			base = filepath.Join(sourceDir, base)
		}

		logger.Printf("fileInst.From=%q\n", from)
		logger.Printf("fileInst.To=%q\n", to)
		logger.Printf("fileInst.Base=%q\n", base)

		items, err := zglob.Glob(from)
		if err != nil {
			m := fmt.Sprintf("Could not glob files source '%s': %s", from, err.Error())
			return errors.New(m)
		}
		logger.Printf("items=%q\n", items)
		for _, item := range items {
			n := item
			if len(item) >= len(base) && item[0:len(base)] == base {
				n = item[len(base):]
			}
			n = filepath.Join(to, n)
			content += fmt.Sprintf("%s %s\n", item, filepath.Dir(n))
		}
	}
	for _, m := range d.Menus {
		file := filepath.Join(dataDir, m.Name+".desktop")
		icon := m.Icon
		if filepath.IsAbs(icon) == false {
			icon = filepath.Join(sourceDir, icon)
		}
		content += fmt.Sprintf("%s %s\n", file, "/usr/share/applications/"+d.Name+".desktop")
		content += fmt.Sprintf("%s %s\n", icon, "/usr/share/pixmaps/"+filepath.Base(icon))
	}
	logger.Printf("content=\n%s\n", content)

	f := filepath.Join(debianDir, "install")
	return ioutil.WriteFile(f, []byte(content), 0644)
}

// WriteConffiles updates the debian directory
func (d *Package) WriteConffiles(debianDir string) error {
	content := ""
	for _, f := range d.Conffiles {
		if filepath.IsAbs(f) == false {
			f = "/" + f // lintian says: must not be rel.
		}
		content += fmt.Sprintf("%s\n", f)
	}
	if content == "" {
		return nil
	}
	f := filepath.Join(debianDir, "conffiles")
	return ioutil.WriteFile(f, []byte(content), 0644)
}

// WriteEnvProfile generates an etc/profile.d/plg.name.sh
func (d *Package) WriteEnvProfile(debianDir string) error {
	content := ""
	for k, v := range d.Envs {
		content += fmt.Sprintf("%s=%q\n", k, v)
	}
	if content == "" {
		return nil
	}
	f := filepath.Join(debianDir, "etc", "profile.d", d.Name+".sh")
	if err := os.MkdirAll(filepath.Dir(f), 0755); err != nil {
		return err
	}
	return ioutil.WriteFile(f, []byte(content), 0644)
}

// ImportFiles add files to the package.
func (d *Package) ImportFiles(sourceDir string) error {
	for _, fileInst := range d.Files {
		var fperm int32
		var dperm int32 = 0755
		if fileInst.Fperm != "" {
			p, err := strconv.ParseInt(fileInst.Fperm, 8, 32)
			if err != nil {
				return err
			}
			fperm = int32(p)
		}
		if fileInst.Dperm != "" {
			p, err := strconv.ParseInt(fileInst.Dperm, 8, 32)
			if err != nil {
				return err
			}
			dperm = int32(p)
		}
		items, err := zglob.Glob(fileInst.From)
		logger.Printf("fileInst.From=%q\n", fileInst.From)
		logger.Printf("fileInst.To=%q\n", fileInst.To)
		logger.Printf("fileInst.Base=%q\n", fileInst.Base)
		logger.Printf("fileInst.Fperm=%q\n", fileInst.Fperm)
		logger.Printf("fileInst.fperm=%#o\n", fperm)
		logger.Printf("fileInst.Dperm=%q\n", fileInst.Dperm)
		logger.Printf("fileInst.dperm=%#o\n", dperm)
		if err != nil {
			m := fmt.Sprintf("Could not glob files source '%s': %s", fileInst.From, err.Error())
			return errors.New(m)
		}
		logger.Printf("items=%q\n", items)
		targetItems := make([]string, 0)
		for _, item := range items {
			n := item[len(fileInst.Base):]
			n = filepath.Join(sourceDir, fileInst.To, n)
			targetItems = append(targetItems, n)
		}
		logger.Printf("targetItems=%q\n", targetItems)
		for i, item := range items {
			s, err := os.Stat(item)
			if err != nil {
				m := fmt.Sprintf("Could not stat source file '%s': %s", item, err.Error())
				return errors.New(m)
			}
			if s.IsDir() {
				if err := os.MkdirAll(targetItems[i], os.FileMode(dperm)); err != nil {
					m := fmt.Sprintf("Could not create directory file '%s': %s", targetItems[i], err.Error())
					return errors.New(m)
				}
			} else {
				d := filepath.Dir(targetItems[i])
				if err := os.MkdirAll(d, os.FileMode(dperm)); err != nil {
					m := fmt.Sprintf("Could not create directory file '%s': %s", d, err.Error())
					return errors.New(m)
				}
			}
		}
		for i, item := range items {
			s, err := os.Stat(item)
			if err != nil {
				m := fmt.Sprintf("Could not stat source file '%s': %s", item, err.Error())
				return errors.New(m)
			}
			if s.IsDir() == false {
				if err := cp(targetItems[i], item); err != nil {
					m := fmt.Sprintf("Could not copy file from '%s' to '%s': %s", item, targetItems[i], err.Error())
					return errors.New(m)
				}
				if fileInst.Fperm != "" {
					if err := os.Chmod(targetItems[i], os.FileMode(fperm)); err != nil {
						return err
					}
				}
			}
		}
	}
	return nil
}

// ComputeSize returns size of a directory
func (d *Package) ComputeSize(sourceDir string) (int64, error) {
	var size int64

	// exclDir := filepath.Join(sourceDir)
	walkFn := func(path string, info os.FileInfo, err error) error {
		// if len(path)>=len(exclDir) && path[0:len(exclDir)]==exclDir {
		//   return nil
		// }
		if err == nil {
			s, _ := os.Stat(path)
			if err == nil {
				if s.IsDir() == false {
					size += s.Size()
				}
			}
		}
		return nil
	}
	err := filepath.Walk(sourceDir, walkFn)
	if err != nil {
		return size, err
	}
	return size / 1024, nil
}

// WriteControlFile writes the control file.
func (d *Package) WriteControlFile(debianDir string, size uint64) error {

	desc := d.Description
	if d.DescriptionExtended != "" {
		desc += "\n"
		for _, line := range strings.Split(d.DescriptionExtended, "\n") {
			desc += " " + line + "\n"
		}
		desc = strings.TrimSpace(desc)
	}

	arch := d.Arch
	if arch == "386" { // go style
		arch = "i386" // deb style
	}

	P := ""
	P += strAppend("Package", d.Name)
	P += strAppend("Version", d.Version)
	P += strAppend("Source", d.Name)
	P += strAppend("Section", d.Section)
	P += strAppend("Priority", d.Priority)
	P += strAppend("Maintainer", d.Maintainer)
	P += strAppend("Homepage", d.Homepage)
	P += strAppend("Description", desc)
	P += strAppend("Architecture", arch)
	P += vcsSliceAppend(d.Vcs)
	P += boolAppend("Essential", d.Essential)
	P += strSliceAppend("Depends", d.Depends, ",")
	P += strSliceAppend("Recommends", d.Recommends, ",")
	P += strSliceAppend("Suggests", d.Suggests, ",")
	P += strSliceAppend("Enhances", d.Enhances, ",")
	P += strSliceAppend("Pre-Depends", d.PreDepends, ",")
	P += strSliceAppend("Breaks", d.Breaks, ",")
	P += strSliceAppend("Conflicts", d.Conflicts, ",")
	P += strAppend("Provides", d.Provides)
	P += strAppend("Replaces", d.Replaces)
	P += strAppend("Built-Using", d.BuiltUsing)
	P += strAppend("Installed-Size", humanize.Bytes(size))
	P += strAppend("Package-Type", d.PackageType)

	controlContent := []byte(P)
	control := filepath.Join(debianDir, "control")

	return ioutil.WriteFile(control, controlContent, 0644)
}

// WriteCopyrightFile writes the copyright file.
func (d *Package) WriteCopyrightFile(debianDir string) error {
	if err := os.MkdirAll(debianDir, 0755); err != nil {
		return err
	}
	content := ""
	content += strAppend("Format-Specification", d.CopyrightSpecURL)
	content += strAppend("Name", d.Name)
	content += strAppend("Maintainer", d.Maintainer)
	sourcesURL := d.SourcesURL
	if sourcesURL == "" {
		sourcesURL = d.Homepage
	}
	content += strAppend("Source", sourcesURL)
	content += "\n"

	// write the copyrights
	for _, c := range d.Copyrights {
		t := ""
		if c.Files != "" {
			t += strAppend("Files", c.Files)
		}
		if c.Copyright != "" {
			t += strAppend("Copyright", c.Copyright)
		}
		if c.License != "" {
			t += strAppend("License", c.License)
		}
		if c.File != "" {
			t += strAppend("File", c.File)
		}
		if t != "" {
			content += t + "\n"
		}
	}
	file := filepath.Join(debianDir, "copyright")
	return ioutil.WriteFile(file, []byte(content), 0644)
}

// WriteCronFiles writes the cron file.
func (d *Package) WriteCronFiles(debianDir string) error {

	for k, val := range d.CronFiles {
		if val != "" {
			file := filepath.Join(debianDir, d.Name+"-f.cron."+k)
			if err := cp(file, val); err != nil {
				m := fmt.Sprintf("Failed to copy '%s' to '%s': %s", val, file, err.Error())
				return errors.New(m)
			}
		} else {
			fmt.Printf("cron job '%s' is empty!\n", k)
		}
	}
	for k, content := range d.CronCmds {
		if content != "" {
			file := filepath.Join(debianDir, d.Name+"-c.cron."+k)
			if err := ioutil.WriteFile(file, []byte(content), 0644); err != nil {
				return err
			}
		}
	}

	return nil
}

// WriteChangelogFile writes the changelog file.
func (d *Package) WriteChangelogFile(debianDir string) error {
	if err := os.MkdirAll(debianDir, 0755); err != nil {
		return err
	}

	file := filepath.Join(debianDir, "changelog")
	if d.ChangelogFile != "" {
		if err := cp(file, d.ChangelogFile); err != nil {
			return err
		}
	} else if d.ChangelogCmd != "" {
		wd, err := os.Getwd()
		if err != nil {
			return err
		}
		cmd, err := stringexec.Command(wd, d.ChangelogCmd)
		if err != nil {
			return err
		}
		cmd.Stdout = nil
		content, err := cmd.Output()
		if err != nil {
			return err
		}
		if err := ioutil.WriteFile(file, []byte(content), 0644); err != nil {
			return err
		}
	} else {
		ioutil.WriteFile(file, []byte(""), 0644) // force empty changelog
	}

	oCmd := exec.Command("gzip", "--best", file)
	oCmd.Stdout = os.Stdout
	oCmd.Stderr = os.Stderr
	return oCmd.Run()
}

// WriteManPageIndexFile writes the map page index file.
func (d *Package) WriteManPageIndexFile(debianDir string) error {

	file := filepath.Join(debianDir, d.Name+".manpages")
	if len(d.Mans) > 0 {
		content := strings.Join(d.Mans, "\n")
		if err := ioutil.WriteFile(file, []byte(content), 0644); err != nil {
			return err
		}
	}

	return nil
}

// WriteShortcuts writes the application shortcuts.
func (d *Package) WriteShortcuts(dataDir string) error {

	for _, m := range d.Menus {
		s := ""

		if m.Name != "" {
			s += fmt.Sprintf("%s=%s\n", "Name", m.Name)
		}

		if m.Description != "" {
			s += fmt.Sprintf("%s=%s\n", "Description", m.Description)
		}

		if m.GenericName != "" {
			s += fmt.Sprintf("%s=%s\n", "GenericName", m.GenericName)
		}

		if m.Exec != "" {
			s += fmt.Sprintf("%s=%s\n", "Exec", m.Exec)
		}

		if m.Icon != "" {
			s += fmt.Sprintf("%s=%s\n", "Icon", "/usr/share/pixmaps/"+filepath.Base(m.Icon))
		}

		if m.Type != "" {
			s += fmt.Sprintf("%s=%s\n", "Type", m.Type)
		}

		if m.Categories != "" {
			s += fmt.Sprintf("%s=%s\n", "Categories", m.Categories)
		}

		if m.MimeType != "" {
			s += fmt.Sprintf("%s=%s\n", "MimeType", m.MimeType)
		}

		if m.OnlyShowIn != "" {
			s += fmt.Sprintf("%s=%s\n", "OnlyShowIn", m.OnlyShowIn)
		}

		if m.Keywords != "" {
			s += fmt.Sprintf("%s=%s\n", "Keywords", m.Keywords)
		}

		if s != "" {

			if m.StartupNotify {
				s += fmt.Sprintf("%s=%s\n", "StartupNotify", "true")
			} else {
				s += fmt.Sprintf("%s=%s\n", "StartupNotify", "false")
			}

			if m.DBusActivatable {
				s += fmt.Sprintf("%s=%s\n", "DBusActivatable", "true")
			} else {
				s += fmt.Sprintf("%s=%s\n", "DBusActivatable", "false")
			}

			if m.NoDisplay {
				s += fmt.Sprintf("%s=%s\n", "NoDisplay", "true")
			} else {
				s += fmt.Sprintf("%s=%s\n", "NoDisplay", "false")
			}

			if m.Terminal {
				s += fmt.Sprintf("%s=%s\n", "Terminal", "true")
			} else {
				s += fmt.Sprintf("%s=%s\n", "Terminal", "false")
			}

			s = "[Desktop Entry]\n" + s

			file := filepath.Join(dataDir, "usr", "share", "applications", m.Name+".desktop")
			if err := os.MkdirAll(filepath.Dir(file), 0755); err != nil {
				return err
			}
			if err := ioutil.WriteFile(file, []byte(s), 0644); err != nil {
				return err
			}

			icoFile := filepath.Join(dataDir, "usr", "share", "pixmaps", filepath.Base(m.Icon))
			if err := os.MkdirAll(filepath.Dir(icoFile), 0755); err != nil {
				return err
			}
			if err := cp(icoFile, m.Icon); err != nil {
				return err
			}
		}
	}

	return nil
}

// WriteUnitFile writes the unit.d file.
func (d *Package) WriteUnitFile(dataDir string) error {
	if d.SystemdFile != "" {
		f := filepath.Join(dataDir, "lib", "systemd", "system", filepath.Base(d.SystemdFile))
		if err := os.MkdirAll(filepath.Dir(f), 0755); err != nil {
			return err
		}
		if err := writeAFile(f, d.SystemdFile); err != nil {
			return err
		}
		return os.Chmod(f, 0644)
	}
	return nil
}

// WriteInitFile writes the etc/init.d file.
func (d *Package) WriteInitFile(dataDir string) error {
	if d.InitFile != "" {
		f := filepath.Join(dataDir, "etc", "init.d", d.Name+".sh")
		if err := os.MkdirAll(filepath.Dir(f), 0755); err != nil {
			return err
		}
		if err := writeAFile(f, d.InitFile); err != nil {
			return err
		}
		return os.Chmod(f, 0755)
	}
	return nil
}

// WriteDefaultInitFile writes the etc/default file.
func (d *Package) WriteDefaultInitFile(dataDir string) error {
	if d.DefaultFile != "" {
		f := filepath.Join(dataDir, "etc", "default", d.Name+".sh")
		if err := os.MkdirAll(filepath.Dir(f), 0755); err != nil {
			return err
		}
		if err := writeAFile(f, d.DefaultFile); err != nil {
			return err
		}
		return os.Chmod(f, 0755)
	}
	return nil
}

// WritePreInstFile writes the preinst file.
func (d *Package) WritePreInstFile(debianDir string) error {
	if d.PreinstFile != "" {
		f := filepath.Join(debianDir, "preinst")
		if err := writeAFile(f, d.PreinstFile); err != nil {
			return err
		}
		return os.Chmod(f, 0755)
	}
	return nil
}

// WritePostInstFile writes the postinst file.
func (d *Package) WritePostInstFile(debianDir string) error {
	if d.PostinstFile != "" {
		f := filepath.Join(debianDir, "postinst")
		if err := writeAFile(f, d.PostinstFile); err != nil {
			return err
		}
		return os.Chmod(f, 0755)
	}
	return nil
}

// WritePreRmFile writes the prerm file.
func (d *Package) WritePreRmFile(debianDir string) error {
	if d.PrermFile != "" {
		f := filepath.Join(debianDir, "prerm")
		if err := writeAFile(f, d.PrermFile); err != nil {
			return err
		}
		return os.Chmod(f, 0755)
	}
	return nil
}

// WritePostRmFile writes the postrm file.
func (d *Package) WritePostRmFile(debianDir string) error {
	if d.PostrmFile != "" {
		f := filepath.Join(debianDir, "postrm")
		if err := writeAFile(f, d.PostrmFile); err != nil {
			return err
		}
		return os.Chmod(f, 0755)
	}
	return nil
}

// CopyResults copy the packages to the path..
func (d *Package) CopyResults(from string, to string) error {
	items, err := zglob.Glob(from + "/" + d.Name + "*")
	if err != nil {
		return err
	}
	for _, item := range items {
		b := filepath.Base(item)
		if err := cp(filepath.Join(to, b), item); err != nil {
			return err
		}
	}
	return nil
}

func writeAFile(dst string, src string) error {
	if len(src) > 0 {
		err := cp(dst, src)
		if err != nil {
			m := fmt.Sprintf("Could not write file '%s': %s", src, err.Error())
			return errors.New(m)
		}
	}
	return nil
}

func strAppend(name string, value string) string {
	ret := ""
	if len(value) > 0 {
		ret = fmt.Sprintf("%s: %s\n", name, value)
	}
	return ret
}
func boolAppend(name string, value bool) string {
	ret := ""
	if value {
		ret = fmt.Sprintf("%s: %s\n", name, "yes")
	}
	return ret
}
func vcsSliceAppend(s []vcsSrc) string {
	ret := ""
	for _, k := range s {
		ret += structAppend(k)
	}
	return ret
}
func structAppend(s fmt.Stringer) string {
	ret := ""
	value := s.String()
	if len(value) > 0 {
		ret = fmt.Sprintf("%s\n", value)
	}
	return ret
}
func strSliceAppend(name string, value []string, j string) string {
	ret := ""
	if len(value) > 0 {
		ret = fmt.Sprintf("%s: %s\n", name, strings.Join(value, j))
	}
	return ret
}
func cp(dst, src string) error {
	s, err := os.Open(src)
	if err != nil {
		return err
	}
	defer s.Close()
	d, err := os.Create(dst)
	if err != nil {
		return err
	}
	if _, err := io.Copy(d, s); err != nil {
		d.Close()
		return err
	}
	return d.Close()
}

func contains(s []string, v string) bool {
	for _, k := range s {
		if v == k {
			return true
		}
	}
	return false
}

redpajama_set_name: RedPajamaGithub


Math worksheet generator free cross platform problem create tests created test. Basic math worksheet generators addition worksheet. Free math worksheet generator for students from microsoft. Basic math worksheet generators. Math generator worksheets sheets new what is mathgen worksheet for windows.


Benita Brewer is an artist residing in Chicago Illinois but has lived in different areas of the country. Her imagery often reflects the colors and shapes of her surroundings and the people that she has met. Benita works mainly in transparent watercolor but also loves photography and digital imagery.
She taught visual design and multimedia as an Assistant Professor at Indiana-University Purdue-University Fort Wayne (IPFW) in Indiana; received a BFA from Indiana University and a MFA in Electronic Art from the University of Cincinnati.
Benita began her career developing medical illustrations for the nursing profession and educational CD-Roms and websites for the agriculture market, animating the growth cycles of crops and insects. As the Design Director for CMG Worldwide, she produced advertisements and websites for the estates of Humphrey Bogart, Marilyn Monroe, Malcolm X, Vince Lombardi, Buddy Holly, and Jack Kerouac. Later as a Consultant for Ambassador Solutions, her clients included Lilly & Company, Clarion Health, and Pearson Publishing.
She was awarded an Indiana Arts Commission Individual Artists' Grant and a Purdue University Faculty Research grant. Her work has been exhibited nationally and she is a Signature member of the National Watercolor Society.
Painting for Benita is a form of storytelling. Her ideas often start with a personal connection to a person or object. It is a spark used for developing a composition that reflects the essence of the memory but becomes more abstract and universal. The story may be hers but hopefully the viewer interprets the image from his or her own perspective. Much of her formal art training centered on the graphic arts and she enjoys paying homage to the typographers and designers that so greatly influence our view of the world. She also loves painting portraits and revealing a person's personality and spirit.
Copyright @ Benita Brewer. All rights reserved.


Tallahassee, FL – After more than an hour of arguments Tuesday, state regulators next month will decide a high-stakes battle stemming from Florida Power & Light's costs to restore power after Hurricane Irma and a federal tax overhaul that has saved the utility hundreds of millions of dollars.
The settlement included numerous provisions, including setting a maximum return on equity of 11.6 percent — a closely watched measure of profitability — and approving FPL's use of a financial reserve. Litchfield said that reserve was designed to help the company manage "ups and downs" in costs and revenues.


Who was the antique furniture maker Thomas Chippendale (1718 to 1779)?
Thomas Chippendale is probably the best known British cabinetmaker. He was a leading British cabinetmaker whose work was extremely influential during the early Georgian period. It was widely copied and imitated in later years.
Thomas Chippendale was born in Oatley, Yorkshire in 1718 into a family of carpenters. Not much is known of his early life and career. In 1748, at the age of thirty, he settled in London where married Catherine Redshaw and worked as a cabinet maker. Later on, in 1753 he moved to St.Martin's Lane, where he had workshops and a timber yard. He lived there for the rest of his life.
In 1754 Thomas Chippendale published The Gentleman and Cabinet Makers Director (1754; 2nd ed. 1755; 3rd ed.1762) or widely known as The Director. This made him the first furniture maker to release a book with his designs and undoubtedly gained him a wide popularity, establishing Chippendale as a household name. Nothing on such a scale had ever been published before in England or elsewhere. Almost every type of indoor furniture was illustrated in it. The designs were predominantly French Rococo in style, including Neo-Gothic and Chinoiserie, known as Chinese Chippendale. In a later edition, he also added Neo-Classical styles. The book and its designs were widely copied by other cabinetmakers, which further cemented his fame.
He specifically claims in the preface of The Director to have made most of the designs himself, and it seems likely that he did so, especially for the case pieces. However several of the designs have clearly borrowed from both Continental and English pattern books.
From a very early stage, Thomas Chippendale gained such a success, that he no longer needed to produce the furniture by himself. For much of his career, he was mostly occupied with running his very extensive business, rather then cabinetmaking himself. By 1755 he already had 40-50 employees as cabinet-makers, upholsters and carvers working in his workshop, while his attention was predominantly focused on inventing new designs, attracting new clients and managing the business.
In 1754 Chippendale took into partnership James Rannie who was a wealthy Scottish merchant willing to invest in the firm. They remain partners until Rannie´s death in 1766. In 1771, the accountant Thomas Haig joined the firm, which then became Chippendale, Haig and Company. The Chippendales firm undertook the complete furnishing and decoration of large houses such as Nostell Priory and Harewood House. Haig left the company 25 years later when he retired in 1796.
After Chippendale's death in 1779, the firm of Chippendale and Haig was carried on by his son. Thomas Chippendale the Younger (1749-1822) worked mainly in the Neo-Classical and Regency styles. He was able to maintain the firm's high level of craftsmanship for two decades, but unfortunately, he went bankrupt shortly after in 1804. However, he appeared to have recovered quickly and resumed his furniture business, continuing to supply some of his clients until around 1820s.
Thomas Chippendale not only turns into the most famous English cabinet maker of all time but furthermore, he came to be known and hugely priced among the American colonies.


text:
Vale: Betty Smith-Gander
It was with great sadness we learnt of the passing of Betty Smith-Gander on 29 October. Betty was a much-loved member of the Santa Maria College community. She taught at Santa Maria College for over 20 years, and for part of that time, Betty was Deputy Principal. She received an Order of Australia in 2004 for her service to the community, particularly her work with the Red Cross.
Betty was instrumental in setting up the first service program at Santa Maria. Her daughter Diane wrote, "The thing Mum was most proud of about Santa Maria was the way the College embraced the service-learning program she architected. That was the first real service-learning program of any scale and design into the learning curriculum in a senior school in Australia. Mum was at heart, first and foremost a volunteer. Discretionary effort defined her."
Betty was also fondly remembered for coaching our victorious It's Academic team in 1978.
The memories from her past students have flooded in, and below, we share some of them:
"Wonderful teacher and a lovely lady we all respected. Always lead by example and had a kind word for everyone."
"The best teacher I ever had, always giving plenty of encouragement."
"Such a gracious woman. She will be fondly remembered."
"Wonderful memories of Mrs Smith-Gander. Homeroom teacher, accounting teacher and champion of "It's Academic". Kind, thoughtful and quietly spoken. A great role model."
"Oh, I am so saddened to hear of Mrs Smith Ganders passing – she was an inspirational woman who took on the challenge of teaching me accounting, which I then went on to teach – using many of the techniques she used in me. Condolences to her family. An amazing and beautiful woman."
"An amazing English Lit teacher. Owe her a lot."
"Such an elegant, beautiful, gentle, strong leader, full of grace and a great role model. She will be remembered fondly and missed."
"She was a lovely lady, inspiring teacher and caring person. Loved my accounting classes with her; she made them so enjoyable. I even married an accountant!"
"Mrs Smith Gander was a lady who epitomised the values and beliefs of Santa Maria. I was in the last class to be taken in at Grade 1 and went all the way through to Year 12. Always a kind word, a smile and gentle guidance. Very fond memories. RIP, dear Lady."
"Dear Mrs Smith-Gander, such a kind, gentle and elegantly strong woman, she was a great mentor, teacher and inspiration for all of the students who were lucky to have contact with her. Condolences to all her loved ones."


text:
China orders factories shut as smog nightmare continues
Beijing - China has ordered thousands of factories to shut as it grapples with swathes of choking smog that were nearly 24 times safe levels on Tuesday, casting a shadow over the country's participation in Paris climate talks.
A thick grey haze shrouded Beijing, with the concentration of PM 2.5, harmful microscopic particles that penetrate deep into the lungs, climbing as high as 598 micrograms per cubic metre.
The reading, given by the US embassy, dwarfs the maximum recommended by the World Health Organisation, which is just 25 micrograms per cubic metre Levels in Jinan, a provincial capital hundreds of kilometres away, reached over 400.
Authorities in Beijing ordered the closure of 2,100 highly polluting businesses, the state-run China Daily said, and advised citizens to stay indoors.
Airlines cancelled over 30 flights from Beijing and Shanghai, many to highly polluted Shaanxi province, a key coal producer.
The environmental woes came after Chinese President Xi Jinping took the stage at crucial international talks aiming to limit dangerous climate change.
He vowed "action" on greenhouse emissions, repeating existing pledges and telling the summit that poor nations should not have to sacrifice economic growth.
Most emissions come from coal burning which spikes in winter along with demand for heating, which also causes smog.
China is estimated to have released between nine and 10 billion tonnes of carbon dioxide in 2013, nearly twice as much as the United States and around two and a half times the European Union.
Beijing pledged last year that carbon dioxide output would peak by "around 2030" - suggesting at least another decade of growing emissions.
Social media users in China were sceptical about the chances of a clean up, with many circulating a picture of a Beijing newspaper front page from 1999.
It cited officials as proclaiming: "We absolutely will not let big pollution enter the new century."


Sant Antoni market is the heart of Sant Antoni area in Eixample district, it is a lively market with stalls outside that sell all kinds of products, from shoes, clothes, homewares, cleaning products or food such as fruit, vegetables or meat.
But on Sundays, the whole scene changes with the second-hand book and stamps sell for collectors, it is a must visit for all locals at least once in your lifetime. I am sure all locals remember going there on Sundays with their parents to change stickers to finish up the collection, that could be footballers, princesses or any movie or series that did a collection of any kind. I remember you could change 1 by 1 or you could buy the sticker that you needed, and some of them were very difficult to find. It is a long-established ritual among locals and also visitors to visit the market and browse what is on offer.
Sant Antoni market was designed by Antoni Rovira y Trias in 1882, the metal structure of the market makes it very special nowadays but when it was built it was the typical structure used.
One of the most original elements, is the gallery that is located around the perimeter of the market, green tarpaulins that provide walls and ceiling protecting the circular corridor where traders sell their products through the week while on Sundays they change to welcome stamp traders, book stalls and comic and magazine stalls among others.
I would recommend you to visit the surroundings of Sant Antoni market, there are little jewels to see and it is a good area to eat and discover the trendy Parlament street nearby, check our Sant Antoni route and recommendations.
Monday to Thursday, from 7am to 2.30pm and 5.30pm to 8.30pm.
Friday and Saturday, from 7am to 8.30pm.


I haven't done an interview since grade school. I'm not entirely sure why I decided to embark on this new endeavor (that I hope will grow), but like so much in my recent life you can probably blame Gordon White and Rune Soup. When the idea occurred to me, there really was only one person at the top of my list (it will take some time and some research and a bigger set of balls before I ask the aforementioned Mr White): Tommie Kelly.


Total War: Attila is a the ninth turn based strategy game in the Total War series. It was developed by The Creative Assembly and is available on platforms Microsoft Windows. There is a single player and multiplayer mode. The game is set in 395 AD at the beginning of the dark ages. This world is facing famine, disease, and war. You read full details about the game on the game's page in the Total War main website.
A new power is rising in the east and with a million horsemen at his side he is coming to Rome. Atilla will be able to become leaders of the Huns but he is not at the beginning of the campaign. Get Total War Attila Crack and Lead Atilla to his ultimate conquest and victory .
There are twelve different factions; Eastern Roman Empire, The Visigoths, The Vandals, The Sassanid Empire, The Alans, The Saxons, The Ostrogoths, The Franks, The Western Roman Empire, The Danes, The Geats, and The Jutes. Choose your favorite faction with Total War Attila Crack PC full version Download.
The Eastern Roman Empire is thriving economically because of the new Constantinople centre, trade tariffs, and treasury interest, while the Western Roman Empire is struggling. Play as either empires with Total War Attila Crack. There are new trade networks and reforms that are all run by a bureaucracy and state church.
The east has successfully lowered barbarian migration by sending them to the west. However, Emperor Arcadius in the West still needs to deal with barbarian threats. Alaric is leading Visigoth armies into the Roman lands of Thracia and Macedonia, regions near Constantinople.
The Vandals have been allies with Rome for quite some time. They were rewarded with the land of Pannonia. After the Huns arrived they were driven out of their land and must fight across Europe to a kingdom for themselves. They are located south of Germania in the start of the campaign. They are placed in a spot that borders Western Roman Empire territories and could possibly threaten the weakening empire.
The Alans begin the campaign in the edge of the Black Sea, close to the land of the Huns. Their warriors are peerless horsemen and they understand the value of their charges and know to keep them alive then the odds are not in their favor.
The Western Roman Empire has begun the campaign close to a breaking point with limited funds. They are unable to get their own house in order so will they be able to stand the raging barbarians. Download Total War Attila Crack and play with the Western Roman Empire defending against Attila's hordes of Huns!
The Saxons are targeting northern provinces while other barbarians are fighting over the Western Empire. They are tempted to go for Brittania because they have raided them before. Which opportunity will they take to expand their empire?
All of these factions and more are raging war to secure and gain more land for their people. Download and play Total War: Attila crack full version to see who comes out on top.
Total War Attila is the game expansion of the epic Total War Series, this time set at the brink of the dark ages as the ruthless leader Attila marches down Northern Europe with his million riders. The Total War: Attila Crack offered on gamehackstudios is unique, fast and 100% secure. Enjoy!
If you're a fan of the Total War series you should play the other games in the same series, by the same game developers (since you obviously like their style!) such as: Medieval II: Total War, Rome: Total War and Total War: Rome II. Similar strategic wap map games include Crusader Kings 2: Charlemagne and Europa Universalis IV.


EpiPen 4 Schools is a free program available to all schools. It is offered by Mylan Specialty, a marketer and distributor of EpiPens, and was developed to allow schools access to emergency epinephrine in the event a person experiences a life-threatening allergic reaction. The program provides schools with 1 EpiPen carton and 1 EpiPen Jr carton. In order to be eligible to receive this free supply, a valid prescription from a health care provider must be submitted. San Tan Allergy & Asthma, a local clinic, was kind enough to partner with ALA in this endeavor. They are excited to support ALA in obtaining EpiPens for each campus. ALA will be conducting annual training to staff members on the signs and symptoms of life-threatening allergic reactions and how to properly use an EpiPen. ALA would like to thank the physicians at San Tan Allergy & Asthma for supporting our ALA family. We are excited for this new partnership!


text:
2012 Williams Watch-Short Stay In Paris
By Monica Roberts / June 2, 2012 April 15, 2021 / 2 minutes of reading
The French Open is being contested at Stade Roland Garros this week and next, but unfortunately my favorite tennis playing siblings are out of this tournament.
Out of all the Grand Slam tournaments, the French Open has been the one Venus and Serena have had the most problems with in terms of winning it. Serena has 13 Grand Slam titles, but only has won on Roland Garros' clay courts once in her career in 2002, and she beat Big Sis to get it.
Little Sis was looking for her second French Open title while Venus has never won it.
They won't win it this year either because their inexplicable Roland Garros troubles continued in 2012.
Serena took a 46-0 career record in opening round Grand Slam tournament matches into this tournament and was 17-0 on clay this season nut but fifth seeded Little Sis shockingly lost to French homegirl Virginie Razzano 6-4, 6-7 (5-7), 3-6 Tuesday.
She was two points from victory several times in the second set, including leading 5-1 in the second set tiebreaker. But Razzano won six straight points to force a third set, and then took control of the match.
"I made so many errors today, which isn't the game I was playing in the past," Serena said. "That's life."
Venus had better luck, ousting her first round opponent but on Wednesday Big Sis was ousted by third-seeded Agnieszka Radwanska of Poland in straight sets 2-6, 3-6 in her first major tournament since the announcement she has Sjogren's Syndrome.
Despite the loss, Venus will qualify for the US women's Olympic tennis team is she is still one of the top four ranked US women by June 11, the end of this French Open and is sitting in the fourth spot now Serena is comfortably ensconced as the highest ranked US woman in the tennis world rankings, so her London spot is secured.
The next major before the 2012 Games is their favorite tournament.which will also be the tennis venue for the upcoming games in 'Williams'-don


Nirvana School is situated in Kottakuppam, near Pondicherry (a former French Colony) in the state of Tamil Nadu. It is located on the southeast coast of India on the Indian Ocean, just a short walk from the beach, in a peaceful, relatively pollution-free atmosphere.
We would love to hear from you with any feedback, comments, questions or suggestions. Our contact information is below.