text:
The Return of the Amazon Fund and Lula's Race to Cut Deforestation
By The Brazilian Report on January 19, 2023
Olaf Zerbock, USAID
Building BRIDGEs | Cross-Sectoral Approaches to Biodiversity Conservation: Health, Nutrition, and Ecosystem Services
The Wilson Center's Environmental Change & Security Program, in partnership with USAID's Biodiversity Results and Integrated Development Gains Enhanced (BRIDGE) project, held the first panel of a three-part virtual series featuring researchers and practitioners on lessons learned and entry points for action in the integration of biodiversity conservation, governance, public health, and food security.
9:30am – 11:00am ET
Global Risk and Resilience Program
Event Co-Sponsors
U.S. Agency for International Development
Our collective development objectives will not be achieved if they come at the expense of biodiversity and natural resource management, said Jeff Haeni, Acting Deputy Assistant Administrator in the Bureau for Economic Growth, Education, and Environment at USAID. He spoke at a recent Wilson Center virtual event, co-hosted with USAID, that explored the links between conservation and public health with examples from USAID's BRIDGE project, which aims to build the evidence base for integrating biodiversity conservation considerations into policy discussions and decision-making across sectors. "The ability of societies around the world to develop and thrive is dependent on the health of the forests, fisheries, and natural systems around them," he said.
Fisheries and Nutrition
An estimated 3 billion people depend on fish for a substantial part of their food security, said Barbara Best, former Senior Coastal Resource Management and Policy Specialist at USAID. "Fishing is one of the largest sources of nutritious food, and the largest extractive use of biodiversity," said Best. The most widely traded food worldwide, fish is a major source of high-quality protein and essential nutrients such as calcium, vitamin A, and vitamin D. It's also an important source of omega 3 fatty acid, which is essential for early brain development in children.
Yet 10 percent of the global population is at risk for malnutrition and micronutrient deficiencies due to the decline and poor management of wild fisheries, according to one study. Countries across West Africa are particularly vulnerable due to their high reliance on fisheries for nutrition and livelihoods. "As fish stocks decline, largely due to poor management, for millions of people living in the tropics, fish adds the missing micronutrients and proteins to what otherwise would be an unbalanced diet," said Best.
Misconceptions About Wild Caught Fisheries
Wild caught fisheries have often been overlooked in international dialogues and international food security programs, said Best. To learn why, she and colleagues interviewed people at USAID to understand why fisheries weren't on their radars. Many didn't think about wild caught fisheries at all, nor did they realize how important they could be. Others knew that fish catches were declining, but thought that nothing could be done to reverse the trend. Therefore, they assumed that fish farming was the only solution. Despite common misconceptions, we can reverse fish decline and improve the natural productivity of wild fisheries, allowing them to rebound, said Best.
To improve resiliency, she recommended engaging fishers in the management process through participatory co-management systems, securing tenure and access for small-scale fishers to fishing grounds, and reducing subsidies that can drive overfishing. Wild-caught fisheries and ecosystem services need to be better integrated into food systems and development programs. As Best put it, fishing and wild-caught fisheries are "just too big to ignore" for achieving global food security goals.
The Power of Forest Foods
Deforestation is often justified in terms of food security, usually for producing staple crops, said Amy Ickowitz, Team Leader of Sustainable Landscapes & Livelihoods at the Center for International Forestry Research. But forests themselves are important for food security, according to preliminary findings from her research in Zambia. Wild foods collected from nearby forests accounted for 68 percent of women's weekly fruit consumption, and over 25 percent of recommended daily intake of fruits per year, according to preliminary findings. The researchers weren't expecting forest foods to make such a big nutritional contribution, said Ickowitz. Without quantifying forest foods' contribution to food security, it's easy to dismiss such foods and not give them the attention they deserve, she said.
When forests are cleared to grow more maize and other staple crops, people lose access to the micronutrients found in fruits and wild foods. Although further research is needed, the evidence in studies like this helps organizations understand the need for cross-sector collaboration between forestry, food security, agricultural, conservation, and development programs.
Global Relationships
Building the evidence base on the local and regional levels can inform global efforts. By generalizing the smaller-scale relationships between nature and human health, progress can be made globally, said Taylor Ricketts, Gund Professor and Director of the Gund Institute for Environment at the University of Vermont. Ricketts demonstrated this by taking a look at a variety of health outcomes and how they relate to surrounding ecosystems. One study explored how watershed conditions affect downstream diarrheal disease among children in Mozambique. Deforestation undermines the development efforts of WASH (water, sanitation, and hygiene) programs, as risks are increased by greater human activity and less tree cover upstream. The reforestation of watersheds should be a significant complement to more traditional policy interventions, such as WASH.
Another project Ricketts highlighted showed how proximity to forests affects diet diversity in children. Households closer to forests had 16 percent more diverse diets than those further away, demonstrating the interconnectedness of nutrition, health, and forest conservation. It is clear that forests and conservation affect children's health, with rural and poor households most directly reliant on nature, said Ricketts. "Again and again, we find that rural and poor households depend more directly on nature than their converse," said Ricketts. "So there's an enormous equity issue here in terms of conserving nature for human health." As such, "nature investments can be public health investments."
While investing in forests should not replace traditional approaches to improving human health worldwide, said Ricketts, it's a great complement that shows the synergy among the conservation, health, and development sectors—which have often operated in separate silos. Projects that improve health and forests could advance not only poverty goals, but also health and nature goals all at once, he said. The SDGs (Sustainable Development Goals) are guiding global investments all over the world of development. "But it's absolutely clear that we won't succeed unless we find synergies in them," said Ricketts, "and advance many of them at once."
Written by Eliana Guterman, edited by Sandra Yin
Continue the conversation on Twitter at @NewSecurityBeat. You can find more coverage of these issues on our blog, NewSecurityBeat.org.
Food Security and Biodiversity Conservation Integration
Health and Biodiversity Conservation Integration
Barbara Best's Presentation | Fishing for Nutritious and Resilient Food Systems Download
Amy Ickowitz's Presentation | Quantifying the Direct Contributions of Forests to Diets in Zambia: sharing preliminary results from a CIFOR-FAO project Download
Taylor Rickett's Presentation | Linking biodiversity and children's health: Global relationshipsDownload
Conservation is Development Download
The Role of Wild-Caught Fisheries in African DevelopmentDownload
Facts about Wild-Caught Fisheries & African DevelopmentDownload
Improving diets with wild and cultivated biodiversity from across the landscapeDownload
events in this series
at 1:00 – 2:30 ET
Building BRIDGEs | Cross-Sectoral Approaches to Biodiversity Conservation: Governance, Natural Resource Management, and "Thinking and Working Politically"
at 9:30 – 11:00 ET
Building BRIDGEs | Cross-Sectoral Collaboration for Stronger Conservation and Development Outcomes
Barbara Best
former Senior Coastal Resource Management and Policy Specialist, U.S. Agency for International Development
Amy Ickowitz
Team Leader, Sustainable Landscapes & Livelihoods, Center for International Forestry Research
Taylor Ricketts
Gund Professor & Director, Gund Institute for Environment, University of Vermont
Jeff Haeni
Acting Deputy Assistant Administrator, Bureau for Economic Growth, Education and Environment, U.S. Agency for International Development
Shawn Baker
Chief Nutritionist, U.S. Agency for International Development
The Environmental Change and Security Program (ECSP) explores the connections between environmental change, health, and population dynamics and their links to conflict, human insecurity, and foreign policy. Read more
The Global Risk and Resilience Program (GRRP) seeks to support the development of inclusive, resilient networks in local communities facing global change. By providing a platform for sharing lessons, mapping knowledge, and linking people and ideas, GRRP and its affiliated programs empower policymakers, practitioners, and community members to participate in the global dialogue on sustainability and resilience. Empowered communities are better able to develop flexible, diverse, and equitable networks of resilience that can improve their health, preserve their natural resources, and build peace between people in a changing world. Read more
Thank you for your interest in this event. Please send any feedback or questions to our Events staff.
Peafowls Halt Dam: A One-off or One Step Forward for China's Environmental Public Interest Law?
Wildlife Trade
The Latin America-to-Asia Wildlife Trade
By Sharon Guynup
Wilson Center Launches Latin America Marine Protection Partnership with the State Department
How October's Presidential Race Will Impact the Brazilian Amazon
Tackling Scarcity and Building Security: A Response to IUU Fishing
UN Meeting Sets Sights on Global Plastics Treaty
Have Wetlands Will Travel: Migratory Birds Benefit from Habitat Conservation in China
Relatório Final: Diálogo Brasil-EUA sobre Sustentabilidade e Mudanças Climáticas
Final Report: Brazil-U.S. Dialogue on Sustainability and Climate Change
End of the Line at the End of the World
By Gabriella Farrell on January 14, 2022
Argentina's Tierra del Fuego Bans Salmon Farming


text:
Best anabolic steroids to take, best anabolic steroids for cutting
👉 Best anabolic steroids to take, best anabolic steroids for cutting - Buy legal anabolic steroids
Best anabolic steroids to take
Best anabolic steroids to take The dose-response relationships of anabolic actions vs the potentially serious risk to health of androgenic-anabolic steroids (aas) use are still unresolved. The evidence that anabolic steroids affect bone, however, is very strong. This is important evidence because studies involving large-scale epidemiologic research such as those involving adults are typically large in comparison with studies involving smaller-scale retrospective investigations, take steroids to best anabolic. The effect of anabolic-androgenic steroids on bone growth and fracture risk is well-documented (see for an overview) because bone mineral density has increased significantly since the use of anabolic-androgenic steroids began to be marketed in the US in the 1950s. As a result of the recent increases in the prevalence of bone disease, more research is needed on the effects of long-term anabolic-androgenic steroid use on the health of older men and women, best anabolic supplements 2022. While skeletal changes due to long-term anabolic-androgenic steroid use typically appear within 10 years of use, we recently found that these effects may continue for decades, best anabolic steroids to take. In the same manner studies have shown that steroid use is associated with an increased incidence of osteoporosis (see below), there is increasing evidence that anabolic-androgenic steroid abuse, regardless of severity. Osteoporosis Bone density and osteocalcin levels in older men are greater than those of younger men, possibly due in part to bone mineralization. This pattern is similar to that seen in women, best anabolic supplements 2022. To determine the extent to which bone mineralization and osteoporosis are related, researchers compare bone mineral density (BMD) at an earlier age with those achieved in older men, anabolic steroids pills. To date, these studies indicate no significant correlation between BMD and years of anabolic steroid use. The most common osteoporotic fractures are the hip (about 14%), lumbar spine (about 4%), and elbow (about 5%), best anabolic steroids supplier. Some of the most commonly reported anabolic-androgenic steroid abusers are women (16%), and the most common treatment for osteoporosis in women is hip replacement (30%). Most women also have mild to moderate osteoporosis. The exact cause of early osteoporosis is not fully understood, but it appears to include a number of factors, including obesity, estrogen hormone (estrogen), and certain substances (bisphenol A, nordihydrotestosterone [NT] and dehydroepiandrosterone [DHEA]), best anabolic supplements 2022. However, bone mineral density is only a marker for the onset of osteoporosis and does not predict which men have osteoporosis. What should you know about osteoporosis in older men, best anabolic steroids on the market?
Anabolic steroid powder for sale, best steroids for bodybuilding
Anabolic steroids effects on brain, best steroid cycle for lean mass and cutting
Animal cuts pills reviews, hypogonadotropic hypogonadism anabolic steroids
Deliverables - Notes: Forum
©2021 by Simon Family Investment Ventures. Proudly created with Wix.com

redpajama_set_name: RedPajamaCommonCrawl


text:
package nodescala

import scala.language.postfixOps
import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global
import scala.async.Async.{async, await}

object Main {

  def main(args: Array[String]) {
    // TO IMPLEMENT
    // 1. instantiate the server at 8191, relative path "/test",
    //    and have the response return headers of the request
    val myServer = new NodeScala.Default(8191)
    val myServerSubscription = myServer.start("/test") {
      req => (for ((k, v) <- req) yield (k + " -> " + v)).iterator
    }

    // TO IMPLEMENT
    // 2. create a future that expects some user input `x`
    //    and continues with a `"You entered... " + x` message
    val userInterrupted: Future[String] = Future.userInput("Type something ..") continueWith { x => "You entered... %s".format(x.value.get.get) }

    userInterrupted onSuccess {
      case x => println(x)
    }

    // TO IMPLEMENT
    // 3. create a future that completes after 20 seconds
    //    and continues with a `"Server timeout!"` message
    val timeOut: Future[String] = Future.delay(20 seconds) continueWith { _ => "Server timeout!"}

    timeOut onSuccess {
      case x => println(x)
    }

    // TO IMPLEMENT
    // 4. create a future that completes when either 20 seconds elapse
    //    or the user enters some text and presses ENTER
    val terminationRequested: Future[String] = Future.any(List(timeOut, userInterrupted))

    // TO IMPLEMENT
    // 5. unsubscribe from the server
    terminationRequested onSuccess {
      case msg => myServerSubscription.unsubscribe
    }
  }
}

redpajama_set_name: RedPajamaGithub


text:
Look Into My Eyes. Not Persuaded? You're Not Alone. : Shots - Health News People are told that if you want to get a point across, look your audience straight in the eyes. But that works only if the person already agrees with you, a study finds. When people don't share the speaker's opinion, looking them in the eye may actually make them less likely to change their minds.
Health News From NPR
Treatments & Tests
Health Inc.
Policy-ish
Why Eye Contact Can Fail To Win People Over
October 2, 20132:07 PM ET
Nancy Shute
Eye contact may prove persuasive only if a person's already on your side, a study finds. iStockphoto.com hide caption
Pop psychology holds that to connect with someone, you should look deep into their eyes. The more you look, the more persuasive you'll be. But that may work only when your audience already agrees with you.
Researchers in Germany tested the power of the eye lock by polling university students about their opinions on controversial issues like assisted suicide, nuclear energy and affirmative action in the workplace.
They then had the students watch two-minute Internet videos of people expounding on the controversies. Eye-tracking machinery was used to measure where the students looked.
The students spent more time looking into the eyes of the speakers when they agreed with their point of view, and avoided eye contact when they disagreed or were neutral. "Persuaders may misattribute returned gaze to their persuasion skills," the researchers concluded.
The students were also less likely to change their opinions, as measured in a second poll, when they looked directly in the speakers' eyes. This was particularly true when the person in the video looked directly at viewers, rather than to the side of the frame.
Interesting, sure, but this was a small study with just 20 students. And there could be other factors other than eye gaze at play. Maybe they just didn't like the speakers' looks.
To try to reduce those factors, the researchers did a second experiment with scripted videos they recorded. They made sure the 42 students saw videos expressing opinions they disagreed with. And the participants were asked to focus either on the speakers' eyes or speakers' mouths.
Spotting Lies: Listen, Don't Look
The students who looked at the speakers' eyes changed their attitudes less than the people who looked at the speakers' mouths. They also said they were less interested in hearing more about the views presented.
"Eye contact is clearly used in many situations to signal attraction, love and even agreement," Frances Chen, an assistant professor at the University of British Columbia and lead author of the study, told Shots.
But forcing someone to look into your eyes could backfire if you're trying to change their opinion, Chen says. "Think about parents saying, 'Look at me when I'm talking to you!' "
The study was published online in Psychological Science.
This conclusion probably doesn't come as a huge surprise to anyone who has a dog. There's abundant research showing that animals interpret a direct eye gaze as dominance or aggression.
No less an authority than TV dog whisperer Cesar Millan preaches "no touch, no talk, no eye contact" as the way to get a misbehaving dog to calm down.
And when it comes to humans, what parent hasn't watched a child shift their eyes away when they're being cornered about chores undone?
It might be helpful to think about a listener's emotional state, Chen says, before going for the eye lock. That averted gaze may be more powerful than that "persuasive" stare. "If they're already avoiding eye contact with you, especially if you're saying something potentially threatening to them, maybe think twice before insisting that they make eye contact with you."


Our spectacular Mosaic Sculpture Garden has been awarded 6 Stars in the 2018 Garden of International Significance.
Surprises everywhere in this glorious garden - mosaiced steps, an extraordinary sculptural wall mosaic, welded steel sculptures and other creations. Colourful gardens of roses vegetables, citrus, flowers. Very unique. Download this PDF for more information and the story behind The Giants House.
The 'Artist Palate' Cafe is open 26 Dec - 30 April.


text:
How Tex Winter Has Influenced the Golden State Warriors
Tex Winter helped Michael Jordan and Kobe Bryant win NBA titles. Now, the 93-year-old coach's Triangle offense and passion for fundamentals are helping Golden State in the NBA Finals.
by Roland Lazenby
Jun 14 2015, 12:15pm
Photo by Kyle Terada-USA TODAY Sports
The 93-year-old coach sits in front of the television in his favorite chair at his home in Kansas, munching popcorn with his gaze fixed on every little element of the action.
His speech remains severely limited, due to the effects of a stroke suffered six years ago. But make no mistake, Tex Winter is having an impact on the National Basketball Association Finals, just as he has on every practice the Golden State Warriors have conducted over their remarkable season.
The influence is felt through head coach Steve Kerr and assistant Luke Walton, both unabashed Winter disciples.
"Tex, he was huge on the fundamentals of the game, the basic plays, things that are very important to our team's success," Walton explained after a practice during the Finals. "Obviously, we play a flashy brand of basketball, but we work on Tex's basic drills. Steve and I get these guys to do them every single day in practice."
READ MORE: Could LeBron James Coach The Cleveland Cavaliers, Too?
Known for his triangle offense that the Chicago Bulls and Los Angeles Lakers used under head coach Phil Jackson to win 11 championships between 1991 and 2010, Winter was a master at teaching footwork, among other fundamentals—something a line of stars, from Michael Jordan and Scottie Pippen to Kobe Bryant, have credited with bringing a key edge to their games.
The Bulls were known for opening practices with an intense session of basic passing drills and footwork, which observers often found both incredulous and fascinating. Not long after their Dream Team experience in 1992, Pippen famously told Jordan to just imagine how great immensely gifted Olympic teammate Clyde Drexler would have been if he had ever worked with Tex on the fundamentals.
For years, Winter complained that Jordan—the best basketball player on the planet—never really learned to throw a proper chest pass, a claim that irritated Jordan to no end.
"We definitely try our best to get these guys to use Tex's two handed chest pass, even though our guys prefer the behind the back," Walton said with a smile.
Beyond teaching Winter's fundamentals, the Warriors coaches subscribe to the principles that guided his Hall of Fame coaching career—principles that have helped the Warriors overcome challenges in key moments of their hard-fought series with Cleveland.
Asked during the Finals if he was channeling Winter, Kerr smiled and replied, "Well, anytime I can channel Tex Winter, I'm going to do that. I learned so much basketball from him, and those were great years in Chicago. We don't run the triangle, but we do have some concepts of the triangle within what we do."
"We definitely try to get Tex's philosophy of the game into our guys' minds as much as possible," Walton said. "We're not running the triangle here, but we use the same idea."
That was evident in Game 1, when the Warriors resorted to back cuts to counter Cleveland's over-playing perimeter defense. It's a very basic play, but it was textbook Winter, and it earned the Warriors six easy baskets that helped them win a tight game that went to overtime.
Winter had backcuts built into the "automatics" in his triangle offense. The Warriors don't have "automatics" per se in their offense, Walton explained. It's not that sophisticated yet. But they have a culture where awareness of such opportunities is emphasized.
"We'll watch film," Walton said, "and we'll see that what they call the back door step will be wide open. That's not part of the basics of what we try to do. But we'll tell our guys to do a back cut every time they're overplayed. 'Just use the pressure against them.'
"What was great about Tex with the triangle offense was, if the defense would work hard to take something away from you, then something else has to be open. We work from the same idea. If you want to take away our three-point shooters, we have other people on other areas of the court who will be open. We're not using the automatics, but I think we'll get better at that the longer we go. As we get more time with our guys those things will become part of what we're trying to do."
Facing a 2-1 deficit going into Game 4 of the series, Kerr came out with a small lineup and spread the floor to open up the Warriors' offense and momentarily confuse the Cavs' defense, another Winter trademark. Winter's playoff plans were filled with surprises for opponents, and that element helped Golden State earn a key win in Cleveland and even the series.
Heading into this season, Walton said, Kerr and his staff looked at running Winter's triangle offense—which can take time to learn and requires players to master what amounts to an entirely different philosophy of basketball.
Instead, the Warriors opted to run "that San Antonio Weak and Strong type of natural flow in our offense," which came from Kerr's experience playing for the Spurs and coach Gregg Popovich.
"This team was a very good team when we took over, so we wanted to take what they were already doing great and just add to that," Walton said. "We didn't want to come in and try to change everything about it."
That said, Winter's fingerprints are still evident. Case in point? The triangle seeks to create an unbalanced floor by "filling the corner" with an excellent three-point shooter who attracts defensive attention and gives masterful players like Bryant or Jordan room to work on the weak side.
"We fill the corner," Walton said, explaining what Golden State runs out of the triangle on occasion. "We run the corner series that was part of the triangle... There are a lot of principles and ideals from the triangle that are similar to what we do."
Walton also hinted that given more time with this Warriors roster, the coaches will attempt to include more triangle down the road.
"We'll get better on that as the years go on," Walton explained. "That's the layers of what we're trying to get to. As a first-year staff, we're just trying to get the basics down."
They're also keenly aware that Winter is probably watching back home in Manhattan, Kansas, where he and wife Nancy live with their son Brian and his wife. As a college coach, Winter enjoyed great success at Kansas State, and he still receives regular visits from his former players.
"Tex spends most of his waking moments sitting in his favorite chair watching NBA TV," explained his nephew, Norm Winter. "Unfortunately his ability to talk has not improved and he can only string a few repetitive words together in conversation. However, he seems to understand what is being said to him."
Winter provided Kerr special access to his coaching library and his philosophy when Kerr was with the Bulls, Norm Winter says, adding that Tex's wife Nancy "once said that Kerr was the one player who reminded her the most of how a youthful Tex played on the court."
At Winter's Hall of Fame induction in 2011, Norm Winter jokingly asked Kerr, "Aren't you the young Tex Winter?"
"Kerr smiled and laughed," Norm Winter said, "but I know he took it as sincere compliment."
If some more of Tex's tricks can help the Warriors win their first championship in 40 years, that Kerr smile—and his connection to Winter—will grow even broader.
steve kerr
triangle offense
tex winter


text:
Матриксная металлопротеиназа 2 (MMP2, MMP-2; желатиназа A) - одна из протеиназ внеклеточного матрикса человека, кодируемая геном MMP2 на 16-й хромосоме.

MMP2 специфически активна в отношении коллагена IV, основного компонента базальных мембран.

Клиническое значение
Мутации гена MMP2 ассоциированы с синдромом Торга-Винчестера (OMIM 259600).

Повышенный уровень MMP2 отмечен в некоторых, но не всех, исследованиях роговицы при кератоконусе. При этом заболевании предполагается наличие дисбаланса матриксных металлопротеиназ с их ингибиторами. В частности, кератоциты стромы больных кератоконусом в одном исследовании демонстрировали повышенную секрецию MMP2 без соответствующего повышения TIMP.

Белковые взаимодействия
Описана способность MMP2 взаимодействовать с THBS2, TIMP2, тромбоспондином 1, CCL7 и TIMP4.

См. также
 MMP9, «желатиназа B»

Примечания

КФ 3.4.24

redpajama_set_name: RedPajamaWikipedia


text:
package org.wso2.carbon.security.util;

import org.apache.ws.security.WSPasswordCallback;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;

/**
 * This is to be used as the PASSWORD_CALLBACK_REF for a single unique client
 */
public class ClientUserPasswordCallbackHandler implements CallbackHandler {

    private String password;

    public ClientUserPasswordCallbackHandler(String password) {
        this.password = password;
    }

    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for (int i = 0; i < callbacks.length; i++) {
            if (callbacks[i] instanceof WSPasswordCallback) {
                WSPasswordCallback passwordCallback = (WSPasswordCallback) callbacks[i];
                passwordCallback.setPassword(this.password);
            } else {
                throw new UnsupportedCallbackException(callbacks[i],
                        "Unrecognized Callback");
            }
        }
    }

}


In a July 18 story about the continued practice of using fraudulent signatures on mortgage documents, called robo-signing, The Associated Press, relying on information from the Essex County registrar of deeds in Salem, Mass., erroneously reported that since Oct. 1, 2010, the office received 1,300 documents all robo-signed with the name Linda Green. That office now says none of these documents had Green's signature but instead carried signatures of other known robo-signers. Green worked for DocX, a mortgage paperwork processing company that shut down in May 2010, four months before the robo-signing scandal came to light.


The contact flows in Amazon Connect can be used to create dynamic Interactive Voice Response (IVR) solutions. With Amazon Connect, organizations can gather appropriate personal information to customize the customer experience when they interact with their IVR. The personal information can include social security numbers, credit card information, and addresses. Because of compliance reasons, sensitive personal information must be encrypted in motion and when stored. Always encrypt personal information.
This blog post shows you how customers can use the Store customer input block in Amazon Connect to gather sensitive personal information, and automatically encrypt the data by using the customer's own supplied encryption keys. This feature allows the customer to comply with encryption requirements.
To achieve this, Amazon Connect uses the AWS Encryption Software Development KIT (SDK) to encrypt customer provided data. The SDK uses an envelope encryption approach. This protects both the raw data and the data keys used to encrypt them. For more information about how the AWS Encryption SDK works, see Envelope Encryption.
Configure Amazon Connect to collect a credit card number.
Encrypt the credit card digits.
Send it to our backend AWS Lambda for decryption, using the customer supplied decryption key.
Create new encryption and decryption keys, or import existing ones.
Upload our public key to Amazon Connect to encrypt collected credit card digits.
Create the contact flow described in the previous section.
To implement the secure IVR, make sure that AWS Command Line Interface (AWS CLI) is installed, configured and pointed to the same region as your Amazon Connect instance. To verify that you can run "aws configure" from your Terminal window and verify that your default region name parameter has the correct value.
The Amazon Connect customer input encryption feature is designed to use the organization's supplied public key to encrypt data. This allows the organization to use its private key to decrypt the data for further processing. Using a private key known only to the organization helps preserve the privacy that an organization requires. An organization can use either an existing key pair or create a new one. When the key information is available, the process remains the same.
If you are using your existing keys for this exercise, skip to step 2 of this section.
We will be leveraging OpenSSL for this step. If you are using a macOS computer, OpenSSL should already be installed. For information about installing OpenSSL, see this OpenSSL site.
When you run the following command, you are providing the usual necessary certificate request information; such as, country/region name, organization name, etc.
Notice that we created a certificate valid for 2 years (730 days). It is important to remember that the certificate's expiration date monitoring remains the responsibility of the organization.
Next, we extract the public key from the certificate file using the OpenSSL utility. The next command generates a file named blog.connect.public.key, which contains the encryption key that we need to upload to Amazon Connect.
We now have three files to use for the next steps.
This step helps to make sure that our decryption is stored securely. Moreover, the decryption is stored with traceability and access rights management using the power of IAM. By using this approach, we can manage the access to our private key by selectively granting access to processes and users. Also, it lets the system log every access of the private key for audit purposes.
The following command securely uploads our private key to the AWS Systems Manager Parameter Store. This saves the key to a parameter named CONNECT_INPUT_DECRYPTION_KEY. We can use that parameter to securely retrieve our private key from AWS Lambda at runtime.
$ aws ssm put-parameter --type SecureString --name CONNECT_INPUT_DECRYPTION_KEY --description "Private key for decryption of Amazon Connect collected data" --value "$(<blog.connect.private.key)"
To run the previous command, you must be an AWS user with access to AWS Systems Manager and the permissions to create parameters. Work with your AWS SysOps team to verify proper access.
The command uses the default key alias/aws/ssm to encrypt your private key. If you prefer to use a different AWS KMS key for this, you could do so by adding the –key-id option to this command.
After you complete this step, you can then go to the Parameter Store in the AWS Systems Manager console. There, you should see the newly created parameter for your private key as shown in the following screenshot. If you do not see the key, it is most like a permissions issue which can be fixed by reviewing the output on your terminal window.
In this step, we use AWS CloudFormation to automatically create the IAM role and the AWS Lambda function. The function is used to perform the decryption of the credit card number.
Confirm that the AWS Region selected has the Amazon Connect service available.
On the AWS CloudFormation page, modify the stack name if you prefer a different one. You can keep the other options as default.
Because this template uses transforms to take advantage of the AWS Serverless Application Model (AWS SAM), choose Create Change Set (shown in the following screenshot) to perform the necessary declaration changes.
When this procedure is completed, the output should print the value for your AWS Lambda resource name (ARN). Copy the ARN and save it for the next step.
In the Amazon Connect console, choose Contact Flows and scroll to the bottom of the page in the AWS Lambda section.
Step 4: Upload our public key to Amazon Connect.
In this step, we upload our encryption key, so Amazon Connect knows to use it when we want to encrypt customer input.
Open your instance, and in the left pane, choose Contact Flows.
Choose Add Key, and paste the content of your public key file blog.connect.public.key. You can use any text editor to open the file and copy its content.
Choose Add to save the public key, as shown in the following example. You now have a key ID generated for your public key. Copy it and save it in the next step.
Step 5: Create a contact flow to collect digits and encrypt them.
In this step, download the contact flow we will use from this location. Save it to a file. We Following the steps below, you will import your saved file and modify it so that Amazon Connect knows which key we use to encrypt the credit card number.
Click on Overview, then choose Login as administrator.
On the Routing menu on the left side, choose Contact Flows to show the list of contact flows.
Click on Create Contact flow.
From the drop-down menu next to the Save button on the right side, as shown in the following screenshot, choose Import flow. This loads the flow that was downloaded at the beginning of this step.
Next, let's point our contact flow's Invoke AWS Lambda function block to our DecryptCustomerInput To do so, update the Function ARN field with the value returned from the CloudFormation stack. You can use the following screenshot example as a guide.
Save and publish the contact flow, as we are done with all changes.
Attach the contact flow to your test phone number, as shown in the following example. For more information about setting up a phone number, see Claiming Phone Numbers.
Dial the test phone number to go through the flow. After the call is completed, check the Amazon CloudWatch Logs to confirm the digits that we entered are encrypted and passed to our AWS Lambda function for decryption.
To confirm that the decryption works as expected, we also log the deciphered text. However, avoid doing this in a production environment to ensure that sensitive data is not leaked through the log files.
The following extracts show the information that is stored in both the Contact Flow logs and the AWS Lambda function logs.
In this case, the entered digits were 4444444444444444.
In this post we covered how you can use Amazon Connect's Encryption feature to collect digits from a caller and encrypt them using your own supplied key pair. We have also covered how you can use AWS Systems Managers to securely store your decryption key.
With this, you can now build a secured IVR using Amazon Connect.
Please let us know what you built with this.


Tottenham Hotspur's status as Premier League title chasers was seriously harmed on Saturday as they fell to a first defeat in seven league games, losing the lead to go down 3-1 at home to Wolves.
Harry Kane fired a largely unimpressive Spurs side in front midway through the first half, picking the ball up from deep out wide, cutting inside and finding the top corner from outside the area with a sumptuous strike on his weaker left foot.
The goal was Kane's fourth in three league games but was not enough to see off the dogged visitors, who have taken points off some of the biggest teams such as Manchester City, Arsenal, Chelsea and Manchester United in their return to the top flight.
Nuno Espirito Santo's side levelled in the 72nd minute with a towering header from a corner from French defender Willy Boly after a period of sustained pressure around Tottenham's area.
Mexican forward Raul Jimenez then gave them the lead in the 83rd minute on the break, squeezing a perfectly struck shot under the diving Hugo Lloris and into the bottom corner. Helder Costa sealed the win with another counter-attack goal in the 87th.
A first home defeat since late October leaves second-placed Tottenham six points adrift of Liverpool, who can widen that gap when they host Arsenal later on Saturday. Manchester City could move second if they win at Southampton on Sunday.
Spurs boss Mauricio Pochettino criticised his side for easing off in the second half and assuming they had the victory wrapped up.
"In the second half we decided that the game was over and when you start to think that you run into problems," he said in a news conference. "We dominated possession in the first half then we missed that freshness to kill the game, instead we tried to manage it at 1-0.
"We know from experience that if you aren't at 100 percent in every game this can happen, it's not enough to play well for 60 or 70 minutes, you have to do it for 90."
Wolves coach Nuno said he would have been happy to settle for a draw but praised his side for their hunger in searching for the win.
"We had a lot of belief after the equaliser, I would have said a draw was a good result, but I cannot control the emotions of the boys if they see space in front of them," he said.
"It is good for the dressing room but to play like this at Wembley, the home of football, is the big thing."


Newfoundland and Labrador has experienced unprecedented growth in recent years, driven largely by oil and gas, mining, and energy projects in the provincial hinterland and in other parts of Canada, particularly Alberta. Communities across the province have benefited from this growth, but have also been faced with associated challenges. These include changes in communities linked to increases in mobile workers (also known as employment-related geographical mobility or E-RGM) and rising wages. One of the sectors that has been most impacted is housing. Housing is a cross-cutting theme arising in ongoing research about the consequences of and for the mobile workforce in our province.
On April 26, 2016 On the Move Partnership along with its partners, the Canadian Home Builders' Association-Newfoundland and Labrador (CHBA-NL), Canada Mortgage and Housing Corporation (CMHC), Municipalities NL (MNL), the Harris Centre of Memorial University held a forum on housing and the Mobile Workforce in Newfoundland and Labrador. The objective was to discuss housing-related pressures for communities in the context of high job-related mobility as well as the impacts of the economic downturn on housing and labour markets. The purpose was also to encourage discussion on housing issues related to the province's mobile workforce, to establish a portrait of ongoing projects and potential future research, and to gather input on research that is already underway in NL. Implications for the housing industry and communities that plan for housing developments and related services were furthermore explored. The forum brought together housing researchers, industry representatives, policy makers and community partners and will include presentations, panel and group discussions and networking opportunities. Some policies and actions with potential to address issues raised were identified.
The forum was divided into 3 themes: 1) Housing market trends: construction, real estate, rentals and renovations; 2) Affordable housing and housing affordability for mobile workers and in communities affected by employment-related mobility; and 3) Community experiences, implications for planning and policy. Following the third theme presentations, a wrap-up panel was organized to allow for discussing key take-away messages from the day as well as potential recommendations, or next steps, for researchers, policy makers, community members and industry partners.


I fear this part, the letting go. I know my children are good, I know they understand right from wrong, I know they want to do their best, I know it is time to let go. I just hate the thought of it.
I have spent my time as a parent preparing my children for an independent life. I have taught skills, spoken of life with all its complications. I have explained the good and the bad. They understand life is a hot soup, to be tasted with caution, enjoyed to the last scrape.
I am not sure what it is I fear, broken heart, broken limbs, broken mind. These things can be mended.


text:
IGU Commission for Water Sustainability
Former Commission Vice-chair receives major award
Former Vice-chair of the Commission, Professor Emeritus Ming-ko (Hok) Woo, is the 2008 recipient of the Canadian Geophysical Union's prestigious J. Tuzo Wilson Medal. Professor Woo is only the second hydrologist to win this award.
Hok has bridged three main areas of hydrology: the hydrology of cold regions, the hydrology of wetland ecosystems, and stochastic and statistical hydrology. In addition, he has made a significant contribution in applying hydrology and fluvial geomorphology in developing areas of the world such as Nigeria and China.
His research has focused on understanding the principles of catchment, hillslope and wetland hydrology as well as assessing changes in hydrological systems by environmental stressors such as climate variability and human modification to the landscape. Throughout his career, he has combined empirical, experimental and observational studies with both deterministic and stochastic modelling.
His research and leadership have inspired generations of geoscientists in various universities and governments in Canada.
Woo is known first and foremost for his contributions to cold region hydrology. Much of his research took place near Resolute, NWT where a river now officially bears the name McMaster River. More recently, he was the program leader of the MAGS project, which consisted of a Canadian team of more than 80 scientists and engineers in the fields of atmospheric, earth and hydrologic sciences who studied how climate change and variability affects ice and snow dynamics and water resources in the Mackenzie River Basin.
The Canadian Geophysical Union has also honoured him by creating an annual lecture series in hydrology and his alma mater, McMaster University, is honouring him by introducing the Woo Water Lecture Series from autumn 2008.
Professor Woo was Vice-chair of the IGU Commission and the preceding Study Group from 1998 to 2007. He remains a very active member of the Steering Committee.
North-West University, Vaal Triangle Campus
P.O.Box 1174, Vanderbijlpark, 1900, South Africa
Tel: +27 (0) 16 910 3477 | Fax: +27 (0) 866 235 381 | Cell: +27 (0) 72 405 9561 | Skype: frank.winde | E-Mail: frank.winde@nwu.ac.za


text:
from ..Qt import QtCore, QtGui, USE_PYSIDE
from .Node import *
from ..pgcollections import OrderedDict
from ..widgets.TreeWidget import *
from .. import FileDialog, DataTreeWidget

## pyside and pyqt use incompatible ui files.
if USE_PYSIDE:
    from . import FlowchartTemplate_pyside as FlowchartTemplate
    from . import FlowchartCtrlTemplate_pyside as FlowchartCtrlTemplate
else:
    from . import FlowchartTemplate_pyqt as FlowchartTemplate
    from . import FlowchartCtrlTemplate_pyqt as FlowchartCtrlTemplate

from .Terminal import Terminal
from numpy import ndarray
from .library import LIBRARY
from ..debug import printExc
from .. import configfile as configfile
from .. import dockarea as dockarea
from . import FlowchartGraphicsView

def strDict(d):
    return dict([(str(k), v) for k, v in d.items()])

def toposort(deps, nodes=None, seen=None, stack=None, depth=0):
    """Topological sort. Arguments are:
      deps    dictionary describing dependencies where a:[b,c] means "a depends on b and c"
      nodes   optional, specifies list of starting nodes (these should be the nodes
              which are not depended on by any other nodes)
    """

    if nodes is None:
        ## run through deps to find nodes that are not depended upon
        rem = set()
        for dep in deps.values():
            rem |= set(dep)
        nodes = set(deps.keys()) - rem
    if seen is None:
        seen = set()
        stack = []
    sorted = []
    #print "  "*depth, "Starting from", nodes
    for n in nodes:
        if n in stack:
            raise Exception("Cyclic dependency detected", stack + [n])
        if n in seen:
            continue
        seen.add(n)
        #print "  "*depth, "  descending into", n, deps[n]
        sorted.extend( toposort(deps, deps[n], seen, stack+[n], depth=depth+1))
        #print "  "*depth, "  Added", n
        sorted.append(n)
        #print "  "*depth, "  ", sorted
    return sorted

class Flowchart(Node):
    sigFileLoaded = QtCore.Signal(object)
    sigFileSaved = QtCore.Signal(object)

    #sigOutputChanged = QtCore.Signal() ## inherited from Node
    sigChartLoaded = QtCore.Signal()
    sigStateChanged = QtCore.Signal()  # called when output is expected to have changed
    sigChartChanged = QtCore.Signal(object, object, object) # called when nodes are added, removed, or renamed.
                                                            # (self, action, node)

    def __init__(self, terminals=None, name=None, filePath=None, library=None):
        self.library = library or LIBRARY
        if name is None:
            name = "Flowchart"
        if terminals is None:
            terminals = {}
        self.filePath = filePath
        Node.__init__(self, name, allowAddInput=True, allowAddOutput=True)  ## create node without terminals; we'll add these later

        self.inputWasSet = False  ## flag allows detection of changes in the absence of input change.
        self._nodes = {}
        self.nextZVal = 10
        #self.connects = []
        #self._chartGraphicsItem = FlowchartGraphicsItem(self)
        self._widget = None
        self._scene = None
        self.processing = False ## flag that prevents recursive node updates

        self.widget()

        self.inputNode = Node('Input', allowRemove=False, allowAddOutput=True)
        self.outputNode = Node('Output', allowRemove=False, allowAddInput=True)
        self.addNode(self.inputNode, 'Input', [-150, 0])
        self.addNode(self.outputNode, 'Output', [300, 0])

        self.outputNode.sigOutputChanged.connect(self.outputChanged)
        self.outputNode.sigTerminalRenamed.connect(self.internalTerminalRenamed)
        self.inputNode.sigTerminalRenamed.connect(self.internalTerminalRenamed)
        self.outputNode.sigTerminalRemoved.connect(self.internalTerminalRemoved)
        self.inputNode.sigTerminalRemoved.connect(self.internalTerminalRemoved)
        self.outputNode.sigTerminalAdded.connect(self.internalTerminalAdded)
        self.inputNode.sigTerminalAdded.connect(self.internalTerminalAdded)

        self.viewBox.autoRange(padding = 0.04)

        for name, opts in terminals.items():
            self.addTerminal(name, **opts)

    def setLibrary(self, lib):
        self.library = lib
        self.widget().chartWidget.buildMenu()

    def setInput(self, **args):
        """Set the input values of the flowchart. This will automatically propagate
        the new values throughout the flowchart, (possibly) causing the output to change.
        """
        #print "setInput", args
        #Node.setInput(self, **args)
        #print "  ....."
        self.inputWasSet = True
        self.inputNode.setOutput(**args)

    def outputChanged(self):
        ## called when output of internal node has changed
        vals = self.outputNode.inputValues()
        self.widget().outputChanged(vals)
        self.setOutput(**vals)
        #self.sigOutputChanged.emit(self)

    def output(self):
        """Return a dict of the values on the Flowchart's output terminals.
        """
        return self.outputNode.inputValues()

    def nodes(self):
        return self._nodes

    def addTerminal(self, name, **opts):
        term = Node.addTerminal(self, name, **opts)
        name = term.name()
        if opts['io'] == 'in':  ## inputs to the flowchart become outputs on the input node
            opts['io'] = 'out'
            opts['multi'] = False
            self.inputNode.sigTerminalAdded.disconnect(self.internalTerminalAdded)
            try:
                term2 = self.inputNode.addTerminal(name, **opts)
            finally:
                self.inputNode.sigTerminalAdded.connect(self.internalTerminalAdded)

        else:
            opts['io'] = 'in'
            #opts['multi'] = False
            self.outputNode.sigTerminalAdded.disconnect(self.internalTerminalAdded)
            try:
                term2 = self.outputNode.addTerminal(name, **opts)
            finally:
                self.outputNode.sigTerminalAdded.connect(self.internalTerminalAdded)
        return term

    def removeTerminal(self, name):
        #print "remove:", name
        term = self[name]
        inTerm = self.internalTerminal(term)
        Node.removeTerminal(self, name)
        inTerm.node().removeTerminal(inTerm.name())

    def internalTerminalRenamed(self, term, oldName):
        self[oldName].rename(term.name())

    def internalTerminalAdded(self, node, term):
        if term._io == 'in':
            io = 'out'
        else:
            io = 'in'
        Node.addTerminal(self, term.name(), io=io, renamable=term.isRenamable(), removable=term.isRemovable(), multiable=term.isMultiable())

    def internalTerminalRemoved(self, node, term):
        try:
            Node.removeTerminal(self, term.name())
        except KeyError:
            pass

    def terminalRenamed(self, term, oldName):
        newName = term.name()
        #print "flowchart rename", newName, oldName
        #print self.terminals
        Node.terminalRenamed(self, self[oldName], oldName)
        #print self.terminals
        for n in [self.inputNode, self.outputNode]:
            if oldName in n.terminals:
                n[oldName].rename(newName)

    def createNode(self, nodeType, name=None, pos=None):
        if name is None:
            n = 0
            while True:
                name = "%s.%d" % (nodeType, n)
                if name not in self._nodes:
                    break
                n += 1

        node = self.library.getNodeType(nodeType)(name)
        self.addNode(node, name, pos)
        return node

    def addNode(self, node, name, pos=None):
        if pos is None:
            pos = [0, 0]
        if type(pos) in [QtCore.QPoint, QtCore.QPointF]:
            pos = [pos.x(), pos.y()]
        item = node.graphicsItem()
        item.setZValue(self.nextZVal*2)
        self.nextZVal += 1
        self.viewBox.addItem(item)
        item.moveBy(*pos)
        self._nodes[name] = node
        self.widget().addNode(node)
        node.sigClosed.connect(self.nodeClosed)
        node.sigRenamed.connect(self.nodeRenamed)
        node.sigOutputChanged.connect(self.nodeOutputChanged)
        self.sigChartChanged.emit(self, 'add', node)

    def removeNode(self, node):
        node.close()

    def nodeClosed(self, node):
        del self._nodes[node.name()]
        self.widget().removeNode(node)
        for signal in ['sigClosed', 'sigRenamed', 'sigOutputChanged']:
            try:
                getattr(node, signal).disconnect(self.nodeClosed)
            except (TypeError, RuntimeError):
                pass
        self.sigChartChanged.emit(self, 'remove', node)

    def nodeRenamed(self, node, oldName):
        del self._nodes[oldName]
        self._nodes[node.name()] = node
        self.widget().nodeRenamed(node, oldName)
        self.sigChartChanged.emit(self, 'rename', node)

    def arrangeNodes(self):
        pass

    def internalTerminal(self, term):
        """If the terminal belongs to the external Node, return the corresponding internal terminal"""
        if term.node() is self:
            if term.isInput():
                return self.inputNode[term.name()]
            else:
                return self.outputNode[term.name()]
        else:
            return term

    def connectTerminals(self, term1, term2):
        """Connect two terminals together within this flowchart."""
        term1 = self.internalTerminal(term1)
        term2 = self.internalTerminal(term2)
        term1.connectTo(term2)

    def process(self, **args):
        """
        Process data through the flowchart, returning the output.

        Keyword arguments must be the names of input terminals.
        The return value is a dict with one key per output terminal.

        """
        data = {}  ## Stores terminal:value pairs

        ## determine order of operations
        ## order should look like [('p', node1), ('p', node2), ('d', terminal1), ...]
        ## Each tuple specifies either (p)rocess this node or (d)elete the result from this terminal
        order = self.processOrder()
        #print "ORDER:", order

        ## Record inputs given to process()
        for n, t in self.inputNode.outputs().items():
            if n not in args:
                raise Exception("Parameter %s required to process this chart." % n)
            data[t] = args[n]

        ret = {}

        ## process all in order
        for c, arg in order:

            if c == 'p':     ## Process a single node
                #print "===> process:", arg
                node = arg
                if node is self.inputNode:
                    continue  ## input node has already been processed.

                ## get input and output terminals for this node
                outs = list(node.outputs().values())
                ins = list(node.inputs().values())

                ## construct input value dictionary
                args = {}
                for inp in ins:
                    inputs = inp.inputTerminals()
                    if len(inputs) == 0:
                        continue
                    if inp.isMultiValue():  ## multi-input terminals require a dict of all inputs
                        args[inp.name()] = dict([(i, data[i]) for i in inputs])
                    else:                   ## single-inputs terminals only need the single input value available
                        args[inp.name()] = data[inputs[0]]

                if node is self.outputNode:
                    ret = args  ## we now have the return value, but must keep processing in case there are other endpoint nodes in the chart
                else:
                    try:
                        if node.isBypassed():
                            result = node.processBypassed(args)
                        else:
                            result = node.process(display=False, **args)
                    except:
                        print("Error processing node %s. Args are: %s" % (str(node), str(args)))
                        raise
                    for out in outs:
                        #print "    Output:", out, out.name()
                        #print out.name()
                        try:
                            data[out] = result[out.name()]
                        except:
                            print(out, out.name())
                            raise
            elif c == 'd':   ## delete a terminal result (no longer needed; may be holding a lot of memory)
                #print "===> delete", arg
                if arg in data:
                    del data[arg]

        return ret

    def processOrder(self):
        """Return the order of operations required to process this chart.
        The order returned should look like [('p', node1), ('p', node2), ('d', terminal1), ...]
        where each tuple specifies either (p)rocess this node or (d)elete the result from this terminal
        """

        ## first collect list of nodes/terminals and their dependencies
        deps = {}
        tdeps = {}   ## {terminal: [nodes that depend on terminal]}
        for name, node in self._nodes.items():
            deps[node] = node.dependentNodes()
            for t in node.outputs().values():
                tdeps[t] = t.dependentNodes()

        #print "DEPS:", deps
        ## determine correct node-processing order
        #deps[self] = []
        order = toposort(deps)
        #print "ORDER1:", order

        ## construct list of operations
        ops = [('p', n) for n in order]

        ## determine when it is safe to delete terminal values
        dels = []
        for t, nodes in tdeps.items():
            lastInd = 0
            lastNode = None
            for n in nodes:  ## determine which node is the last to be processed according to order
                if n is self:
                    lastInd = None
                    break
                else:
                    try:
                        ind = order.index(n)
                    except ValueError:
                        continue
                if lastNode is None or ind > lastInd:
                    lastNode = n
                    lastInd = ind
            #tdeps[t] = lastNode
            if lastInd is not None:
                dels.append((lastInd+1, t))
        #dels.sort(lambda a,b: cmp(b[0], a[0]))
        dels.sort(key=lambda a: a[0], reverse=True)
        for i, t in dels:
            ops.insert(i, ('d', t))
        return ops

    def nodeOutputChanged(self, startNode):
        """Triggered when a node's output values have changed. (NOT called during process())
        Propagates new data forward through network."""
        ## first collect list of nodes/terminals and their dependencies

        if self.processing:
            return
        self.processing = True
        try:
            deps = {}
            for name, node in self._nodes.items():
                deps[node] = []
                for t in node.outputs().values():
                    deps[node].extend(t.dependentNodes())

            ## determine order of updates
            order = toposort(deps, nodes=[startNode])
            order.reverse()

            ## keep track of terminals that have been updated
            terms = set(startNode.outputs().values())

            #print "======= Updating", startNode
            #print "Order:", order
            for node in order[1:]:
                #print "Processing node", node
                for term in list(node.inputs().values()):
                    #print "  checking terminal", term
                    deps = list(term.connections().keys())
                    update = False
                    for d in deps:
                        if d in terms:
                            #print "    ..input", d, "changed"
                            update = True
                            term.inputChanged(d, process=False)
                    if update:
                        #print "  processing.."
                        node.update()
                        terms |= set(node.outputs().values())

        finally:
            self.processing = False
            if self.inputWasSet:
                self.inputWasSet = False
            else:
                self.sigStateChanged.emit()

    def chartGraphicsItem(self):
        """Return the graphicsItem which displays the internals of this flowchart.
        (graphicsItem() still returns the external-view item)"""
        #return self._chartGraphicsItem
        return self.viewBox

    def widget(self):
        if self._widget is None:
            self._widget = FlowchartCtrlWidget(self)
            self.scene = self._widget.scene()
            self.viewBox = self._widget.viewBox()
            #self._scene = QtGui.QGraphicsScene()
            #self._widget.setScene(self._scene)
            #self.scene.addItem(self.chartGraphicsItem())

            #ci = self.chartGraphicsItem()
            #self.viewBox.addItem(ci)
            #self.viewBox.autoRange()
        return self._widget

    def listConnections(self):
        conn = set()
        for n in self._nodes.values():
            terms = n.outputs()
            for n, t in terms.items():
                for c in t.connections():
                    conn.add((t, c))
        return conn

    def saveState(self):
        state = Node.saveState(self)
        state['nodes'] = []
        state['connects'] = []
        #state['terminals'] = self.saveTerminals()

        for name, node in self._nodes.items():
            cls = type(node)
            if hasattr(cls, 'nodeName'):
                clsName = cls.nodeName
                pos = node.graphicsItem().pos()
                ns = {'class': clsName, 'name': name, 'pos': (pos.x(), pos.y()), 'state': node.saveState()}
                state['nodes'].append(ns)

        conn = self.listConnections()
        for a, b in conn:
            state['connects'].append((a.node().name(), a.name(), b.node().name(), b.name()))

        state['inputNode'] = self.inputNode.saveState()
        state['outputNode'] = self.outputNode.saveState()

        return state

    def restoreState(self, state, clear=False):
        self.blockSignals(True)
        try:
            if clear:
                self.clear()
            Node.restoreState(self, state)
            nodes = state['nodes']
            #nodes.sort(lambda a, b: cmp(a['pos'][0], b['pos'][0]))
            nodes.sort(key=lambda a: a['pos'][0])
            for n in nodes:
                if n['name'] in self._nodes:
                    #self._nodes[n['name']].graphicsItem().moveBy(*n['pos'])
                    self._nodes[n['name']].restoreState(n['state'])
                    continue
                try:
                    node = self.createNode(n['class'], name=n['name'])
                    node.restoreState(n['state'])
                except:
                    printExc("Error creating node %s: (continuing anyway)" % n['name'])
                #node.graphicsItem().moveBy(*n['pos'])

            self.inputNode.restoreState(state.get('inputNode', {}))
            self.outputNode.restoreState(state.get('outputNode', {}))

            #self.restoreTerminals(state['terminals'])
            for n1, t1, n2, t2 in state['connects']:
                try:
                    self.connectTerminals(self._nodes[n1][t1], self._nodes[n2][t2])
                except:
                    print(self._nodes[n1].terminals)
                    print(self._nodes[n2].terminals)
                    printExc("Error connecting terminals %s.%s - %s.%s:" % (n1, t1, n2, t2))

        finally:
            self.blockSignals(False)

        self.sigChartLoaded.emit()
        self.outputChanged()
        self.sigStateChanged.emit()
        #self.sigOutputChanged.emit()

    def loadFile(self, fileName=None, startDir=None):
        if fileName is None:
            if startDir is None:
                startDir = self.filePath
            if startDir is None:
                startDir = '.'
            self.fileDialog = FileDialog(None, "Load Flowchart..", startDir, "Flowchart (*.fc)")
            #self.fileDialog.setFileMode(QtGui.QFileDialog.AnyFile)
            #self.fileDialog.setAcceptMode(QtGui.QFileDialog.AcceptSave)
            self.fileDialog.show()
            self.fileDialog.fileSelected.connect(self.loadFile)
            return
            ## NOTE: was previously using a real widget for the file dialog's parent, but this caused weird mouse event bugs..
            #fileName = QtGui.QFileDialog.getOpenFileName(None, "Load Flowchart..", startDir, "Flowchart (*.fc)")
        fileName = str(fileName)
        state = configfile.readConfigFile(fileName)
        self.restoreState(state, clear=True)
        self.viewBox.autoRange()
        #self.emit(QtCore.SIGNAL('fileLoaded'), fileName)
        self.sigFileLoaded.emit(fileName)

    def saveFile(self, fileName=None, startDir=None, suggestedFileName='flowchart.fc'):
        if fileName is None:
            if startDir is None:
                startDir = self.filePath
            if startDir is None:
                startDir = '.'
            self.fileDialog = FileDialog(None, "Save Flowchart..", startDir, "Flowchart (*.fc)")
            #self.fileDialog.setFileMode(QtGui.QFileDialog.AnyFile)
            self.fileDialog.setAcceptMode(QtGui.QFileDialog.AcceptSave)
            #self.fileDialog.setDirectory(startDir)
            self.fileDialog.show()
            self.fileDialog.fileSelected.connect(self.saveFile)
            return
            #fileName = QtGui.QFileDialog.getSaveFileName(None, "Save Flowchart..", startDir, "Flowchart (*.fc)")
        fileName = str(fileName)
        configfile.writeConfigFile(self.saveState(), fileName)
        self.sigFileSaved.emit(fileName)

    def clear(self):
        for n in list(self._nodes.values()):
            if n is self.inputNode or n is self.outputNode:
                continue
            n.close()  ## calls self.nodeClosed(n) by signal
        #self.clearTerminals()
        self.widget().clear()

    def clearTerminals(self):
        Node.clearTerminals(self)
        self.inputNode.clearTerminals()
        self.outputNode.clearTerminals()

#class FlowchartGraphicsItem(QtGui.QGraphicsItem):
class FlowchartGraphicsItem(GraphicsObject):

    def __init__(self, chart):
        #print "FlowchartGraphicsItem.__init__"
        #QtGui.QGraphicsItem.__init__(self)
        GraphicsObject.__init__(self)
        self.chart = chart ## chart is an instance of Flowchart()
        self.updateTerminals()

    def updateTerminals(self):
        #print "FlowchartGraphicsItem.updateTerminals"
        self.terminals = {}
        bounds = self.boundingRect()
        inp = self.chart.inputs()
        dy = bounds.height() / (len(inp)+1)
        y = dy
        for n, t in inp.items():
            item = t.graphicsItem()
            self.terminals[n] = item
            item.setParentItem(self)
            item.setAnchor(bounds.width(), y)
            y += dy
        out = self.chart.outputs()
        dy = bounds.height() / (len(out)+1)
        y = dy
        for n, t in out.items():
            item = t.graphicsItem()
            self.terminals[n] = item
            item.setParentItem(self)
            item.setAnchor(0, y)
            y += dy

    def boundingRect(self):
        #print "FlowchartGraphicsItem.boundingRect"
        return QtCore.QRectF()

    def paint(self, p, *args):
        #print "FlowchartGraphicsItem.paint"
        pass
        #p.drawRect(self.boundingRect())

class FlowchartCtrlWidget(QtGui.QWidget):
    """The widget that contains the list of all the nodes in a flowchart and their controls, as well as buttons for loading/saving flowcharts."""

    def __init__(self, chart):
        self.items = {}
        #self.loadDir = loadDir  ## where to look initially for chart files
        self.currentFileName = None
        QtGui.QWidget.__init__(self)
        self.chart = chart
        self.ui = FlowchartCtrlTemplate.Ui_Form()
        self.ui.setupUi(self)
        self.ui.ctrlList.setColumnCount(2)
        #self.ui.ctrlList.setColumnWidth(0, 200)
        self.ui.ctrlList.setColumnWidth(1, 20)
        self.ui.ctrlList.setVerticalScrollMode(self.ui.ctrlList.ScrollPerPixel)
        self.ui.ctrlList.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)

        self.chartWidget = FlowchartWidget(chart, self)
        #self.chartWidget.viewBox().autoRange()
        self.cwWin = QtGui.QMainWindow()
        self.cwWin.setWindowTitle('Flowchart')
        self.cwWin.setCentralWidget(self.chartWidget)
        self.cwWin.resize(1000,800)

        h = self.ui.ctrlList.header()
        h.setResizeMode(0, h.Stretch)

        self.ui.ctrlList.itemChanged.connect(self.itemChanged)
        self.ui.loadBtn.clicked.connect(self.loadClicked)
        self.ui.saveBtn.clicked.connect(self.saveClicked)
        self.ui.saveAsBtn.clicked.connect(self.saveAsClicked)
        self.ui.showChartBtn.toggled.connect(self.chartToggled)
        self.chart.sigFileLoaded.connect(self.setCurrentFile)
        self.ui.reloadBtn.clicked.connect(self.reloadClicked)
        self.chart.sigFileSaved.connect(self.fileSaved)

    #def resizeEvent(self, ev):
        #QtGui.QWidget.resizeEvent(self, ev)
        #self.ui.ctrlList.setColumnWidth(0, self.ui.ctrlList.viewport().width()-20)

    def chartToggled(self, b):
        if b:
            self.cwWin.show()
        else:
            self.cwWin.hide()

    def reloadClicked(self):
        try:
            self.chartWidget.reloadLibrary()
            self.ui.reloadBtn.success("Reloaded.")
        except:
            self.ui.reloadBtn.success("Error.")
            raise

    def loadClicked(self):
        newFile = self.chart.loadFile()
        #self.setCurrentFile(newFile)

    def fileSaved(self, fileName):
        self.setCurrentFile(str(fileName))
        self.ui.saveBtn.success("Saved.")

    def saveClicked(self):
        if self.currentFileName is None:
            self.saveAsClicked()
        else:
            try:
                self.chart.saveFile(self.currentFileName)
                #self.ui.saveBtn.success("Saved.")
            except:
                self.ui.saveBtn.failure("Error")
                raise

    def saveAsClicked(self):
        try:
            if self.currentFileName is None:
                newFile = self.chart.saveFile()
            else:
                newFile = self.chart.saveFile(suggestedFileName=self.currentFileName)
            #self.ui.saveAsBtn.success("Saved.")
            #print "Back to saveAsClicked."
        except:
            self.ui.saveBtn.failure("Error")
            raise

        #self.setCurrentFile(newFile)

    def setCurrentFile(self, fileName):
        self.currentFileName = str(fileName)
        if fileName is None:
            self.ui.fileNameLabel.setText("<b>[ new ]</b>")
        else:
            self.ui.fileNameLabel.setText("<b>%s</b>" % os.path.split(self.currentFileName)[1])
        self.resizeEvent(None)

    def itemChanged(self, *args):
        pass

    def scene(self):
        return self.chartWidget.scene() ## returns the GraphicsScene object

    def viewBox(self):
        return self.chartWidget.viewBox()

    def nodeRenamed(self, node, oldName):
        self.items[node].setText(0, node.name())

    def addNode(self, node):
        ctrl = node.ctrlWidget()
        #if ctrl is None:
            #return
        item = QtGui.QTreeWidgetItem([node.name(), '', ''])
        self.ui.ctrlList.addTopLevelItem(item)
        byp = QtGui.QPushButton('X')
        byp.setCheckable(True)
        byp.setFixedWidth(20)
        item.bypassBtn = byp
        self.ui.ctrlList.setItemWidget(item, 1, byp)
        byp.node = node
        node.bypassButton = byp
        byp.setChecked(node.isBypassed())
        byp.clicked.connect(self.bypassClicked)

        if ctrl is not None:
            item2 = QtGui.QTreeWidgetItem()
            item.addChild(item2)
            self.ui.ctrlList.setItemWidget(item2, 0, ctrl)

        self.items[node] = item

    def removeNode(self, node):
        if node in self.items:
            item = self.items[node]
            #self.disconnect(item.bypassBtn, QtCore.SIGNAL('clicked()'), self.bypassClicked)
            try:
                item.bypassBtn.clicked.disconnect(self.bypassClicked)
            except (TypeError, RuntimeError):
                pass
            self.ui.ctrlList.removeTopLevelItem(item)

    def bypassClicked(self):
        btn = QtCore.QObject.sender(self)
        btn.node.bypass(btn.isChecked())

    def chartWidget(self):
        return self.chartWidget

    def outputChanged(self, data):
        pass
        #self.ui.outputTree.setData(data, hideRoot=True)

    def clear(self):
        self.chartWidget.clear()

    def select(self, node):
        item = self.items[node]
        self.ui.ctrlList.setCurrentItem(item)

class FlowchartWidget(dockarea.DockArea):
    """Includes the actual graphical flowchart and debugging interface"""
    def __init__(self, chart, ctrl):
        #QtGui.QWidget.__init__(self)
        dockarea.DockArea.__init__(self)
        self.chart = chart
        self.ctrl = ctrl
        self.hoverItem = None
        #self.setMinimumWidth(250)
        #self.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding))

        #self.ui = FlowchartTemplate.Ui_Form()
        #self.ui.setupUi(self)

        ## build user interface (it was easier to do it here than via developer)
        self.view = FlowchartGraphicsView.FlowchartGraphicsView(self)
        self.viewDock = dockarea.Dock('view', size=(1000,600))
        self.viewDock.addWidget(self.view)
        self.viewDock.hideTitleBar()
        self.addDock(self.viewDock)

        self.hoverText = QtGui.QTextEdit()
        self.hoverText.setReadOnly(True)
        self.hoverDock = dockarea.Dock('Hover Info', size=(1000,20))
        self.hoverDock.addWidget(self.hoverText)
        self.addDock(self.hoverDock, 'bottom')

        self.selInfo = QtGui.QWidget()
        self.selInfoLayout = QtGui.QGridLayout()
        self.selInfo.setLayout(self.selInfoLayout)
        self.selDescLabel = QtGui.QLabel()
        self.selNameLabel = QtGui.QLabel()
        self.selDescLabel.setWordWrap(True)
        self.selectedTree = DataTreeWidget()
        #self.selectedTree.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        #self.selInfoLayout.addWidget(self.selNameLabel)
        self.selInfoLayout.addWidget(self.selDescLabel)
        self.selInfoLayout.addWidget(self.selectedTree)
        self.selDock = dockarea.Dock('Selected Node', size=(1000,200))
        self.selDock.addWidget(self.selInfo)
        self.addDock(self.selDock, 'bottom')

        self._scene = self.view.scene()
        self._viewBox = self.view.viewBox()
        #self._scene = QtGui.QGraphicsScene()
        #self._scene = FlowchartGraphicsView.FlowchartGraphicsScene()
        #self.view.setScene(self._scene)

        self.buildMenu()
        #self.ui.addNodeBtn.mouseReleaseEvent = self.addNodeBtnReleased

        self._scene.selectionChanged.connect(self.selectionChanged)
        self._scene.sigMouseHover.connect(self.hoverOver)
        #self.view.sigClicked.connect(self.showViewMenu)
        #self._scene.sigSceneContextMenu.connect(self.showViewMenu)
        #self._viewBox.sigActionPositionChanged.connect(self.menuPosChanged)

    def reloadLibrary(self):
        #QtCore.QObject.disconnect(self.nodeMenu, QtCore.SIGNAL('triggered(QAction*)'), self.nodeMenuTriggered)
        self.nodeMenu.triggered.disconnect(self.nodeMenuTriggered)
        self.nodeMenu = None
        self.subMenus = []
        self.chart.library.reload()
        self.buildMenu()

    def buildMenu(self, pos=None):
        self.nodeMenu = QtGui.QMenu()
        self.subMenus = []
        for section, nodes in self.chart.library.getNodeTree().items():
            menu = QtGui.QMenu(section)
            self.nodeMenu.addMenu(menu)
            for name in nodes:
                act = menu.addAction(name)
                act.nodeType = name
                act.pos = pos
            self.subMenus.append(menu)
        self.nodeMenu.triggered.connect(self.nodeMenuTriggered)
        return self.nodeMenu

    def menuPosChanged(self, pos):
        self.menuPos = pos

    def showViewMenu(self, ev):
        #QtGui.QPushButton.mouseReleaseEvent(self.ui.addNodeBtn, ev)
        #if ev.button() == QtCore.Qt.RightButton:
            #self.menuPos = self.view.mapToScene(ev.pos())
            #self.nodeMenu.popup(ev.globalPos())
        #print "Flowchart.showViewMenu called"

        #self.menuPos = ev.scenePos()
        self.buildMenu(ev.scenePos())
        self.nodeMenu.popup(ev.screenPos())

    def scene(self):
        return self._scene ## the GraphicsScene item

    def viewBox(self):
        return self._viewBox ## the viewBox that items should be added to

    def nodeMenuTriggered(self, action):
        nodeType = action.nodeType
        if action.pos is not None:
            pos = action.pos
        else:
            pos = self.menuPos
        pos = self.viewBox().mapSceneToView(pos)

        self.chart.createNode(nodeType, pos=pos)

    def selectionChanged(self):
        #print "FlowchartWidget.selectionChanged called."
        items = self._scene.selectedItems()
        #print "     scene.selectedItems: ", items
        if len(items) == 0:
            data = None
        else:
            item = items[0]
            if hasattr(item, 'node') and isinstance(item.node, Node):
                n = item.node
                self.ctrl.select(n)
                data = {'outputs': n.outputValues(), 'inputs': n.inputValues()}
                self.selNameLabel.setText(n.name())
                if hasattr(n, 'nodeName'):
                    self.selDescLabel.setText("<b>%s</b>: %s" % (n.nodeName, n.__class__.__doc__))
                else:
                    self.selDescLabel.setText("")
                if n.exception is not None:
                    data['exception'] = n.exception
            else:
                data = None
        self.selectedTree.setData(data, hideRoot=True)

    def hoverOver(self, items):
        #print "FlowchartWidget.hoverOver called."
        term = None
        for item in items:
            if item is self.hoverItem:
                return
            self.hoverItem = item
            if hasattr(item, 'term') and isinstance(item.term, Terminal):
                term = item.term
                break
        if term is None:
            self.hoverText.setPlainText("")
        else:
            val = term.value()
            if isinstance(val, ndarray):
                val = "%s %s %s" % (type(val).__name__, str(val.shape), str(val.dtype))
            else:
                val = str(val)
                if len(val) > 400:
                    val = val[:400] + "..."
            self.hoverText.setPlainText("%s.%s = %s" % (term.node().name(), term.name(), val))
            #self.hoverLabel.setCursorPosition(0)

    def clear(self):
        #self.outputTree.setData(None)
        self.selectedTree.setData(None)
        self.hoverText.setPlainText('')
        self.selNameLabel.setText('')
        self.selDescLabel.setText('')

class FlowchartNode(Node):
    pass


text:
Tag: certificate
Salvoni v Fiermonte. CJEU confirms quasi-notarial nature of Brussels Ia's Article 53 certificate, other than for provisional measures. Consumer protection cannot be raised at that stage. Also rejects interpretative force of substantive consumer law rules for jurisdictional issues.
I reviewed Bobek AG Opinion in Case C-347/18 Salvoni v Fiermonte earlier. The referring court enquires whether the court of origin tasked with issuing the Article 53 Certificate (issued with a view to enabling swift recognition and enforcement) may, of its own motion, seek to ascertain whether the judgment whose enforcement is sought was issued in breach of the rules on jurisdiction over consumer contracts, so that it may, where appropriate, inform the consumer of any such breach and enable her to consider the possibility of opposing enforcement of the judgment in the Member State addressed.
The CJEU has entirely confirmed the AG's Opinion (no English version at the time of posting): no such second-guessing of jurisdiction.
At 34 ff the Court points out an important distinction with certificates issued with a view to enforcing provisional measures: there, the court issuing the certificate does carry out jurisdictional review (whether the court ordering the measures has jurisdiction as to the substance of the case).
At 40 ff the Court also confirms that substantive consumer protection laws (such as Directive 93/13) do not transfer to the procedural /jurisdictional rules of Brussels Ia: an important conclusion overall.
(Handbook of) European private international law, 2nd ed. 2016, Chapter 2, Heading 2.2.8.2, Heading 2.2.16.
Bobek AG in Salvoni v Fiermonte. Brussels Ia's Article 53 certificate and consumer protection.
Bobek AG Opined early May (excuse posting delay) in Case C-347/18 Salvoni v Fiermonte. The referring court enquires whether the court of origin tasked with issuing the Article 53 Certificate (issued with a view to enabling swift recognition and enforcement) may, of its own motion, seek to ascertain whether the judgment whose enforcement is sought was issued in breach of the rules on jurisdiction over consumer contracts, so that it may, where appropriate, inform the consumer of any such breach and enable her to consider the possibility of opposing enforcement of the judgment in the Member State addressed.
A related issue therefore to the CJEU judgment in Weil last week.
Mr Alessandro Salvoni, a lawyer based in Milan, asked the Tribunale di Milano (District Court, Milan) to issue Ms Anna Maria Fiermonte (who resides in Hamburg) with a payment order for an amount owed to him as consideration for the professional services rendered by him in connection with legal proceedings concerning a will. Payment order was granted, no challenge was made by Ms Fiermonte (at 24 the AG emphasises that evidently, the court needs to check whether proper service was made). Mr Salvoni then requested the same court to issue the Article 53 Certificate with respect to that order. However this time the same court (with the AG at 22 one can assume that composition was different) proprio motu (and belatedly: see at 15) classified the relationship as B2C under the relevant provisions of Brussels Ia. Ms Fiermonte should have been sued in Hamburg.
Bobek AG courteously calls the court's initiative ingenious and well-intended (at 29) but has no choice but to conclude that the Regulation simply has no tool for the Court somehow to mitigate let alone correct its earlier mistake. In a gesture effectively of public service (at 34; this rescues something useful from the otherwise fairly futile exercise; I doubt the CJEU will do something similar), the AG then rephrases the question into a more general one, which is detached from the specific course of action apparently contemplated by the national court: Is a national court, when issuing the Article 53 Certificate, entitled (or even obliged), under EU law, to ascertain whether the judicial decision that is to be certified was issued in breach of the rules on jurisdiction over consumer contracts?
At 44 ff the AG delightfully side-steps the chicken and hen issue of the C-54/96 Dorsch criteria (is an A53 court a 'court' entitled to preliminary review under Article 267 TFEU) and eventually concludes that there is no room for the A53 Court to assess the application of the consumer title. At 54: '
The interpretation of [A53] proposed by the referring court cannot easily be reconciled with the above considerations [speed; simplicity: GAVC]. In particular, that interpretation would in effect back-pedal on one of the main features of the new system introduced by Regulation No 1215/2012. Indeed, the checks that were previously made in the Member State addressed when issuing the exequatur would not be eliminated, but merely shifted to the certification stage carried out in the Member State of origin. That reading of the provision would thus run against the logic and spirit of Regulation No 1215/2012.'
At 81 and 82 the likely outcome of course is pointed at by the AG: Article 45(1)(e)(i) and Article 46 BIa grant consumers a special ground of refusal of recognition and enforcement in cases where the judgment in question conflicts with the jurisdictional rules for the protected categories. This ground has now been handed Ms Fiermonte on a plate – leaving the Milan courts with red cheeks.
BUAK. The concept of 'court' (Article 267 TFEU), 'civil and commercial', and the social security exception in the Brussels I Recast.
Update 28 October 2020 as reported by Jorg Sladič here, the Slovenian Supreme Court has now held, applying the CJEU judgment, that the employer's obligation to pay wage supplements regarding annual leave claimed by BUAK before the Austrian forum is inextricably linked to the employees' right to annual leave paid under civil law, so the nature of BUAK's claim is also that of a right under civil law. Covered by BIa therefore. An ordre public argument against enforcement failed.
I reported on Bot AG's Opinion in Case C-579/17 BUAK (Bauarbeiter-Urlaubs- u. Abfertigungskasse v Gradbeništvo Korana d.o.o.) here. He focussed on admissibility viz the preliminary review procedure. He left the questions on 'civil and commercial', and the social security exception unanswered, suggesting these are now acte claire. The Court (2nd chamber) at the end of February did answer all questions. (For completeness sake I already note that for the latter, the CJEU referred to secondary EU law to find the payment not to be one in social security).
First, on the issue of admissibility under Article 267 TFEU. In the absence of discussion by the original court on the applicability of Brussels Ia, by determining whether it is competent to issue the certificate under Article 53 Brussels Ia (replacing exequatur), the court of origin implicitly confirms that the judgment given in default which must be recognised and enforced in another Member State falls within the scope of application of that Regulation: for evidently the issue of the certificate is possible only on that condition. That procedure in those circumstances is judicial in character, with the result that a national court ruling in the context of such a procedure is entitled to refer questions to the Court for a preliminary ruling. (But only in those circumstances: for otherwise the issuing of the certificate becomes a potential anchor for stalling quick enforcement, via preliminary review to Luxembourg).
Next, on the issue of 'civil and commercial', some usual suspects are discussed including in particular Pula Parking. flyLAL, and Sapir (but not Fahnenbrock or Kuhn). What needs to be examined, is firstly the legal relationship between the parties to the dispute and secondly the basis and the detailed rules governing the bringing of the action.
As to the former, BUAK may be governed by public law however its calculations of wage supplements and annual leave, the formula for which is determined by decree, are superimposed upon wage negotiations which employers either negotiate entirely freely with employees or agree so on the basis of collective agreements between employers and employees to which employers freely consent. And at 54: 'in so far as the employer's obligation to pay the wage supplements is intrinsically linked with the rights, which are of a civil nature, of workers to annual leave pay, …BUAK's claim and, therefore, an action for payment of that claim, is also of a civil nature.' (Note that Eurocontrol, not too dissimilar in context (here too the root cause of the debt incurred is one of free will: whether to use certain airspace and airports or not), did lead to a finding of non-civil and commercial matters). I do not find this application straightforward at all; 'the parties' are the employer (Korana, a Slovenian company which had posted workers to Austria) and BUAK. Their legal relationship is removed from the contract and /or collective agreements negotiations.
As for the second criterion, the basis and the detailed rules governing the bringing of the action, unlike purely internal situations, in which BUAK may itself issue an execution title in the form of a statement of arrears, with respect to arrears relating to posted workers who do not have their habitual place of work in Austria it must initiate legal proceedings for the payment of unpaid wage supplements. However there is divergence of views between the referring court and Austria and the EC before the CJEU: the former maintains that its hands are tied and that it cannot pursue a de novo review of the application by BUAC; the latter suggest the court seized does carry out a full review of all of the elements of the application. The CJEU at 60 would seem to lean on the side of the referring court but leaves it to take the final decision.
I will turn to this again when I work on the third edition of the handbook this summer yet it is clear that the formula for deciding civil and commercial is still not entirely settled. The First chamber issued Fahnenbrock (Tizzano (Rapporteur), Rodin, Levits, Berger and Biltgen), and Kuhn (Silva de Lapuerta (Rapporteur), Bonichot, Regan, Fernlund and Rodin; the latter the only common denominator in both), which are arguably more like the Lechoritou formula, which in turn applies Eurcontrol: exclusion of certain legal actions and judicial decisions from the scope of Regulation No 1215/2012, by reason either of the legal relationships between the parties to the action or of the subject matter of the action.
The Second chamber (K. Lenaerts, A. Prechal, Toader, Rosas and Ilešič; quite a few conflicts scholars indeed including the President of the CJEU) such as here in Buak, now focuses on Sapir which was issued by the third Chamber, comprising at the time Toader (Rapporteur), Ilešič, Jarašiūnas, Ó Caoimh, Fernlund. Toader and Ilešič are the common denominator with current judment in BUAK). Sapir has focus also firstly on the legal relationship between the parties to the dispute, but secondly the basis and the detailed rules governing the bringing of the action (not: the to my knowledge never applied criterion of 'subject matter' of the action).
To ponder over the summer.
(Handbook of) EU private international law, 2nd ed. 2016, Chapter 2, Heading 2.2.16.1.1.
BUAK. Bot AG on the concept of 'court'.
In Case C-579/17 BUAK (Bauarbeiter-Urlaubs- u. Abfertigungskasse v Gradbeništvo Korana d.o.o.) Bot AG opined end October – the English version is not yet (if ever) available. The case was formulated by the referring court as one on the scope of application of the Recast – in particular the social security exception, and the 'civil and commercial' charachter. However the AG suggests this is a question which the referring court by now ought to be able to answer itself, given the extensive case-law of the Court. Instead, the question is turned into one on admissibility, namely whether the issuiing of a Brussels Ia cetificate with a view to enforcement, qualifies as a 'judicial' function required to uphold admissiability for the preliminary review procedure under Article 267 TFEU.
Under Brussels Ia, 'The court of origin shall, at the request of any interested party, issue the certificate using the form set out in Annex I.' The equivalent provision in Brussels I (Article 54) read 'The court or competent authority of a Member State where a judgment was given shall issue, at the request of any interested party, a certificate using the standard form in Annex V to this Regulation.' – emphasis added.
The Advocate General suggests that where issues relevant to Brussels I Recast (particularly: whether the issue falls at all within its scope) have not yet been discussed prior to the authority being asked to complete the Brussels I Recast form, such authority ought to be able to issue preliminary review requests to the CJEU. However (at 54) such authority qualifying as such (where it is a different authority from the court having taken the decision), ought to be exceptional: the whole point of the enforcement Title of the Regulation being speed and swiftness.
All in all an interesting turn of events.