From 3dc95d409a5afa95b83342feb70cfb175791d3f9 Mon Sep 17 00:00:00 2001 From: Robert Zilke Date: Tue, 6 Aug 2019 14:13:44 +0200 Subject: [PATCH 1/3] Module beer_contracts_with_stubs added, copied from beer_contracts --- beer_contracts_with_stubs/.gitignore | 22 ++ .../.mvn/wrapper/MavenWrapperDownloader.java | 110 +++++++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 48336 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + beer_contracts_with_stubs/LICENSE.txt | 202 ++++++++++++ beer_contracts_with_stubs/README.adoc | 179 +++++++++++ .../example/graphs/d3.png | Bin 0 -> 33940 bytes .../example/graphs/dracula.png | Bin 0 -> 61477 bytes beer_contracts_with_stubs/example/pom.xml | 129 ++++++++ beer_contracts_with_stubs/js/d3.min.js | 5 + beer_contracts_with_stubs/js/dracula.min.js | 1 + beer_contracts_with_stubs/js/graffle.js | 101 ++++++ beer_contracts_with_stubs/js/graph.js | 303 ++++++++++++++++++ beer_contracts_with_stubs/js/raphael-min.js | 7 + beer_contracts_with_stubs/mvnw | 286 +++++++++++++++++ beer_contracts_with_stubs/mvnw.cmd | 161 ++++++++++ beer_contracts_with_stubs/pom.xml | 168 ++++++++++ beer_contracts_with_stubs/relationships.js | 1 + .../relationships_d3.html | 97 ++++++ .../relationships_dracula.html | 38 +++ .../src/assembly/contracts.xml | 28 ++ .../src/main/resources/.gitignore | 25 ++ .../shouldSendAcceptedVerification.groovy | 33 ++ .../shouldSendRejectedVerification.groovy | 33 ++ .../beer-api-consumer/rest/response.json | 3 + .../rest/shouldGrantABeerIfOldEnough.groovy | 37 +++ ...shouldGrantABeerIfOldEnoughFromFile.groovy | 36 +++ .../rest/shouldRejectABeerIfTooYoung.groovy | 37 +++ .../beer-api-producer-external/1.0.0/pom.xml | 121 +++++++ .../2.0.0/anotherConsumerOnly/.gitkeep | 0 .../2.0.0/barService/.gitkeep | 0 .../2.0.0/foo.bar.bazService/.gitkeep | 0 .../2.0.0/foo.bar.consumerOnly/.gitkeep | 0 .../2.0.0/foo.bar.fooService.1_2_3/.gitkeep | 0 .../beer-api-producer-external/2.0.0/pom.xml | 121 +++++++ .../contracts/foo/bar/barService/pom.xml | 126 ++++++++ .../barService/yetAnotherConsumer/.gitkeep | 0 .../bazConsumer1/rest/shouldSayHello.groovy | 11 + .../contracts/foo/bar/bazService/pom.xml | 125 ++++++++ .../bar/beer-api-consumer/.producer_contracts | 0 .../bar/beer-api-consumer/messaging/.gitkeep | 0 .../foo/bar/beer-api-consumer/pom.xml | 125 ++++++++ .../foo/bar/beer-api-consumer/rest/.gitkeep | 0 .../foo/bar/fooService/1.2.3/pom.xml | 125 ++++++++ .../docs/GenerateAdocsFromContractsTests.java | 118 +++++++ .../docs/GenerateGraphFromContractsTests.java | 206 ++++++++++++ 46 files changed, 3121 insertions(+) create mode 100644 beer_contracts_with_stubs/.gitignore create mode 100644 beer_contracts_with_stubs/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 beer_contracts_with_stubs/.mvn/wrapper/maven-wrapper.jar create mode 100644 beer_contracts_with_stubs/.mvn/wrapper/maven-wrapper.properties create mode 100644 beer_contracts_with_stubs/LICENSE.txt create mode 100644 beer_contracts_with_stubs/README.adoc create mode 100644 beer_contracts_with_stubs/example/graphs/d3.png create mode 100644 beer_contracts_with_stubs/example/graphs/dracula.png create mode 100644 beer_contracts_with_stubs/example/pom.xml create mode 100644 beer_contracts_with_stubs/js/d3.min.js create mode 100644 beer_contracts_with_stubs/js/dracula.min.js create mode 100644 beer_contracts_with_stubs/js/graffle.js create mode 100644 beer_contracts_with_stubs/js/graph.js create mode 100644 beer_contracts_with_stubs/js/raphael-min.js create mode 100644 beer_contracts_with_stubs/mvnw create mode 100644 beer_contracts_with_stubs/mvnw.cmd create mode 100644 beer_contracts_with_stubs/pom.xml create mode 100644 beer_contracts_with_stubs/relationships.js create mode 100644 beer_contracts_with_stubs/relationships_d3.html create mode 100644 beer_contracts_with_stubs/relationships_dracula.html create mode 100644 beer_contracts_with_stubs/src/assembly/contracts.xml create mode 100644 beer_contracts_with_stubs/src/main/resources/.gitignore create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/response.json create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/pom.xml create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/anotherConsumerOnly/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/barService/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.bazService/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.consumerOnly/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.fooService.1_2_3/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/pom.xml create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/pom.xml create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/pom.xml create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/pom.xml create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep create mode 100644 beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/fooService/1.2.3/pom.xml create mode 100644 beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java create mode 100644 beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java diff --git a/beer_contracts_with_stubs/.gitignore b/beer_contracts_with_stubs/.gitignore new file mode 100644 index 000000000..29391880e --- /dev/null +++ b/beer_contracts_with_stubs/.gitignore @@ -0,0 +1,22 @@ +*~ +#* +*# +.#* +.classpath +.project +.settings/ +.springBeans +target/ +_site/ +.idea +*.iml +*.swp +.factorypath +*.logtjmeter +.checkstyle +*.log +.DS_Store +/spring-cloud-sleuth-core/nb-configuration.xml +/spring-cloud-sleuth-core/nbactions.xml +build/ +.gradle \ No newline at end of file diff --git a/beer_contracts_with_stubs/.mvn/wrapper/MavenWrapperDownloader.java b/beer_contracts_with_stubs/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 000000000..8768217da --- /dev/null +++ b/beer_contracts_with_stubs/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,110 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: : " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/beer_contracts_with_stubs/.mvn/wrapper/maven-wrapper.jar b/beer_contracts_with_stubs/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..08ebbb67f088c53eac9a4e2cb019b93f69a1e49c GIT binary patch literal 48336 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 H*Ps3mB7Q<; literal 0 HcmV?d00001 diff --git a/beer_contracts_with_stubs/.mvn/wrapper/maven-wrapper.properties b/beer_contracts_with_stubs/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..a5fcc1192 --- /dev/null +++ b/beer_contracts_with_stubs/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/beer_contracts_with_stubs/LICENSE.txt b/beer_contracts_with_stubs/LICENSE.txt new file mode 100644 index 000000000..62589edd1 --- /dev/null +++ b/beer_contracts_with_stubs/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/beer_contracts_with_stubs/README.adoc b/beer_contracts_with_stubs/README.adoc new file mode 100644 index 000000000..0f9f72052 --- /dev/null +++ b/beer_contracts_with_stubs/README.adoc @@ -0,0 +1,179 @@ += Common contracts repo + +This repo contains all contracts for apps in the system. + +== As a consumer + +You are working offline in order to play around with the API of the producer. +What you need to do is to have the producer's stubs installed locally. To do that +you have to (from the root of the repo) + +[source,bash] +---- +cd src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0 +mvn clean install -DskipTests +---- + +Then if you do `ls ./target` you'll see `beer-api-producer-external-0.0.1-SNAPSHOT-stubs.jar`. This jar will + contain the stubs generated from your contracts. That way you +can reference the `com.example:server:+:stubs` dependency in your consumer tests. + +TIP: Don't mind that there's a version mismatch in the stubs and the folder structure. +The version number is there in the folder name for tests related to dealing with +non-Java friendly naming of packages. + +== As a producer + +Assuming that the consumers have filed a PR with the proposed contract the producers +can work offline to generate tests and stubs. To work offline, as a producer you just have +to go to the root folder of the contracts and: + +[source,bash] +---- +./mvnw clean install -DskipTests +---- + +Then if you do `ls ./target` you'll see `contracts-0.0.1-SNAPSHOT.jar`. This file contains +all DSL contracts, for all applications. + +Now the producer can include the `contracts-0.0.1-SNAPSHOT.jar` from your local maven repository. +You can achieve that by setting the proper flag in plugin properties. + +Example for Maven + +[source,xml] +---- + + org.springframework.cloud + spring-cloud-contract-maven-plugin + + + LOCAL + + com.example + beer-contracts + + + +---- + +and for Gradle: + +[source,groovy] +---- +contracts { + contractsMode = "LOCAL" + contractDependency { + stringNotation = "com.example:beer-contracts" + } +} +---- + +== Dependency Visualization + +When keeping contracts in an external repository, and by following the +stubs per consumer feature, we have the full knowledge of who is +calling who within our system. That way we can sketch a graph of dependencies +between applications. + +As a reminder, the **stubs per consumer** feature is all about creating a +consumer subfolder, in each producer's folder. E.g. if consumer `baz` uses producer `foo.bar` +then the folder structure would look like this `foo/bar/baz/contracts/...`. + +Let's assume that we have such setup (`...` signifies contract definitions): + +[source] +---- +├── com +│   └── example +│   └── beer-api-producer-external +│   ├── 1.0.0 +│   │   ├── beer-api-consumer +│   │   │   ├── messaging +│   │   │   │   ├── ... +│   │   │   └── rest +│   │   │   ├── ... +│   │   ├── mvnw +│   │   ├── pom.xml +│   └── 2.0.0 +│   ├── anotherConsumerOnly +│      │   ├── ... +│   ├── barService +│      │   ├── ... +│   ├── foo.bar.bazService +│      │   ├── ... +│   ├── foo.bar.consumerOnly +│      │   ├── ... +│   ├── foo.bar.fooService.1_2_3 +│      │   ├── ... +│   └── pom.xml +└── foo + └── bar + ├── barService + │   ├── pom.xml + │   └── yetAnotherConsumer + │      ├── ... + ├── bazService + │   ├── bazConsumer1 + │   │   └── rest + │   │   └── ... + │   └── pom.xml + ├── beer-api-consumer + │   ├── messaging + │   │   ├── ... + │   ├── pom.xml + │   └── rest + │   ├── ... + └── fooService + └── 1.2.3 +    ├── ... + └── pom.xml +---- + +We can reason that: + +* `com.example:beer-api-producer-external` in version `2.0.0` is used by 5 consumers +** `foo.bar:bazService` +** `foo.bar:barService` +** `anotherConsumerOnly` +** `foo.bar:fooService` in version `1.2.3` +** `foo.bar:consumerOnly` +* `com.example:beer-api-producer-external` in version `1.0.0` is used by 1 consumer +** `foo.bar:beer-api-consumer` +* `foo.bar:bazService` is used by 1 consumer +** `bazConsumer1` +* `foo.bar:barService` is used by 1 consumer +** `yetAnotherConsumer` + +This information gives as all data we need to sketch a graph of the dependencies. + +.Example of d3 graph +image::example/graphs/d3.png[] + +.Example of Dracula graph +image::example/graphs/dracula.png[] + +=== Storing data + +It's enough to execute the `docs.GenerateGraphFromContractsTests.java`. The test +scans the contract structure and builds a graph of relationships between +consumers and producers. + +It will create a file called `relationships.js` that you can source in +your HTML file. It will load to a var called `relationships` the JSON representing +the relationships. The JSON consists of `source`, `target` pairs where `source` is +the `producer` and `target` is the `consumer`. + +There are two example HTML files `relationships_d3.html` that uses https://d3js.org/[d3js] +and `relationships_dracula.html` that uses https://www.graphdracula.net[Graph Dracula] to +render the graph. + +=== Assumptions + +* You have to use the stubs per consumer feature to sketch a precise graph +(i.e. each consumer has its own subfolder in the producer's directory) +* If using the producer contract approach (you don't know who your consumers are) +you can create file `.producer_contracts` that will tell the test that +generates data that the subfolders do not represent consumer names +* The folder where the consumers of a given producer lay, needs to have the `pom.xml` +or `build.gradle` file (you need it anyways to, as a consumer, install stubs of the producer) diff --git a/beer_contracts_with_stubs/example/graphs/d3.png b/beer_contracts_with_stubs/example/graphs/d3.png new file mode 100644 index 0000000000000000000000000000000000000000..d1279a2a433e567917dd416f8be68fdf3eadacf3 GIT binary patch literal 33940 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 literal 0 HcmV?d00001 diff --git a/beer_contracts_with_stubs/example/graphs/dracula.png b/beer_contracts_with_stubs/example/graphs/dracula.png new file mode 100644 index 0000000000000000000000000000000000000000..e1bdee948dd8fa3b9c1798eb9221774e19532dbf GIT binary patch literal 61477 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

fBE$u}rtg?>myRHN;dPc4%Tbb{~7)Kn!v{6RyD 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 rup+;%` + + + 4.0.0 + + com.example + beer-api-producer-external + 0.0.1.BUILD-SNAPSHOT + + Beer API producer Stubs + POM used to install locally stubs for consumer side + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + 1.8 + 2.1.3.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT + + true + + true + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + ${project.basedir} + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/js/d3.min.js b/beer_contracts_with_stubs/js/d3.min.js new file mode 100644 index 000000000..e5bac8af6 --- /dev/null +++ b/beer_contracts_with_stubs/js/d3.min.js @@ -0,0 +1,5 @@ +!function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(n){return aa+n in this}function o(n){return n=aa+n,n in this&&delete this[n]}function a(){var n=[];return this.forEach(function(t){n.push(t)}),n}function c(){var n=0;for(var t in this)t.charCodeAt(0)===ca&&++n;return n}function s(){for(var n in this)if(n.charCodeAt(0)===ca)return!1;return!0}function l(){}function f(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function h(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=sa.length;r>e;++e){var u=sa[e]+t;if(u in n)return u}}function g(){}function p(){}function v(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function D(n){return fa(n,ya),n}function P(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t0&&(n=n.substring(0,a));var s=Ma.get(n);return s&&(n=s,c=F),a?t?u:r:t?g:i}function H(n,t){return function(e){var r=Xo.event;Xo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Xo.event=r}}}function F(n,t){var e=H(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function O(){var n=".dragsuppress-"+ ++ba,t="click"+n,e=Xo.select(Go).on("touchmove"+n,d).on("dragstart"+n,d).on("selectstart"+n,d);if(_a){var r=Jo.style,u=r[_a];r[_a]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),_a&&(r[_a]=u),i&&(e.on(t,function(){d(),o()},!0),setTimeout(o,0))}}function Y(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>wa&&(Go.scrollX||Go.scrollY)){e=Xo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();wa=!(u.f||u.e),e.remove()}return wa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function I(n){return n>0?1:0>n?-1:0}function Z(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function V(n){return n>1?0:-1>n?Sa:Math.acos(n)}function X(n){return n>1?Ea:-1>n?-Ea:Math.asin(n)}function $(n){return((n=Math.exp(n))-1/n)/2}function B(n){return((n=Math.exp(n))+1/n)/2}function W(n){return((n=Math.exp(2*n))-1)/(n+1)}function J(n){return(n=Math.sin(n/2))*n}function G(){}function K(n,t,e){return new Q(n,t,e)}function Q(n,t,e){this.h=n,this.s=t,this.l=e}function nt(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,gt(u(n+120),u(n),u(n-120))}function tt(n,t,e){return new et(n,t,e)}function et(n,t,e){this.h=n,this.c=t,this.l=e}function rt(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),ut(e,Math.cos(n*=Na)*t,Math.sin(n)*t)}function ut(n,t,e){return new it(n,t,e)}function it(n,t,e){this.l=n,this.a=t,this.b=e}function ot(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=ct(u)*Fa,r=ct(r)*Oa,i=ct(i)*Ya,gt(lt(3.2404542*u-1.5371385*r-.4985314*i),lt(-.969266*u+1.8760108*r+.041556*i),lt(.0556434*u-.2040259*r+1.0572252*i))}function at(n,t,e){return n>0?tt(Math.atan2(e,t)*La,Math.sqrt(t*t+e*e),n):tt(0/0,0/0,n)}function ct(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function st(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function lt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ft(n){return gt(n>>16,255&n>>8,255&n)}function ht(n){return ft(n)+""}function gt(n,t,e){return new pt(n,t,e)}function pt(n,t,e){this.r=n,this.g=t,this.b=e}function vt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function dt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Mt(u[0]),Mt(u[1]),Mt(u[2]))}return(i=Va.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function mt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),K(r,u,c)}function yt(n,t,e){n=xt(n),t=xt(t),e=xt(e);var r=st((.4124564*n+.3575761*t+.1804375*e)/Fa),u=st((.2126729*n+.7151522*t+.072175*e)/Oa),i=st((.0193339*n+.119192*t+.9503041*e)/Ya);return ut(116*u-16,500*(r-u),200*(u-i))}function xt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Mt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function _t(n){return"function"==typeof n?n:function(){return n}}function bt(n){return n}function wt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),St(t,e,n,r)}}function St(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Xo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Go.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Xo.event;Xo.event=n;try{o.progress.call(i,c)}finally{Xo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Bo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Xo.rebind(i,o,"on"),null==r?i:i.get(kt(r))}function kt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Et(){var n=At(),t=Ct()-n;t>24?(isFinite(t)&&(clearTimeout(Wa),Wa=setTimeout(Et,t)),Ba=0):(Ba=1,Ga(Et))}function At(){var n=Date.now();for(Ja=Xa;Ja;)n>=Ja.t&&(Ja.f=Ja.c(n-Ja.t)),Ja=Ja.n;return n}function Ct(){for(var n,t=Xa,e=1/0;t;)t.f?t=n?n.n=t.n:Xa=t.n:(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function zt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t>0&&o>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:bt;return function(n){var e=Qa.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(s||"0"===r&&"="===o)&&(s=r="0",o="=",f&&(l-=Math.floor((l-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=nc.get(g)||qt;var y=s&&f;return function(n){if(m&&n%1)return"";var e=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var u=Xo.formatPrefix(n,h);n=u.scale(n),d=u.symbol}else n*=p;n=g(n,h);var c=n.lastIndexOf("."),x=0>c?n:n.substring(0,c),M=0>c?"":t+n.substring(c+1);!s&&f&&(x=i(x));var _=v.length+x.length+M.length+(y?0:e.length),b=l>_?new Array(_=l-_+1).join(r):"";return y&&(x=i(b+x)),e+=v,n=x+M,("<"===o?e+n+b:">"===o?b+e+n:"^"===o?b.substring(0,_>>=1)+e+n+b.substring(_):e+(y?n:b+n))+d}}}function qt(n){return n+""}function Tt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Rt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new ec(e-1)),1),e}function i(n,e){return t(n=new ec(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{ec=Tt;var r=new Tt;return r._=n,o(r,t,e)}finally{ec=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Dt(n);return c.floor=c,c.round=Dt(r),c.ceil=Dt(u),c.offset=Dt(i),c.range=a,n}function Dt(n){return function(t,e){try{ec=Tt;var r=new Tt;return r._=t,n(r,e)._}finally{ec=Date}}}function Pt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++aa;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in uc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function s(n,t,r){return e(n,C.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{ec=Tt;var t=new ec;return t._=n,r(t)}finally{ec=Date}}var r=t(n);return e.parse=function(n){try{ec=Tt;var t=r.parse(n);return t&&t._}finally{ec=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ee;var x=Xo.map(),M=jt(v),_=Ht(v),b=jt(d),w=Ht(d),S=jt(m),k=Ht(m),E=jt(y),A=Ht(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Ut(n.getDate(),t,2)},e:function(n,t){return Ut(n.getDate(),t,2)},H:function(n,t){return Ut(n.getHours(),t,2)},I:function(n,t){return Ut(n.getHours()%12||12,t,2)},j:function(n,t){return Ut(1+tc.dayOfYear(n),t,3)},L:function(n,t){return Ut(n.getMilliseconds(),t,3)},m:function(n,t){return Ut(n.getMonth()+1,t,2)},M:function(n,t){return Ut(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Ut(n.getSeconds(),t,2)},U:function(n,t){return Ut(tc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ut(tc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Ut(n.getFullYear()%100,t,2)},Y:function(n,t){return Ut(n.getFullYear()%1e4,t,4)},Z:ne,"%":function(){return"%"}},N={a:r,A:u,b:i,B:o,c:a,d:Bt,e:Bt,H:Jt,I:Jt,j:Wt,L:Qt,m:$t,M:Gt,p:l,S:Kt,U:Ot,w:Ft,W:Yt,x:c,X:s,y:Zt,Y:It,Z:Vt,"%":te};return t}function Ut(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function jt(n){return new RegExp("^(?:"+n.map(Xo.requote).join("|")+")","i")}function Ht(n){for(var t=new u,e=-1,r=n.length;++e68?1900:2e3)}function $t(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Bt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Wt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Jt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Gt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Kt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Qt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ne(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(oa(t)/60),u=oa(t)%60;return e+Ut(r,"0",2)+Ut(u,"0",2)}function te(n,t,e){oc.lastIndex=0;var r=oc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ee(n){for(var t=n.length,e=-1;++ea;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new ke(e,n,null,!0),s=new ke(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new ke(r,n,null,!1),s=new ke(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Se(i),Se(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Se(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Ae))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Xo.merge(g);var n=Le(m,p);g.length?we(g,Ne,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Ce(),M=t(x);return y}}function Ae(n){return n.length>1}function Ce(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:g,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ne(n,t){return((n=n.x)[0]<0?n[1]-Ea-Aa:Ea-n[1])-((t=t.x)[0]<0?t[1]-Ea-Aa:Ea-t[1])}function Le(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+Sa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+Sa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=oa(_)>Sa,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_>=0?ka:-ka):_,b^h>=e^m>=e){var S=fe(se(f),se(n));pe(S);var k=fe(u,S);pe(k);var E=(b^_>=0?-1:1)*X(k[2]);(r>E||r===E&&(S[0]||S[1]))&&(o+=b^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Aa>i||Aa>i&&0>hc)^1&o}function ze(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Sa:-Sa,c=oa(i-e);oa(c-Sa)0?Ea:-Ea),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Sa&&(oa(e-u)Aa?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function Te(n,t,e,r){var u;if(null==n)u=e*Ea,r.point(-Sa,u),r.point(0,u),r.point(Sa,u),r.point(Sa,0),r.point(Sa,-u),r.point(0,-u),r.point(-Sa,-u),r.point(-Sa,0),r.point(-Sa,u);else if(oa(n[0]-t[0])>Aa){var i=n[0]i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Sa:-Sa),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(de(e,g)||de(p,g))&&(p[0]+=Aa,p[1]+=Aa,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&de(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=se(n),u=se(t),o=[1,0,0],a=fe(r,u),c=le(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=fe(o,a),p=ge(o,f),v=ge(a,h);he(p,v);var d=g,m=le(p,d),y=le(d,d),x=m*m-y*(le(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ge(d,(-m-M)/y);if(he(_,p),_=ve(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=oa(A-Sa)A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(oa(_[0]-w)Sa^(w<=_[0]&&_[0]<=S)){var L=ge(d,(-m+M)/y);return he(L,p),[_,ve(L)]}}}function u(t,e){var r=o?n:Sa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=oa(i)>Aa,c=cr(n,6*Na);return Ee(t,e,c,o?[0,-n]:[-Sa,n-Sa])}function De(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Pe(n,t,e,r){function u(r,u){return oa(r[0]-n)0?0:3:oa(r[0]-e)0?2:1:oa(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c>o;++o)i=a[o],s[1]<=r?i[1]>r&&Z(s,i,n)>0&&++t:i[1]<=r&&Z(s,i,n)<0&&--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){l(n,t)&&a.point(n,t)}function h(){N.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&A.rejoin(),v.push(A.buffer())),N.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=l(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=Ce(),C=De(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Xo.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&&we(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return N}}function Ue(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function je(n){var t=0,e=Sa/3,r=nr(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Sa/180,e=n[1]*Sa/180):[180*(t/Sa),180*(e/Sa)]},u}function He(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,X((i-(n*n+e*e)*u*u)/(2*u))]},e}function Fe(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function Oe(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),zc>t&&(zc=t),t>Tc&&(Tc=t)}function Ye(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Ie(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ie(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Ie(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Ze(n,t){dc+=n,mc+=t,++yc}function Ve(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,Ze(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,Ze(t=r,e=u)}}function Xe(){Pc.point=Ze}function $e(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,Ze(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,Ze(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function Be(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,ka)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:g};return a}function We(n){function t(n){return(a?r:e)(n)}function e(t){return Ke(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=se([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=oa(oa(w)-1)i||oa((y*L+x*z)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Na),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function Je(n){var t=We(function(t,e){return n([t*La,e*La])});return function(n){return tr(t(n))}}function Ge(n){this.stream=n}function Ke(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Qe(n){return nr(function(){return n})()}function nr(n){function t(n){return n=a(n[0]*Na,n[1]*Na),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*La,n[1]*La]}function r(){a=Ue(o=ur(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=We(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=bt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=tr(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):Re((b=+n)*Na),u()):b +},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Pe(n[0][0],n[0][1],n[1][0],n[1][1]):bt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Na,d=n[1]%360*Na,r()):[v*La,d*La]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Na,y=n[1]%360*Na,x=n.length>2?n[2]%360*Na:0,r()):[m*La,y*La,x*La]},Xo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function tr(n){return Ke(n,function(t,e){n.point(t*Na,e*Na)})}function er(n,t){return[n,t]}function rr(n,t){return[n>Sa?n-ka:-Sa>n?n+ka:n,t]}function ur(n,t,e){return n?t||e?Ue(or(n),ar(t,e)):or(n):t||e?ar(t,e):rr}function ir(n){return function(t,e){return t+=n,[t>Sa?t-ka:-Sa>t?t+ka:t,e]}}function or(n){var t=ir(n);return t.invert=ir(-n),t}function ar(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),X(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),X(l*r-a*u)]},e}function cr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=sr(e,u),i=sr(e,i),(o>0?i>u:u>i)&&(u+=o*ka)):(u=n+o*ka,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=ve([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function sr(n,t){var e=se(t);e[0]-=n,pe(e);var r=V(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Aa)%(2*Math.PI)}function lr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function fr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function hr(n){return n.source}function gr(n){return n.target}function pr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(J(r-t)+u*o*J(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*La,Math.atan2(o,Math.sqrt(r*r+u*u))*La]}:function(){return[n*La,t*La]};return p.distance=h,p}function vr(){function n(n,u){var i=Math.sin(u*=Na),o=Math.cos(u),a=oa((n*=Na)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*Na,e=Math.sin(i*=Na),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=g}}function dr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function mr(n,t){function e(n,t){var e=oa(oa(t)-Ea)u;u++){for(;r>1&&Z(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function kr(n,t){return n[0]-t[0]||n[1]-t[1]}function Er(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Ar(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function Cr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Nr(){Jr(this),this.edge=this.site=this.circle=null}function Lr(n){var t=Jc.pop()||new Nr;return t.site=n,t}function zr(n){Or(n),$c.remove(n),Jc.push(n),Jr(n)}function qr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];zr(n);for(var c=i;c.circle&&oa(e-c.circle.x)l;++l)s=a[l],c=a[l-1],$r(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Vr(c.site,s.site,null,u),Fr(c),Fr(s)}function Tr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=Rr(a,o)-i,r>Aa)a=a.L;else{if(u=i-Dr(a,o),!(u>Aa)){r>-Aa?(t=a.P,e=a):u>-Aa?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Lr(n);if($c.insert(t,c),t||e){if(t===e)return Or(t),e=Lr(t.site),$c.insert(c,e),c.edge=e.edge=Vr(t.site,c.site),Fr(t),Fr(e),void 0;if(!e)return c.edge=Vr(t.site,c.site),void 0;Or(t),Or(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};$r(e.edge,s,p,M),c.edge=Vr(s,n,null,M),e.edge=Vr(n,p,null,M),Fr(t),Fr(e)}}function Rr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Dr(n,t){var e=n.N;if(e)return Rr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Pr(n){this.site=n,this.edges=[]}function Ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(oa(r-t)>Aa||oa(u-e)>Aa)&&(a.splice(o,0,new Br(Xr(i.site,l,oa(r-f)Aa?{x:f,y:oa(t-f)Aa?{x:oa(e-p)Aa?{x:h,y:oa(t-h)Aa?{x:oa(e-g)=-Ca)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new Hr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.yd||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.yg){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.xr;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=su(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function fu(n,t){for(var e,r=Xo.interpolators.length;--r>=0&&!(e=Xo.interpolators[r](n,t)););return e}function hu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(fu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function gu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function pu(n){return function(t){return 1-n(1-t)}}function vu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function du(n){return n*n}function mu(n){return n*n*n}function yu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function xu(n){return function(t){return Math.pow(t,n)}}function Mu(n){return 1-Math.cos(n*Ea)}function _u(n){return Math.pow(2,10*(n-1))}function bu(n){return 1-Math.sqrt(1-n*n)}function wu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/ka*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*ka/t)}}function Su(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function ku(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Eu(n,t){n=Xo.hcl(n),t=Xo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return rt(e+i*n,r+o*n,u+a*n)+""}}function Au(n,t){n=Xo.hsl(n),t=Xo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return nt(e+i*n,r+o*n,u+a*n)+""}}function Cu(n,t){n=Xo.lab(n),t=Xo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ot(e+i*n,r+o*n,u+a*n)+""}}function Nu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Lu(n){var t=[n.a,n.b],e=[n.c,n.d],r=qu(t),u=zu(t,e),i=qu(Tu(e,t,-u))||0;t[0]*e[1]180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:su(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:su(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:su(g[0],p[0])},{i:e-2,x:su(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++ie;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ei(n){return n.reduce(ri,0)}function ri(n,t){return n+t[1]}function ui(n,t){return ii(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ii(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function oi(n){return[Xo.min(n),Xo.max(n)]}function ai(n,t){return n.parent==t.parent?1:2}function ci(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function si(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function li(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i0&&(n=r);return n}function fi(n,t){return n.x-t.x}function hi(n,t){return t.x-n.x}function gi(n,t){return n.depth-t.depth}function pi(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function di(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function mi(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function yi(n,t){return n.value-t.value}function xi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Mi(n,t){n._pack_next=t,t._pack_prev=n}function _i(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function bi(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(wi),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],Ei(r,u,i),t(i),xi(r,i),r._pack_prev=i,xi(i,u),u=r._pack_next,o=3;s>o;o++){Ei(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(_i(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!_i(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.ro;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Si)}}function wi(n){n._pack_next=n._pack_prev=n}function Si(n){delete n._pack_next,delete n._pack_prev}function ki(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++iu&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ti(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ri(n){return n.rangeExtent?n.rangeExtent():Ti(n.range())}function Di(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Pi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ls}function ji(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?ji:Di,c=r?Pu:Du;return o=u(n,t,c,e),a=u(t,n,c,fu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Nu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Ii(n,t)},i.tickFormat=function(t,e){return Zi(n,t,e)},i.nice=function(t){return Oi(n,t),u()},i.copy=function(){return Hi(n,t,e,r)},u()}function Fi(n,t){return Xo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Oi(n,t){return Pi(n,Ui(Yi(n,t)[2]))}function Yi(n,t){null==t&&(t=10);var e=Ti(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Ii(n,t){return Xo.range.apply(Xo,Yi(n,t))}function Zi(n,t,e){var r=Yi(n,t);return Xo.format(e?e.replace(Qa,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+Xi(l,r),l].join("")}):",."+Vi(r[2])+"f")}function Vi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Xi(n,t){var e=Vi(t[2]);return n in fs?Math.abs(e-Vi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function $i(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Pi(r.map(u),e?Math:gs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Ti(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++0;h--)o.push(i(s)*h);for(s=0;o[s]c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return hs;arguments.length<2?t=hs:"function"!=typeof t&&(t=Xo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return $i(n.copy(),t,e,r)},Fi(o,n)}function Bi(n,t,e){function r(t){return n(u(t))}var u=Wi(t),i=Wi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Ii(e,n)},r.tickFormat=function(n,t){return Zi(e,n,t)},r.nice=function(n){return r.domain(Oi(e,n))},r.exponent=function(o){return arguments.length?(u=Wi(t=o),i=Wi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Bi(n.copy(),t,e)},Fi(r,n)}function Wi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Ji(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return Xo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++ae?[0/0,0/0]:[e>0?u[e-1]:n[0],et?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Ki(n,t,e)},u()}function Qi(n,t){function e(e){return e>=e?t[Xo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Qi(n,t)},e}function no(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Ii(n,t)},t.tickFormat=function(t,e){return Zi(n,t,e)},t.copy=function(){return no(n)},t}function to(n){return n.innerRadius}function eo(n){return n.outerRadius}function ro(n){return n.startAngle}function uo(n){return n.endAngle}function io(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=_t(e),p=_t(r);++f1&&u.push("H",r[0]),u.join("")}function so(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Eo(n){return n.length<3?oo(n):n[0]+po(n,ko(n))}function Ao(n){for(var t,e,r,u=-1,i=n.length;++ue?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),Xo.timer(function(){return p.c=c(r||1)?be:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ja,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function Ho(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Fo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Xo.bisect(js,u);return i==js.length?[t.year,Yi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/js[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Ti(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},Fi(r,n)}function Io(n){return new Date(n)}function Zo(n){return JSON.parse(n.responseText)}function Vo(n){var t=Wo.createRange();return t.selectNode(Wo.body),t.createContextualFragment(n.responseText)}var Xo={version:"3.4.1"};Date.now||(Date.now=function(){return+new Date});var $o=[].slice,Bo=function(n){return $o.call(n)},Wo=document,Jo=Wo.documentElement,Go=window;try{Bo(Jo.childNodes)[0].nodeType}catch(Ko){Bo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Wo.createElement("div").style.setProperty("opacity",0,"")}catch(Qo){var na=Go.Element.prototype,ta=na.setAttribute,ea=na.setAttributeNS,ra=Go.CSSStyleDeclaration.prototype,ua=ra.setProperty;na.setAttribute=function(n,t){ta.call(this,n,t+"")},na.setAttributeNS=function(n,t,e){ea.call(this,n,t,e+"")},ra.setProperty=function(n,t,e){ua.call(this,n,t+"",e)}}Xo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},Xo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Xo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ur&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ur&&(e=r)}return e},Xo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ue&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ue&&(e=r)}return e},Xo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i=e);)e=u=void 0;for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=e);)e=void 0;for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},Xo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i1&&(t=t.map(e)),t=t.filter(n),t.length?Xo.quantile(t.sort(Xo.ascending),.5):void 0},Xo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)r;){var i=r+u>>>1;er?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Xo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=Xo.min(arguments,t),r=new Array(e);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var oa=Math.abs;Xo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(oa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(Xo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},Xo.set=function(n){var t=new l;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(l,{has:i,add:function(n){return this[aa+n]=!0,n},remove:function(n){return n=aa+n,n in this&&delete this[n]},values:a,size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1))}}),Xo.behavior={},Xo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Xo.event=null,Xo.requote=function(n){return n.replace(la,"\\$&")};var la=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,fa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ha=function(n,t){return t.querySelector(n)},ga=function(n,t){return t.querySelectorAll(n)},pa=Jo[h(Jo,"matchesSelector")],va=function(n,t){return pa.call(n,t)};"function"==typeof Sizzle&&(ha=function(n,t){return Sizzle(n,t)[0]||null},ga=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},va=Sizzle.matchesSelector),Xo.selection=function(){return xa};var da=Xo.selection.prototype=[];da.select=function(n){var t,e,r,u,i=[];n=M(n);for(var o=-1,a=this.length;++o=0&&(e=n.substring(0,t),n=n.substring(t+1)),ma.hasOwnProperty(e)?{space:ma[e],local:n}:n}},da.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Xo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(b(t,n[t]));return this}return this.each(b(n,t))},da.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=k(n)).length,u=-1;if(t=e.classList){for(;++ur){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return Go.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(C(n,t,e))},da.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(N(t,n[t]));return this}return this.each(N(n,t))},da.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},da.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},da.append=function(n){return n=L(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},da.insert=function(n,t){return n=L(n),t=M(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},da.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},da.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++rr;++r)p[r]=z(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++oi;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return x(u)},da.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},da.sort=function(n){n=T.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},da.size=function(){var n=0;return this.each(function(){++n}),n};var ya=[];Xo.selection.enter=D,Xo.selection.enter.prototype=ya,ya.append=da.append,ya.empty=da.empty,ya.node=da.node,ya.call=da.call,ya.size=da.size,ya.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(j(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(j(n,t,e))};var Ma=Xo.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ma.forEach(function(n){"on"+n in Wo&&Ma.remove(n)});var _a="onselectstart"in Wo?null:h(Jo.style,"userSelect"),ba=0;Xo.mouse=function(n){return Y(n,m())};var wa=/WebKit/.test(Go.navigator.userAgent)?-1:0;Xo.touches=function(n,t){return arguments.length<2&&(t=m().touches),t?Bo(t).map(function(t){var e=Y(n,t);return e.identifier=t.identifier,e}):[]},Xo.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return Xo.event.changedTouches[0].identifier}function e(n,t){return Xo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&Xo.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=Xo.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=Xo.select(Go).on(e+"."+p,o).on(r+"."+p,a),y=O();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=y(n,"drag","dragstart","dragend"),i=null,o=r(g,Xo.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},Xo.rebind(n,u,"on")};var Sa=Math.PI,ka=2*Sa,Ea=Sa/2,Aa=1e-6,Ca=Aa*Aa,Na=Sa/180,La=180/Sa,za=Math.SQRT2,qa=2,Ta=4;Xo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=B(v),o=i/(qa*h)*(e*W(za*t+v)-$(v));return[r+o*s,u+o*l,i*e/B(za*t+v)]}return[r+n*s,u+n*l,i*Math.exp(za*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ta*f)/(2*i*qa*h),p=(c*c-i*i-Ta*f)/(2*c*qa*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/za;return e.duration=1e3*y,e},Xo.behavior.zoom=function(){function n(n){n.on(A,s).on(Pa+".zoom",f).on(C,h).on("dblclick.zoom",g).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u(Xo.mouse(r),g),a(i)}function e(){f.on(C,Go===r?h:null).on(N,null),p(l&&Xo.event.target===s),c(i)}var r=this,i=z.of(r,arguments),s=Xo.event.target,l=0,f=Xo.select(Go).on(C,n).on(N,e),g=t(Xo.mouse(r)),p=O();U.call(r),o(i)}function l(){function n(){var n=Xo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=Xo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=v[s.identifier];r(2*S.k),u(s,l),d(),a(p)}x=c}else if(o.length>1){var s=o[0],f=o[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function i(){for(var n,t,e,i,o=Xo.touches(g),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}x=null,u(n,t),a(p)}function f(){if(Xo.event.touches.length){for(var t=Xo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(p)}var h,g=this,p=z.of(g,arguments),v={},m=0,y=Xo.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=Xo.select(Go).on(M,i).on(_,f),w=Xo.select(g).on(A,null).on(L,e),k=O();U.call(g),e(),o(p)}function f(){var n=z.of(this,arguments);m?clearTimeout(m):(U.call(this),o(n)),m=setTimeout(function(){m=null,c(n)},50),d();var e=v||Xo.mouse(this);p||(p=t(e)),r(Math.pow(2,.002*Ra())*S.k),u(e,p),a(n)}function h(){p=null}function g(){var n=z.of(this,arguments),e=Xo.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Xo.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var p,v,m,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Da,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",z=y(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=z.of(this,arguments),t=S;ks?Xo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Xo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Da:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Xo.rebind(n,z,"on")};var Ra,Da=[0,1/0],Pa="onwheel"in Wo?(Ra=function(){return-Xo.event.deltaY*(Xo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Wo?(Ra=function(){return Xo.event.wheelDelta},"mousewheel"):(Ra=function(){return-Xo.event.detail},"MozMousePixelScroll");G.prototype.toString=function(){return this.rgb()+""},Xo.hsl=function(n,t,e){return 1===arguments.length?n instanceof Q?K(n.h,n.s,n.l):dt(""+n,mt,K):K(+n,+t,+e)};var Ua=Q.prototype=new G;Ua.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,this.l/n)},Ua.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,n*this.l)},Ua.rgb=function(){return nt(this.h,this.s,this.l)},Xo.hcl=function(n,t,e){return 1===arguments.length?n instanceof et?tt(n.h,n.c,n.l):n instanceof it?at(n.l,n.a,n.b):at((n=yt((n=Xo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):tt(+n,+t,+e)};var ja=et.prototype=new G;ja.brighter=function(n){return tt(this.h,this.c,Math.min(100,this.l+Ha*(arguments.length?n:1)))},ja.darker=function(n){return tt(this.h,this.c,Math.max(0,this.l-Ha*(arguments.length?n:1)))},ja.rgb=function(){return rt(this.h,this.c,this.l).rgb()},Xo.lab=function(n,t,e){return 1===arguments.length?n instanceof it?ut(n.l,n.a,n.b):n instanceof et?rt(n.l,n.c,n.h):yt((n=Xo.rgb(n)).r,n.g,n.b):ut(+n,+t,+e)};var Ha=18,Fa=.95047,Oa=1,Ya=1.08883,Ia=it.prototype=new G;Ia.brighter=function(n){return ut(Math.min(100,this.l+Ha*(arguments.length?n:1)),this.a,this.b)},Ia.darker=function(n){return ut(Math.max(0,this.l-Ha*(arguments.length?n:1)),this.a,this.b)},Ia.rgb=function(){return ot(this.l,this.a,this.b)},Xo.rgb=function(n,t,e){return 1===arguments.length?n instanceof pt?gt(n.r,n.g,n.b):dt(""+n,gt,nt):gt(~~n,~~t,~~e)};var Za=pt.prototype=new G;Za.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),gt(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):gt(u,u,u)},Za.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),gt(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Za.hsl=function(){return mt(this.r,this.g,this.b)},Za.toString=function(){return"#"+vt(this.r)+vt(this.g)+vt(this.b)};var Va=Xo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Va.forEach(function(n,t){Va.set(n,ft(t))}),Xo.functor=_t,Xo.xhr=wt(bt),Xo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=St(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new l,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Xo.csv=Xo.dsv(",","text/csv"),Xo.tsv=Xo.dsv(" ","text/tab-separated-values");var Xa,$a,Ba,Wa,Ja,Ga=Go[h(Go,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Xo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};$a?$a.n=i:Xa=i,$a=i,Ba||(Wa=clearTimeout(Wa),Ba=1,Ga(Et))},Xo.timer.flush=function(){At(),Ct()},Xo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ka=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Lt);Xo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Xo.round(n,Nt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Ka[8+e/3]};var Qa=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,nc=Xo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Xo.round(n,Nt(n,t))).toFixed(Math.max(0,Math.min(20,Nt(n*(1+1e-15),t))))}}),tc=Xo.time={},ec=Date;Tt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){rc.setUTCDate.apply(this._,arguments)},setDay:function(){rc.setUTCDay.apply(this._,arguments)},setFullYear:function(){rc.setUTCFullYear.apply(this._,arguments)},setHours:function(){rc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){rc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){rc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){rc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){rc.setUTCSeconds.apply(this._,arguments)},setTime:function(){rc.setTime.apply(this._,arguments)}};var rc=Date.prototype;tc.year=Rt(function(n){return n=tc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),tc.years=tc.year.range,tc.years.utc=tc.year.utc.range,tc.day=Rt(function(n){var t=new ec(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),tc.days=tc.day.range,tc.days.utc=tc.day.utc.range,tc.dayOfYear=function(n){var t=tc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=tc[n]=Rt(function(n){return(n=tc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});tc[n+"s"]=e.range,tc[n+"s"].utc=e.utc.range,tc[n+"OfYear"]=function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)}}),tc.week=tc.sunday,tc.weeks=tc.sunday.range,tc.weeks.utc=tc.sunday.utc.range,tc.weekOfYear=tc.sundayOfYear;var uc={"-":"",_:" ",0:"0"},ic=/^\s*\d+/,oc=/^%/;Xo.locale=function(n){return{numberFormat:zt(n),timeFormat:Pt(n)}};var ac=Xo.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Xo.format=ac.numberFormat,Xo.geo={},re.prototype={s:0,t:0,add:function(n){ue(n,this.t,cc),ue(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new re;Xo.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):ie(n,t)};var sc={Feature:function(n,t){ie(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*Sa+n:n,gc.lineStart=gc.lineEnd=gc.point=g}};Xo.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=se([t*Na,e*Na]);if(m){var u=fe(m,r),i=[u[1],-u[0],0],o=fe(i,u);pe(o),o=ve(o);var c=t-p,s=c>0?1:-1,v=o[0]*La*s,d=oa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*La;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*La;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=oa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),oa(y)>Aa&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nhc?(l=-(h=180),f=-(g=90)):y>Aa?g=90:-Aa>y&&(f=-90),M[0]=l,M[1]=h +}};return function(n){g=h=-(l=f=1/0),x=[],Xo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Xo.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Ca>u&&(t=xc,e=Mc,r=_c,Aa>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Ca>u)?[0/0,0/0]:[Math.atan2(e,t)*La,X(r/Math.sqrt(u))*La]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:g,point:me,lineStart:xe,lineEnd:Me,polygonStart:function(){kc.lineStart=_e},polygonEnd:function(){kc.lineStart=xe}},Ec=Ee(be,ze,Te,[-Sa,-Sa/2]),Ac=1e9;Xo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Pe(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Xo.geo.conicEqualArea=function(){return je(He)}).raw=He,Xo.geo.albers=function(){return Xo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Xo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Xo.geo.albers(),o=Xo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Xo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Aa,f+.12*s+Aa],[l-.214*s-Aa,f+.234*s-Aa]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Aa,f+.166*s+Aa],[l-.115*s-Aa,f+.234*s-Aa]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,zc,qc,Tc,Rc={point:g,lineStart:g,lineEnd:g,polygonStart:function(){Nc=0,Rc.lineStart=Fe},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=g,Cc+=oa(Nc/2)}},Dc={point:Oe,lineStart:g,lineEnd:g,polygonStart:g,polygonEnd:g},Pc={point:Ze,lineStart:Ve,lineEnd:Xe,polygonStart:function(){Pc.lineStart=$e},polygonEnd:function(){Pc.point=Ze,Pc.lineStart=Ve,Pc.lineEnd=Xe}};Xo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Xo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,Xo.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=Tc=-(Lc=zc=1/0),Xo.geo.stream(n,u(Dc)),[[Lc,zc],[qc,Tc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Je(n):bt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ye:new Be(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Xo.geo.albersUsa()).context(null)},Xo.geo.transform=function(n){return{stream:function(t){var e=new Ge(t);for(var r in n)e[r]=n[r];return e}}},Ge.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Xo.geo.projection=Qe,Xo.geo.projectionMutator=nr,(Xo.geo.equirectangular=function(){return Qe(er)}).raw=er.invert=er,Xo.geo.rotation=function(n){function t(t){return t=n(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t}return n=ur(n[0]%360*Na,n[1]*Na,n.length>2?n[2]*Na:0),t.invert=function(t){return t=n.invert(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t},t},rr.invert=er,Xo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=ur(-n[0]*Na,-n[1]*Na,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=La,n[1]*=La}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=cr((t=+r)*Na,u*Na),n):t},n.precision=function(r){return arguments.length?(e=cr(t*Na,(u=+r)*Na),n):u},n.angle(90)},Xo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Na,u=n[1]*Na,i=t[1]*Na,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Xo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Xo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Xo.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Xo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return oa(n%d)>Aa}).map(l)).concat(Xo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return oa(n%m)>Aa}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=lr(a,o,90),f=fr(r,e,y),h=lr(s,c,90),g=fr(i,u,y),n):y},n.majorExtent([[-180,-90+Aa],[180,90-Aa]]).minorExtent([[-180,-80-Aa],[180,80+Aa]])},Xo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=hr,u=gr;return n.distance=function(){return Xo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Xo.geo.interpolate=function(n,t){return pr(n[0]*Na,n[1]*Na,t[0]*Na,t[1]*Na)},Xo.geo.length=function(n){return Uc=0,Xo.geo.stream(n,jc),Uc};var Uc,jc={sphere:g,point:g,lineStart:vr,lineEnd:g,polygonStart:g,polygonEnd:g},Hc=dr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Xo.geo.azimuthalEqualArea=function(){return Qe(Hc)}).raw=Hc;var Fc=dr(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},bt);(Xo.geo.azimuthalEquidistant=function(){return Qe(Fc)}).raw=Fc,(Xo.geo.conicConformal=function(){return je(mr)}).raw=mr,(Xo.geo.conicEquidistant=function(){return je(yr)}).raw=yr;var Oc=dr(function(n){return 1/n},Math.atan);(Xo.geo.gnomonic=function(){return Qe(Oc)}).raw=Oc,xr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ea]},(Xo.geo.mercator=function(){return Mr(xr)}).raw=xr;var Yc=dr(function(){return 1},Math.asin);(Xo.geo.orthographic=function(){return Qe(Yc)}).raw=Yc;var Ic=dr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Xo.geo.stereographic=function(){return Qe(Ic)}).raw=Ic,_r.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ea]},(Xo.geo.transverseMercator=function(){var n=Mr(_r),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[-n[1],n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},n.rotate([0,0])}).raw=_r,Xo.geom={},Xo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=_t(e),i=_t(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(kr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var s=Sr(a),l=Sr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t>=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Aa)*Aa,y:Math.round(o(n,t)/Aa)*Aa,i:t}})}var r=br,u=wr,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return nu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return nu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(jr),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=iu()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=_t(a),M=_t(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.xm&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=iu();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){ou(n,k,v,d,m,y)},g=-1,null==t){for(;++g=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||bt,gu(r(e.apply(null,$o.call(arguments,1))))},Xo.interpolateHcl=Eu,Xo.interpolateHsl=Au,Xo.interpolateLab=Cu,Xo.interpolateRound=Nu,Xo.transform=function(n){var t=Wo.createElementNS(Xo.ns.prefix.svg,"g");return(Xo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Lu(e?e.matrix:rs)})(n)},Lu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};Xo.interpolateTransform=Ru,Xo.layout={},Xo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/d){if(p>c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&&c&&p>c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Xo.event.x,n.py=Xo.event.y,a.resume()}var e,r,u,i,o,a={},c=Xo.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=os,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Zu(t=Xo.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Xo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++at;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Xo.behavior.drag().origin(bt).on("dragstart.force",Fu).on("drag.force",t).on("dragend.force",Ou)),arguments.length?(this.on("mouseover.force",Yu).on("mouseout.force",Iu).call(e),void 0):e},Xo.rebind(a,c,"on")};var us=20,is=1,os=1/0;Xo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++fg;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=bt,e=Qu,r=ni,u=Ku,i=Ju,o=Gu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:cs.get(t)||Qu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:ss.get(t)||ni,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var cs=Xo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(ti),i=n.map(ei),o=Xo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Xo.range(n.length).reverse()},"default":Qu}),ss=Xo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ni});Xo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=l[0]&&a<=l[1]&&(o=c[Xo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=oi,u=ui;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=_t(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return ii(n,t)}:_t(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Xo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h0&&(di(mi(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!si(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!ci(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];pi(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=li(l,hi),h=li(l,fi),g=li(l,gi),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return pi(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,pi(a,function(n){n.r=+l(n.value)}),pi(a,bi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;pi(a,function(n){n.r+=f}),pi(a,bi),pi(a,function(n){n.r-=f})}return ki(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Xo.layout.hierarchy().sort(yi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Vu(n,e)},Xo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;pi(c,function(n){var t=n.children;t&&t.length?(n.x=Ci(t),n.y=Ai(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ni(c),f=Li(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return pi(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++oe&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++ie.dx)&&(l=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Xo.random.normal.apply(Xo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Xo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Xo.scale={};var ls={floor:bt,ceil:bt};Xo.scale.linear=function(){return Hi([0,1],[0,1],fu,!1)};var fs={s:1,g:1,p:1,r:1,e:1};Xo.scale.log=function(){return $i(Xo.scale.linear().domain([0,1]),10,!0,[1,10])};var hs=Xo.format(".0e"),gs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Xo.scale.pow=function(){return Bi(Xo.scale.linear(),1,[0,1])},Xo.scale.sqrt=function(){return Xo.scale.pow().exponent(.5)},Xo.scale.ordinal=function(){return Ji([],{t:"range",a:[[]]})},Xo.scale.category10=function(){return Xo.scale.ordinal().range(ps)},Xo.scale.category20=function(){return Xo.scale.ordinal().range(vs)},Xo.scale.category20b=function(){return Xo.scale.ordinal().range(ds)},Xo.scale.category20c=function(){return Xo.scale.ordinal().range(ms)};var ps=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ht),vs=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ht),ds=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ht),ms=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ht);Xo.scale.quantile=function(){return Gi([],[]) +},Xo.scale.quantize=function(){return Ki(0,1,[0,1])},Xo.scale.threshold=function(){return Qi([.5],[0,1])},Xo.scale.identity=function(){return no([0,1])},Xo.svg={},Xo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ys,a=u.apply(this,arguments)+ys,c=(o>a&&(c=o,o=a,a=c),a-o),s=Sa>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=xs?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=to,e=eo,r=ro,u=uo;return n.innerRadius=function(e){return arguments.length?(t=_t(e),n):t},n.outerRadius=function(t){return arguments.length?(e=_t(t),n):e},n.startAngle=function(t){return arguments.length?(r=_t(t),n):r},n.endAngle=function(t){return arguments.length?(u=_t(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ys;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ys=-Ea,xs=ka-Aa;Xo.svg.line=function(){return io(bt)};var Ms=Xo.map({linear:oo,"linear-closed":ao,step:co,"step-before":so,"step-after":lo,basis:mo,"basis-open":yo,"basis-closed":xo,bundle:Mo,cardinal:go,"cardinal-open":fo,"cardinal-closed":ho,monotone:Eo});Ms.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var _s=[0,2/3,1/3,0],bs=[0,1/3,2/3,0],ws=[0,1/6,2/3,1/6];Xo.svg.line.radial=function(){var n=io(Ao);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},so.reverse=lo,lo.reverse=so,Xo.svg.area=function(){return Co(bt)},Xo.svg.area.radial=function(){var n=Co(Ao);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Xo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ys,l=s.call(n,u,r)+ys;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Sa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=hr,o=gr,a=No,c=ro,s=uo;return n.radius=function(t){return arguments.length?(a=_t(t),n):a},n.source=function(t){return arguments.length?(i=_t(t),n):i},n.target=function(t){return arguments.length?(o=_t(t),n):o},n.startAngle=function(t){return arguments.length?(c=_t(t),n):c},n.endAngle=function(t){return arguments.length?(s=_t(t),n):s},n},Xo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=hr,e=gr,r=Lo;return n.source=function(e){return arguments.length?(t=_t(e),n):t},n.target=function(t){return arguments.length?(e=_t(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Xo.svg.diagonal.radial=function(){var n=Xo.svg.diagonal(),t=Lo,e=n.projection;return n.projection=function(n){return arguments.length?e(zo(t=n)):t},n},Xo.svg.symbol=function(){function n(n,r){return(Ss.get(t.call(this,n,r))||Ro)(e.call(this,n,r))}var t=To,e=qo;return n.type=function(e){return arguments.length?(t=_t(e),n):t},n.size=function(t){return arguments.length?(e=_t(t),n):e},n};var Ss=Xo.map({circle:Ro,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cs)),e=t*Cs;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Xo.svg.symbolTypes=Ss.keys();var ks,Es,As=Math.sqrt(3),Cs=Math.tan(30*Na),Ns=[],Ls=0;Ns.call=da.call,Ns.empty=da.empty,Ns.node=da.node,Ns.size=da.size,Xo.transition=function(n){return arguments.length?ks?n.transition():n:xa.transition()},Xo.transition.prototype=Ns,Ns.select=function(n){var t,e,r,u=this.id,i=[];n=M(n);for(var o=-1,a=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Do(u,this.id)},Ns.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):R(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Ns.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Ru:fu,a=Xo.ns.qualify(n);return Po(this,"attr."+n,t,a.local?i:u)},Ns.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Xo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Ns.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Go.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=fu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Po(this,"style."+n,t,u)},Ns.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Go.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Ns.text=function(n){return Po(this,"text",n,Uo)},Ns.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Ns.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Xo.ease.apply(Xo,arguments)),R(this,function(e){e.__transition__[t].ease=n}))},Ns.delay=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Ns.duration=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Ns.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Es,u=ks;ks=e,R(this,function(t,r,u){Es=t.__transition__[e],n.call(t,t.__data__,r,u)}),Es=r,ks=u}else R(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Xo.dispatch("start","end"))).on(n,t)});return this},Ns.transition=function(){for(var n,t,e,r,u=this.id,i=++Ls,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,jo(e,s,i,r)),n.push(e)}return Do(o,i)},Xo.svg.axis=function(){function n(n){n.each(function(){var n,s=Xo.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):bt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Aa),d=Xo.transition(p.exit()).style("opacity",Aa).remove(),m=Xo.transition(p).style("opacity",1),y=Ri(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Xo.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=Ho,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Ho,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Fo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Fo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Xo.scale.linear(),r=zs,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in qs?t+"":zs,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var zs="bottom",qs={top:1,right:1,bottom:1,left:1};Xo.svg.brush=function(){function n(i){i.each(function(){var i=Xo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,bt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Ts[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=Xo.transition(i),h=Xo.transition(o);c&&(l=Ri(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=Ri(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Xo.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=f[1],C=2),d())}function p(){32==Xo.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=f[1],C=0,d())}function v(){var n=Xo.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(Xo.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),L[0]=l[+(n[0]p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function y(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Xo.select("body").style("cursor",null),z.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=Xo.select(Xo.event.target),w=a.of(_,arguments),S=Xo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=O(),L=Xo.mouse(_),z=Xo.select(Go).on("keydown.brush",u).on("keyup.brush",p);if(Xo.event.changedTouches?z.on("touchmove.brush",v).on("touchend.brush",y):z.on("mousemove.brush",v).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=f[0]-L[1];else if(k){var q=+/w$/.test(k),T=+/^n/.test(k);M=[l[1-q]-L[0],f[1-T]-L[1]],L[0]=l[q],L[1]=f[T]}else Xo.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Xo.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=y(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=Rs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,ks?Xo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=hu(l,t.x),r=hu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Rs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=Rs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&&(g=!!t),n):c&&s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),s&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(h=u,u=a,a=h))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&f[0]==f[1]},Xo.rebind(n,a,"on")};var Ts={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Rs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Ds=tc.format=ac.timeFormat,Ps=Ds.utc,Us=Ps("%Y-%m-%dT%H:%M:%S.%LZ");Ds.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:Us,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=Us.toString,tc.second=Rt(function(n){return new ec(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),tc.seconds=tc.second.range,tc.seconds.utc=tc.second.utc.range,tc.minute=Rt(function(n){return new ec(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),tc.minutes=tc.minute.range,tc.minutes.utc=tc.minute.utc.range,tc.hour=Rt(function(n){var t=n.getTimezoneOffset()/60;return new ec(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),tc.hours=tc.hour.range,tc.hours.utc=tc.hour.utc.range,tc.month=Rt(function(n){return n=tc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),tc.months=tc.month.range,tc.months.utc=tc.month.utc.range;var js=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Hs=[[tc.second,1],[tc.second,5],[tc.second,15],[tc.second,30],[tc.minute,1],[tc.minute,5],[tc.minute,15],[tc.minute,30],[tc.hour,1],[tc.hour,3],[tc.hour,6],[tc.hour,12],[tc.day,1],[tc.day,2],[tc.week,1],[tc.month,1],[tc.month,3],[tc.year,1]],Fs=Ds.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",be]]),Os={range:function(n,t,e){return Xo.range(+n,+t,e).map(Io)},floor:bt,ceil:bt};Hs.year=tc.year,tc.scale=function(){return Yo(Xo.scale.linear(),Hs,Fs)};var Ys=Hs.map(function(n){return[n[0].utc,n[1]]}),Is=Ps.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",be]]);Ys.year=tc.year.utc,tc.scale.utc=function(){return Yo(Xo.scale.linear(),Ys,Is)},Xo.text=wt(function(n){return n.responseText}),Xo.json=function(n,t){return St(n,"application/json",Zo,t)},Xo.html=function(n,t){return St(n,"text/html",Vo,t)},Xo.xml=wt(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Xo):"object"==typeof module&&module.exports?module.exports=Xo:this.d3=Xo}(); \ No newline at end of file diff --git a/beer_contracts_with_stubs/js/dracula.min.js b/beer_contracts_with_stubs/js/dracula.min.js new file mode 100644 index 000000000..43310d460 --- /dev/null +++ b/beer_contracts_with_stubs/js/dracula.min.js @@ -0,0 +1 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Dracula=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o=lower?number:lower}}return number}module.exports=baseClamp},{}],34:[function(require,module,exports){var baseForOwn=require("./_baseForOwn"),createBaseEach=require("./_createBaseEach");var baseEach=createBaseEach(baseForOwn);module.exports=baseEach},{"./_baseForOwn":41,"./_createBaseEach":87}],35:[function(require,module,exports){var baseForOwnRight=require("./_baseForOwnRight"),createBaseEach=require("./_createBaseEach");var baseEachRight=createBaseEach(baseForOwnRight,true);module.exports=baseEachRight},{"./_baseForOwnRight":42,"./_createBaseEach":87}],36:[function(require,module,exports){var baseEach=require("./_baseEach");function baseEvery(collection,predicate){var result=true;baseEach(collection,function(value,index,collection){result=!!predicate(value,index,collection);return result});return result}module.exports=baseEvery},{"./_baseEach":34}],37:[function(require,module,exports){var baseEach=require("./_baseEach");function baseFilter(collection,predicate){var result=[];baseEach(collection,function(value,index,collection){if(predicate(value,index,collection)){result.push(value)}});return result}module.exports=baseFilter},{"./_baseEach":34}],38:[function(require,module,exports){function baseFindIndex(array,predicate,fromIndex,fromRight){var length=array.length,index=fromIndex+(fromRight?1:-1);while(fromRight?index--:++index0&&predicate(value)){if(depth>1){baseFlatten(value,depth-1,predicate,isStrict,result)}else{arrayPush(result,value)}}else if(!isStrict){result[result.length]=value}}return result}module.exports=baseFlatten},{"./_arrayPush":22,"./_isFlattenable":110}],40:[function(require,module,exports){var createBaseFor=require("./_createBaseFor");var baseFor=createBaseFor();module.exports=baseFor},{"./_createBaseFor":88}],41:[function(require,module,exports){var baseFor=require("./_baseFor"),keys=require("./keys");function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys)}module.exports=baseForOwn},{"./_baseFor":40,"./keys":191}],42:[function(require,module,exports){var baseForRight=require("./_baseForRight"),keys=require("./keys");function baseForOwnRight(object,iteratee){return object&&baseForRight(object,iteratee,keys)}module.exports=baseForOwnRight},{"./_baseForRight":43,"./keys":191}],43:[function(require,module,exports){var createBaseFor=require("./_createBaseFor");var baseForRight=createBaseFor(true);module.exports=baseForRight},{"./_createBaseFor":88}],44:[function(require,module,exports){var castPath=require("./_castPath"),toKey=require("./_toKey");function baseGet(object,path){path=castPath(path,object);var index=0,length=path.length;while(object!=null&&indexlength?0:length+start}end=end>length?length:end;if(end<0){end+=length}length=start>end?0:end-start>>>0;start>>>=0;var result=Array(length);while(++indexother||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive){return 1}if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value=ordersLength){return result}var order=orders[index];return result*(order=="desc"?-1:1)}}return object.index-other.index}module.exports=compareMultiple},{"./_compareAscending":82}],84:[function(require,module,exports){function copyArray(source,array){var index=-1,length=source.length;array||(array=Array(length));while(++index-1?iterable[iteratee?collection[index]:index]:undefined}}module.exports=createFind},{"./_baseIteratee":57,"./isArrayLike":181,"./keys":191}],90:[function(require,module,exports){var getNative=require("./_getNative");var defineProperty=function(){try{var func=getNative(Object,"defineProperty");func({},"",{});return func}catch(e){}}();module.exports=defineProperty},{"./_getNative":98}],91:[function(require,module,exports){var SetCache=require("./_SetCache"),arraySome=require("./_arraySome"),cacheHas=require("./_cacheHas");var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;function equalArrays(array,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength)){return false}var stacked=stack.get(array);if(stacked&&stack.get(other)){return stacked==other}var index=-1,result=true,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache:undefined;stack.set(array,other);stack.set(other,array);while(++index-1&&value%1==0&&value-1}module.exports=listCacheHas},{"./_assocIndexOf":30}],122:[function(require,module,exports){var assocIndexOf=require("./_assocIndexOf");function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);if(index<0){++this.size;data.push([key,value])}else{data[index][1]=value}return this}module.exports=listCacheSet},{"./_assocIndexOf":30}],123:[function(require,module,exports){var Hash=require("./_Hash"),ListCache=require("./_ListCache"),Map=require("./_Map");function mapCacheClear(){this.size=0;this.__data__={hash:new Hash,map:new(Map||ListCache),string:new Hash}}module.exports=mapCacheClear},{"./_Hash":3,"./_ListCache":4,"./_Map":5}],124:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheDelete(key){var result=getMapData(this,key)["delete"](key);this.size-=result?1:0;return result}module.exports=mapCacheDelete},{"./_getMapData":96}],125:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheGet(key){return getMapData(this,key).get(key)}module.exports=mapCacheGet},{"./_getMapData":96}],126:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheHas(key){return getMapData(this,key).has(key)}module.exports=mapCacheHas},{"./_getMapData":96}],127:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheSet(key,value){var data=getMapData(this,key),size=data.size;data.set(key,value);this.size+=data.size==size?0:1;return this}module.exports=mapCacheSet},{"./_getMapData":96}],128:[function(require,module,exports){function mapToArray(map){var index=-1,result=Array(map.size);map.forEach(function(value,key){result[++index]=[key,value]});return result}module.exports=mapToArray},{}],129:[function(require,module,exports){function matchesStrictComparable(key,srcValue){return function(object){if(object==null){return false}return object[key]===srcValue&&(srcValue!==undefined||key in Object(object))}}module.exports=matchesStrictComparable},{}],130:[function(require,module,exports){var memoize=require("./memoize");var MAX_MEMOIZE_SIZE=500;function memoizeCapped(func){var result=memoize(func,function(key){if(cache.size===MAX_MEMOIZE_SIZE){cache.clear()}return key});var cache=result.cache;return result}module.exports=memoizeCapped},{"./memoize":194}],131:[function(require,module,exports){var getNative=require("./_getNative");var nativeCreate=getNative(Object,"create");module.exports=nativeCreate},{"./_getNative":98}],132:[function(require,module,exports){var overArg=require("./_overArg");var nativeKeys=overArg(Object.keys,Object);module.exports=nativeKeys},{"./_overArg":135}],133:[function(require,module,exports){var freeGlobal=require("./_freeGlobal");var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module;var moduleExports=freeModule&&freeModule.exports===freeExports;var freeProcess=moduleExports&&freeGlobal.process;var nodeUtil=function(){try{return freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch(e){}}();module.exports=nodeUtil},{"./_freeGlobal":94}],134:[function(require,module,exports){var objectProto=Object.prototype;var nativeObjectToString=objectProto.toString;function objectToString(value){return nativeObjectToString.call(value)}module.exports=objectToString},{}],135:[function(require,module,exports){function overArg(func,transform){return function(arg){return func(transform(arg))}}module.exports=overArg},{}],136:[function(require,module,exports){var apply=require("./_apply");var nativeMax=Math.max;function overRest(func,start,transform){start=nativeMax(start===undefined?func.length-1:start,0);return function(){var args=arguments,index=-1,length=nativeMax(args.length-start,0),array=Array(length);while(++index0){if(++count>=HOT_COUNT){return arguments[0]}}else{count=0}return func.apply(undefined,arguments)}}module.exports=shortOut},{}],144:[function(require,module,exports){var baseRandom=require("./_baseRandom");function shuffleSelf(array,size){var index=-1,length=array.length,lastIndex=length-1;size=size===undefined?length:size;while(++index-1:!!length&&baseIndexOf(collection,value,fromIndex)>-1}module.exports=includes},{"./_baseIndexOf":48,"./isArrayLike":181,"./isString":187,"./toInteger":211,"./values":214}],178:[function(require,module,exports){var apply=require("./_apply"),baseEach=require("./_baseEach"),baseInvoke=require("./_baseInvoke"),baseRest=require("./_baseRest"),isArrayLike=require("./isArrayLike");var invokeMap=baseRest(function(collection,path,args){var index=-1,isFunc=typeof path=="function",result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value){result[++index]=isFunc?apply(path,value,args):baseInvoke(value,path,args)});return result});module.exports=invokeMap},{"./_apply":14,"./_baseEach":34,"./_baseInvoke":49,"./_baseRest":67,"./isArrayLike":181}],179:[function(require,module,exports){var baseIsArguments=require("./_baseIsArguments"),isObjectLike=require("./isObjectLike");var objectProto=Object.prototype;var hasOwnProperty=objectProto.hasOwnProperty;var propertyIsEnumerable=objectProto.propertyIsEnumerable;var isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,"callee")&&!propertyIsEnumerable.call(value,"callee")};module.exports=isArguments},{"./_baseIsArguments":50,"./isObjectLike":186}],180:[function(require,module,exports){var isArray=Array.isArray;module.exports=isArray},{}],181:[function(require,module,exports){var isFunction=require("./isFunction"),isLength=require("./isLength");function isArrayLike(value){return value!=null&&isLength(value.length)&&!isFunction(value)}module.exports=isArrayLike},{"./isFunction":183,"./isLength":184}],182:[function(require,module,exports){var root=require("./_root"),stubFalse=require("./stubFalse");var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module;var moduleExports=freeModule&&freeModule.exports===freeExports;var Buffer=moduleExports?root.Buffer:undefined;var nativeIsBuffer=Buffer?Buffer.isBuffer:undefined;var isBuffer=nativeIsBuffer||stubFalse;module.exports=isBuffer},{"./_root":138,"./stubFalse":209}],183:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isObject=require("./isObject");var asyncTag="[object AsyncFunction]",funcTag="[object Function]",genTag="[object GeneratorFunction]",proxyTag="[object Proxy]";function isFunction(value){if(!isObject(value)){return false}var tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag}module.exports=isFunction},{"./_baseGetTag":46,"./isObject":185}],184:[function(require,module,exports){var MAX_SAFE_INTEGER=9007199254740991;function isLength(value){return typeof value=="number"&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}module.exports=isLength},{}],185:[function(require,module,exports){function isObject(value){var type=typeof value;return value!=null&&(type=="object"||type=="function")}module.exports=isObject},{}],186:[function(require,module,exports){function isObjectLike(value){return value!=null&&typeof value=="object"}module.exports=isObjectLike},{}],187:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isArray=require("./isArray"),isObjectLike=require("./isObjectLike");var stringTag="[object String]";function isString(value){return typeof value=="string"||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag}module.exports=isString},{"./_baseGetTag":46,"./isArray":180,"./isObjectLike":186}],188:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isObjectLike=require("./isObjectLike");var symbolTag="[object Symbol]";function isSymbol(value){return typeof value=="symbol"||isObjectLike(value)&&baseGetTag(value)==symbolTag}module.exports=isSymbol},{"./_baseGetTag":46,"./isObjectLike":186}],189:[function(require,module,exports){var baseIsTypedArray=require("./_baseIsTypedArray"),baseUnary=require("./_baseUnary"),nodeUtil=require("./_nodeUtil");var nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;module.exports=isTypedArray},{"./_baseIsTypedArray":56,"./_baseUnary":77,"./_nodeUtil":133}],190:[function(require,module,exports){var baseAssignValue=require("./_baseAssignValue"),createAggregator=require("./_createAggregator");var keyBy=createAggregator(function(result,value,key){baseAssignValue(result,key,value)});module.exports=keyBy},{"./_baseAssignValue":32,"./_createAggregator":86}],191:[function(require,module,exports){var arrayLikeKeys=require("./_arrayLikeKeys"),baseKeys=require("./_baseKeys"),isArrayLike=require("./isArrayLike");function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object)}module.exports=keys},{"./_arrayLikeKeys":20,"./_baseKeys":58,"./isArrayLike":181}],192:[function(require,module,exports){function last(array){var length=array==null?0:array.length;return length?array[length-1]:undefined}module.exports=last},{}],193:[function(require,module,exports){var arrayMap=require("./_arrayMap"),baseIteratee=require("./_baseIteratee"),baseMap=require("./_baseMap"),isArray=require("./isArray");function map(collection,iteratee){var func=isArray(collection)?arrayMap:baseMap;return func(collection,baseIteratee(iteratee,3))}module.exports=map},{"./_arrayMap":21,"./_baseIteratee":57,"./_baseMap":59,"./isArray":180}],194:[function(require,module,exports){var MapCache=require("./_MapCache");var FUNC_ERROR_TEXT="Expected a function";function memoize(func,resolver){if(typeof func!="function"||resolver!=null&&typeof resolver!="function"){throw new TypeError(FUNC_ERROR_TEXT)}var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key)){return cache.get(key)}var result=func.apply(this,args);memoized.cache=cache.set(key,result)||cache;return result};memoized.cache=new(memoize.Cache||MapCache);return memoized}memoize.Cache=MapCache;module.exports=memoize},{"./_MapCache":6}],195:[function(require,module,exports){var FUNC_ERROR_TEXT="Expected a function";function negate(predicate){if(typeof predicate!="function"){throw new TypeError(FUNC_ERROR_TEXT)}return function(){var args=arguments;switch(args.length){case 0:return!predicate.call(this);case 1:return!predicate.call(this,args[0]);case 2:return!predicate.call(this,args[0],args[1]);case 3:return!predicate.call(this,args[0],args[1],args[2])}return!predicate.apply(this,args)}}module.exports=negate},{}],196:[function(require,module,exports){var baseOrderBy=require("./_baseOrderBy"),isArray=require("./isArray");function orderBy(collection,iteratees,orders,guard){if(collection==null){return[]}if(!isArray(iteratees)){iteratees=iteratees==null?[]:[iteratees]}orders=guard?undefined:orders;if(!isArray(orders)){orders=orders==null?[]:[orders]}return baseOrderBy(collection,iteratees,orders)}module.exports=orderBy},{"./_baseOrderBy":62,"./isArray":180}],197:[function(require,module,exports){var createAggregator=require("./_createAggregator");var partition=createAggregator(function(result,value,key){result[key?0:1].push(value)},function(){return[[],[]]});module.exports=partition},{"./_createAggregator":86}],198:[function(require,module,exports){var baseProperty=require("./_baseProperty"),basePropertyDeep=require("./_basePropertyDeep"),isKey=require("./_isKey"),toKey=require("./_toKey");function property(path){return isKey(path)?baseProperty(toKey(path)):basePropertyDeep(path)}module.exports=property},{"./_baseProperty":63,"./_basePropertyDeep":64,"./_isKey":113,"./_toKey":153}],199:[function(require,module,exports){var arrayReduce=require("./_arrayReduce"),baseEach=require("./_baseEach"),baseIteratee=require("./_baseIteratee"),baseReduce=require("./_baseReduce"),isArray=require("./isArray");function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,baseIteratee(iteratee,4),accumulator,initAccum,baseEach)}module.exports=reduce},{"./_arrayReduce":23,"./_baseEach":34,"./_baseIteratee":57,"./_baseReduce":66,"./isArray":180}],200:[function(require,module,exports){var arrayReduceRight=require("./_arrayReduceRight"),baseEachRight=require("./_baseEachRight"),baseIteratee=require("./_baseIteratee"),baseReduce=require("./_baseReduce"),isArray=require("./isArray");function reduceRight(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduceRight:baseReduce,initAccum=arguments.length<3;return func(collection,baseIteratee(iteratee,4),accumulator,initAccum,baseEachRight)}module.exports=reduceRight},{"./_arrayReduceRight":24,"./_baseEachRight":35,"./_baseIteratee":57,"./_baseReduce":66,"./isArray":180}],201:[function(require,module,exports){var arrayFilter=require("./_arrayFilter"),baseFilter=require("./_baseFilter"),baseIteratee=require("./_baseIteratee"),isArray=require("./isArray"),negate=require("./negate");function reject(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,negate(baseIteratee(predicate,3)))}module.exports=reject},{"./_arrayFilter":19,"./_baseFilter":37,"./_baseIteratee":57,"./isArray":180,"./negate":195}],202:[function(require,module,exports){var arraySample=require("./_arraySample"),baseSample=require("./_baseSample"),isArray=require("./isArray");function sample(collection){var func=isArray(collection)?arraySample:baseSample;return func(collection)}module.exports=sample},{"./_arraySample":25,"./_baseSample":68,"./isArray":180}],203:[function(require,module,exports){var arraySampleSize=require("./_arraySampleSize"),baseSampleSize=require("./_baseSampleSize"),isArray=require("./isArray"),isIterateeCall=require("./_isIterateeCall"),toInteger=require("./toInteger");function sampleSize(collection,n,guard){if(guard?isIterateeCall(collection,n,guard):n===undefined){n=1}else{n=toInteger(n)}var func=isArray(collection)?arraySampleSize:baseSampleSize;return func(collection,n)}module.exports=sampleSize},{"./_arraySampleSize":26,"./_baseSampleSize":69,"./_isIterateeCall":112,"./isArray":180,"./toInteger":211}],204:[function(require,module,exports){var arrayShuffle=require("./_arrayShuffle"),baseShuffle=require("./_baseShuffle"),isArray=require("./isArray");function shuffle(collection){var func=isArray(collection)?arrayShuffle:baseShuffle;return func(collection)}module.exports=shuffle},{"./_arrayShuffle":27,"./_baseShuffle":71,"./isArray":180}],205:[function(require,module,exports){var baseKeys=require("./_baseKeys"),getTag=require("./_getTag"),isArrayLike=require("./isArrayLike"),isString=require("./isString"),stringSize=require("./_stringSize");var mapTag="[object Map]",setTag="[object Set]";function size(collection){if(collection==null){return 0}if(isArrayLike(collection)){return isString(collection)?stringSize(collection):collection.length}var tag=getTag(collection);if(tag==mapTag||tag==setTag){return collection.size}return baseKeys(collection).length}module.exports=size},{"./_baseKeys":58,"./_getTag":101,"./_stringSize":151,"./isArrayLike":181,"./isString":187}],206:[function(require,module,exports){var arraySome=require("./_arraySome"),baseIteratee=require("./_baseIteratee"),baseSome=require("./_baseSome"),isArray=require("./isArray"),isIterateeCall=require("./_isIterateeCall");function some(collection,predicate,guard){var func=isArray(collection)?arraySome:baseSome;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined}return func(collection,baseIteratee(predicate,3))}module.exports=some},{"./_arraySome":28,"./_baseIteratee":57,"./_baseSome":73,"./_isIterateeCall":112,"./isArray":180}],207:[function(require,module,exports){var baseFlatten=require("./_baseFlatten"),baseOrderBy=require("./_baseOrderBy"),baseRest=require("./_baseRest"),isIterateeCall=require("./_isIterateeCall");var sortBy=baseRest(function(collection,iteratees){if(collection==null){return[]}var length=iteratees.length;if(length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])){iteratees=[]}else if(length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])){iteratees=[iteratees[0]]}return baseOrderBy(collection,baseFlatten(iteratees,1),[])});module.exports=sortBy},{"./_baseFlatten":39,"./_baseOrderBy":62,"./_baseRest":67,"./_isIterateeCall":112}],208:[function(require,module,exports){function stubArray(){return[]}module.exports=stubArray},{}],209:[function(require,module,exports){function stubFalse(){return false}module.exports=stubFalse},{}],210:[function(require,module,exports){var toNumber=require("./toNumber");var INFINITY=1/0,MAX_INTEGER=1.7976931348623157e308;function toFinite(value){if(!value){return value===0?value:0}value=toNumber(value);if(value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER}return value===value?value:0}module.exports=toFinite},{"./toNumber":212}],211:[function(require,module,exports){var toFinite=require("./toFinite");function toInteger(value){var result=toFinite(value),remainder=result%1;return result===result?remainder?result-remainder:result:0}module.exports=toInteger},{"./toFinite":210}],212:[function(require,module,exports){var isObject=require("./isObject"),isSymbol=require("./isSymbol");var NAN=0/0;var reTrim=/^\s+|\s+$/g;var reIsBadHex=/^[-+]0x[0-9a-f]+$/i;var reIsBinary=/^0b[01]+$/i;var reIsOctal=/^0o[0-7]+$/i;var freeParseInt=parseInt;function toNumber(value){if(typeof value=="number"){return value}if(isSymbol(value)){return NAN}if(isObject(value)){var other=typeof value.valueOf=="function"?value.valueOf():value;value=isObject(other)?other+"":other}if(typeof value!="string"){return value===0?value:+value}value=value.replace(reTrim,"");var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value}module.exports=toNumber},{"./isObject":185,"./isSymbol":188}],213:[function(require,module,exports){var baseToString=require("./_baseToString");function toString(value){return value==null?"":baseToString(value)}module.exports=toString},{"./_baseToString":76}],214:[function(require,module,exports){var baseValues=require("./_baseValues"),keys=require("./keys");function values(object){return object==null?[]:baseValues(object,keys(object))}module.exports=values},{"./_baseValues":78,"./keys":191}],215:[function(require,module,exports){var v1=require("./v1");var v4=require("./v4");var uuid=v4;uuid.v1=v1;uuid.v4=v4;module.exports=uuid},{"./v1":218,"./v4":219}],216:[function(require,module,exports){var byteToHex=[];for(var i=0;i<256;++i){byteToHex[i]=(i+256).toString(16).substr(1)}function bytesToUuid(buf,offset){var i=offset||0;var bth=byteToHex;return bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]}module.exports=bytesToUuid},{}],217:[function(require,module,exports){(function(global){var rng;var crypto=global.crypto||global.msCrypto;if(crypto&&crypto.getRandomValues){var rnds8=new Uint8Array(16);rng=function whatwgRNG(){crypto.getRandomValues(rnds8);return rnds8}}if(!rng){var rnds=new Array(16);rng=function(){for(var i=0,r;i<16;i++){if((i&3)===0)r=Math.random()*4294967296;rnds[i]=r>>>((i&3)<<3)&255}return rnds}}module.exports=rng}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],218:[function(require,module,exports){var rng=require("./lib/rng");var bytesToUuid=require("./lib/bytesToUuid");var _seedBytes=rng();var _nodeId=[_seedBytes[0]|1,_seedBytes[1],_seedBytes[2],_seedBytes[3],_seedBytes[4],_seedBytes[5]];var _clockseq=(_seedBytes[6]<<8|_seedBytes[7])&16383;var _lastMSecs=0,_lastNSecs=0;function v1(options,buf,offset){var i=buf&&offset||0;var b=buf||[];options=options||{};var clockseq=options.clockseq!==undefined?options.clockseq:_clockseq;var msecs=options.msecs!==undefined?options.msecs:(new Date).getTime();var nsecs=options.nsecs!==undefined?options.nsecs:_lastNSecs+1;var dt=msecs-_lastMSecs+(nsecs-_lastNSecs)/1e4;if(dt<0&&options.clockseq===undefined){clockseq=clockseq+1&16383}if((dt<0||msecs>_lastMSecs)&&options.nsecs===undefined){nsecs=0}if(nsecs>=1e4){throw new Error("uuid.v1(): Can't create more than 10M uuids/sec")}_lastMSecs=msecs;_lastNSecs=nsecs;_clockseq=clockseq;msecs+=122192928e5;var tl=((msecs&268435455)*1e4+nsecs)%4294967296;b[i++]=tl>>>24&255;b[i++]=tl>>>16&255;b[i++]=tl>>>8&255;b[i++]=tl&255;var tmh=msecs/4294967296*1e4&268435455;b[i++]=tmh>>>8&255;b[i++]=tmh&255;b[i++]=tmh>>>24&15|16;b[i++]=tmh>>>16&255;b[i++]=clockseq>>>8|128;b[i++]=clockseq&255;var node=options.node||_nodeId;for(var n=0;n<6;++n){b[i+n]=node[n]}return buf?buf:bytesToUuid(b)}module.exports=v1},{"./lib/bytesToUuid":216,"./lib/rng":217}],219:[function(require,module,exports){var rng=require("./lib/rng");var bytesToUuid=require("./lib/bytesToUuid");function v4(options,buf,offset){var i=buf&&offset||0;if(typeof options=="string"){buf=options=="binary"?new Array(16):null;options=null}options=options||{};var rnds=options.random||(options.rng||rng)();rnds[6]=rnds[6]&15|64;rnds[8]=rnds[8]&63|128;if(buf){for(var ii=0;ii<16;++ii){buf[i+ii]=rnds[ii]}}return buf||bytesToUuid(rnds)}module.exports=v4},{"./lib/bytesToUuid":216,"./lib/rng":217}],220:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i2&&arguments[2]!==undefined?arguments[2]:{};var source=this.addNode(sourceNode);var target=this.addNode(targetNode);var style=opts.style||opts;var edge={style:style,source:source,target:target};this.edges.push(edge);source.edges.push(edge);target.edges.push(edge);return edge}},{key:"removeNode",value:function removeNode(node){var _this=this;var id=isId(node)?node:node.id;node=this.nodes[id];delete this.nodes[id];this.edges.forEach(function(edge){if(edge.source===node||edge.target===node){_this.removeEdge(edge)}});return node}},{key:"removeEdge",value:function removeEdge(source,target){var found=void 0;if(!target){target=source.target;source=source.source}if(isId(source))source={id:source};if(isId(target))target={id:target};this.edges=this.edges.filter(function(edge){if(edge.source.id===source.id&&edge.target.id===target.id){found=edge;return false}return true});if(found){found.source.edges=found.source.edges.filter(function(edge){return edge!==found});found.target.edges=found.target.edges.filter(function(edge){return edge!==found})}return found}},{key:"toJSON",value:function toJSON(){return{nodes:this.nodes,edges:this.edges}}}],[{key:"create",value:function create(){return new Dracula}}]);return Dracula}();exports.default=Dracula},{uuid:215}],221:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;imaxx)maxx=x;if(xmaxy)maxy=y;if(ymax)xmove=max;if(xmove<-max)xmove=-max;if(ymove>max)ymove=max;if(ymove<-max)ymove=-max;node.layoutPosX+=xmove;node.layoutPosY+=ymove;node.layoutForceX=0;node.layoutForceY=0})}},{key:"layoutRepulsive",value:function layoutRepulsive(node1,node2){if(!node1||!node2){return}var dx=node2.layoutPosX-node1.layoutPosX;var dy=node2.layoutPosY-node1.layoutPosY;var d2=dx*dx+dy*dy;if(d2<.01){dx=.1*Math.random()+.1;dy=.1*Math.random()+.1;d2=dx*dx+dy*dy}var d=Math.sqrt(d2);if(dthis.maxRepulsiveForceDistance){d=this.maxRepulsiveForceDistance;d2=d*d}var attractiveForce=(d2-this.k*this.k)/this.k;if(!edge.attraction)edge.attraction=1;attractiveForce*=Math.log(edge.attraction)*.5+1;node2.layoutForceX-=attractiveForce*dx/d;node2.layoutForceY-=attractiveForce*dy/d;node1.layoutForceX+=attractiveForce*dx/d;node1.layoutForceY+=attractiveForce*dy/d}}],[{key:"create",value:function create(){for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return new(Function.prototype.bind.apply(this,[null].concat(args)))}}]);return Spring}(_layout2.default);exports.default=Spring},{"./layout":221,"lodash/collection":156}],224:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;ir.width-20?newX-r.width+20:0);var clientY=y-(newY<20?newY-20:newY>r.height-20?newY-r.height+20:0);this.set.translate(clientX-Math.round(dx),clientY-Math.round(dy));shape.connections.forEach(function(connection){connection.draw()});this.set.ox=clientX;this.set.oy=clientY},function dragEnter(x,y){this.set.ox=x;this.set.oy=y;this.animate({"fill-opacity":.2},500)},function dragOut(){this.animate({"fill-opacity":0},500)})})};var RaphaelRenderer=function(_Renderer){_inherits(RaphaelRenderer,_Renderer);function RaphaelRenderer(element,graph,width,height){_classCallCheck(this,RaphaelRenderer);var _this=_possibleConstructorReturn(this,(RaphaelRenderer.__proto__||Object.getPrototypeOf(RaphaelRenderer)).call(this,element,graph,width,height));_this.canvas=Raphael(_this.element,_this.width,_this.height);_this.lineStyle={stroke:"#443399","stroke-width":"2px"};return _this}_createClass(RaphaelRenderer,[{key:"drawNode",value:function drawNode(node){var color=Raphael.getColor();if(node.render){node.shape=node.render(this.canvas,node)}else{node.shape=this.canvas.set();node.shape.push(this.canvas.ellipse(0,0,30,20).attr({stroke:color,"stroke-width":2,fill:color,"fill-opacity":0})).push(this.canvas.text(0,30,node.label||node.id))}node.shape.translate(node.point[0],node.point[1]);node.shape.connections=[];dragify(node.shape)}},{key:"drawEdge",value:function drawEdge(edge){if(!edge.shape){edge.shape=this.canvas.connection(edge.source.shape,edge.target.shape,edge.style);edge.source.shape.connections.push(edge.shape);edge.target.shape.connections.push(edge.shape)}}}]);return RaphaelRenderer}(_renderer2.default);exports.default=RaphaelRenderer;var getConnectionPoints=function getConnectionPoints(obj1,obj2){var bb1=obj1.getBBox();var bb2=obj2.getBBox();var off1=0;var off2=0;return[{x:bb1.x+bb1.width/2,y:bb1.y-off1},{x:bb1.x+bb1.width/2,y:bb1.y+bb1.height+off1},{x:bb1.x-off1,y:bb1.y+bb1.height/2},{x:bb1.x+bb1.width+off1,y:bb1.y+bb1.height/2},{x:bb2.x+bb2.width/2,y:bb2.y-off2},{x:bb2.x+bb2.width/2,y:bb2.y+bb2.height+off2},{x:bb2.x-off2,y:bb2.y+bb2.height/2},{x:bb2.x+bb2.width+off2,y:bb2.y+bb2.height/2}]};Raphael.fn.connection=function Connection(obj1,obj2,style){var self=this;var edge={draw:function draw(){var p=getConnectionPoints(obj1,obj2);var d={};var dis=[];var dx=void 0;var dy=void 0;for(var i=0;i<4;i++){for(var j=4;j<8;j++){dx=Math.abs(p[i].x-p[j].x);dy=Math.abs(p[i].y-p[j].y);if(i===j-4||(i!==3&&j!==6||p[i].xp[j].x)&&(i!==0&&j!==5||p[i].y>p[j].y)&&(i!==1&&j!==4||p[i].y p[j].x) && ((i != 0 && j != 5) || p[i].y > p[j].y) && ((i != 1 && j != 4) || p[i].y < p[j].y))) { + dis.push(dx + dy); + d[dis[dis.length - 1]] = [i, j]; + } + } + } + var res = dis.length == 0 ? res = [0, 4] : d[Math.min.apply(Math, dis)]; + /* bezier path */ + var x1 = p[res[0]].x, + y1 = p[res[0]].y, + x4 = p[res[1]].x, + y4 = p[res[1]].y, + dx = Math.max(Math.abs(x1 - x4) / 2, 10), + dy = Math.max(Math.abs(y1 - y4) / 2, 10), + x2 = [x1, x1, x1 - dx, x1 + dx][res[0]].toFixed(3), + y2 = [y1 - dy, y1 + dy, y1, y1][res[0]].toFixed(3), + x3 = [0, 0, 0, 0, x4, x4, x4 - dx, x4 + dx][res[1]].toFixed(3), + y3 = [0, 0, 0, 0, y1 + dy, y1 - dy, y4, y4][res[1]].toFixed(3); + /* assemble path and arrow */ + var path = ["M", x1.toFixed(3), y1.toFixed(3), "C", x2, y2, x3, y3, x4.toFixed(3), y4.toFixed(3)].join(","); + /* arrow */ + if(style && style.directed) { + /* magnitude, length of the last path vector */ + var mag = Math.sqrt((y4 - y3) * (y4 - y3) + (x4 - x3) * (x4 - x3)); + /* vector normalisation to specified length */ + var norm = function(x,l){return (-x*(l||5)/mag);}; + /* calculate array coordinates (two lines orthogonal to the path vector) */ + var arr = [ + {x:(norm(x4-x3)+norm(y4-y3)+x4).toFixed(3), y:(norm(y4-y3)+norm(x4-x3)+y4).toFixed(3)}, + {x:(norm(x4-x3)-norm(y4-y3)+x4).toFixed(3), y:(norm(y4-y3)-norm(x4-x3)+y4).toFixed(3)} + ]; + path = path + ",M"+arr[0].x+","+arr[0].y+",L"+x4+","+y4+",L"+arr[1].x+","+arr[1].y; + } + + // applying path + edge.fg && edge.fg.attr({path:path}) + || (edge.fg = selfRef.path(path).attr({stroke: color, fill: "none"}).toBack()); + edge.bg && edge.bg.attr({path:path}) + || style && style.bg && (edge.bg = style.bg.split && selfRef.path(path).attr({stroke: style.bg.split("|")[0], fill: "none", "stroke-width": style.bg.split("|")[1] || 3}).toBack()); + } + } + edge.draw(); + return edge; +}; diff --git a/beer_contracts_with_stubs/js/graph.js b/beer_contracts_with_stubs/js/graph.js new file mode 100644 index 000000000..d0f12db95 --- /dev/null +++ b/beer_contracts_with_stubs/js/graph.js @@ -0,0 +1,303 @@ +/* Graph JavaScript framework, version 0.0.1 + * (c) 2006 Aslak Hellesoy + * (c) 2006 Dave Hoover + * + * Ported from Graph::Layouter::Spring in + * https://search.cpan.org/~pasky/Graph-Layderer-0.02/ + * The algorithm is based on a spring-style layouter of a Java-based social + * network tracker PieSpy written by Paul Mutton Epaul@jibble.orgE. + * + * Adopted by Philipp Strathausen to support Raphael JS + * for rendering, dragging and much more. See https://blog.ameisenbar.de/ + * + * Graph is freely distributable under the terms of an MIT-style license. + * For details, see the Graph web site: https://dev.buildpatternd.com/trac + * + * Links: + * + * Demo of the original applet: + * https://redsquirrel.com/dave/work/webdep/ + * + * Mirrored original source code at snipplr: + * https://snipplr.com/view/1950/graph-javascript-framework-version-001/ + * + * Original usage example: + * http://ajaxian.com/archives/new-javascriptcanvas-graph-library + * +/*--------------------------------------------------------------------------*/ + +/* + * Graph + */ +var Graph = function() { + this.nodes = []; + this.edges = []; +}; +Graph.prototype = { + addNode: function(id, content) { + /* testing if node is already existing in the graph */ + var new_node = this.nodes[id]; + if(new_node == undefined) { + new_node = new Graph.Node(id, content||{"id":id}); + this.nodes[id] = new_node; + this.nodes.push(new_node); // TODO get rid of the array + } + return new_node; + }, + + addEdge: function(source, target, style) { + var s = this.addNode(source); + var t = this.addNode(target); + var color; + var colorbg; + var directed; + if(style) { color = style.color; colorbg = style.colorbg; directed = style.directed } + var edge = { source: s, target: t, color: color, colorbg: colorbg, directed: directed }; + this.edges.push(edge); + } +}; + +/* + * Node + */ +Graph.Node = function(id, value){ + this.id = id; + this.content = value; +}; +Graph.Node.prototype = { +}; +Graph.Renderer = {}; +Graph.Renderer.Raphael = function(element, graph, width, height) { + this.width = width||400; + this.height = height||400; + var selfRef = this; + this.r = Raphael(element, this.width, this.height); + this.radius = 40; /* max dimension of a node */ + this.graph = graph; + this.mouse_in = false; + + /* + * Dragging + */ + this.isDrag = false; + this.dragger = function (e) { + this.dx = e.clientX; + this.dy = e.clientY; + selfRef.isDrag = this; + this.animate({"fill-opacity": .2}, 500); + e.preventDefault && e.preventDefault(); + }; + + document.onmousemove = function (e) { + e = e || window.event; + if (selfRef.isDrag) { + var newX = e.clientX - selfRef.isDrag.dx + (selfRef.isDrag.attrs.cx == null ? (selfRef.isDrag.attrs.x + selfRef.isDrag.attrs.width / 2) : selfRef.isDrag.attrs.cx); + var newY = e.clientY - selfRef.isDrag.dy + (selfRef.isDrag.attrs.cy == null ? (selfRef.isDrag.attrs.y + selfRef.isDrag.attrs.height / 2) : selfRef.isDrag.attrs.cy); + /* prevent shapes from being dragged out of the canvas */ + var clientX = e.clientX - (newX < 20 ? newX - 20 : newX > selfRef.width - 20 ? newX - selfRef.width + 20 : 0); + var clientY = e.clientY - (newY < 20 ? newY - 20 : newY > selfRef.height - 20 ? newY - selfRef.height + 20 : 0); + selfRef.isDrag.translate(clientX - selfRef.isDrag.dx, clientY - selfRef.isDrag.dy); + selfRef.isDrag.label.translate(clientX - selfRef.isDrag.dx, clientY - selfRef.isDrag.dy); + for (var i in selfRef.graph.edges) { + selfRef.graph.edges[i].connection.draw(); + } + //selfRef.r.safari(); + selfRef.isDrag.dx = clientX; + selfRef.isDrag.dy = clientY; + } + }; + document.onmouseup = function () { + selfRef.isDrag && selfRef.isDrag.animate({"fill-opacity": 0}, 500); + selfRef.isDrag = false; + }; +}; + +/* + * Renderer using RaphaelJS + */ +Graph.Renderer.Raphael.prototype = { + translate: function(point) { + return [ + (point[0] - this.graph.layoutMinX) * this.factorX + this.radius, + (point[1] - this.graph.layoutMinY) * this.factorY + this.radius + ]; + }, + + rotate: function(point, length, angle) { + var dx = length * Math.cos(angle); + var dy = length * Math.sin(angle); + return [point[0]+dx, point[1]+dy]; + }, + + draw: function() { + this.factorX = (width - 2 * this.radius) / (this.graph.layoutMaxX - this.graph.layoutMinX); + this.factorY = (height - 2 * this.radius) / (this.graph.layoutMaxY - this.graph.layoutMinY); + for (var i = 0; i < this.graph.nodes.length; i++) { + this.drawNode(this.graph.nodes[i]); + } + for (var i = 0; i < this.graph.edges.length; i++) { + this.drawEdge(this.graph.edges[i]); + } + }, + drawNode: function(node) { + var point = this.translate([node.layoutPosX, node.layoutPosY]); + node.point = point; + + /* if node has already been drawn, move the nodes */ + if(node.shape) { +// console.log(node.shape.attrs ); + var opoint = [ node.shape.attrs.cx || node.shape.attrs.x + node.shape.attrs.width / 2 , node.shape.attrs.cy || node.shape.attrs.y + node.shape.attrs.height / 2 + 15 ]; + node.shape.translate(point[0]-opoint[0], point[1]-opoint[1]); + node.shape.label.translate(point[0]-opoint[0], point[1]-opoint[1]); + this.r.safari(); + return; + } + var shape; + if(node.content.getShape) { + shape = node.content.getShape(this.r, point[0], point[1]); + shape.attr({"fill-opacity": 0}); + } else { + shape = this.r.ellipse(point[0], point[1], 30, 20); + var color = Raphael.getColor(); + shape.attr({fill: color, stroke: color, "fill-opacity": 0, "stroke-width": 2}) + } + shape.mousedown(this.dragger); + shape.node.style.cursor = "move"; + shape.label = this.r.text(point[0], point[1] + 30, node.content.label || node.id); // Beware: operator || also considers values like -1, 0, ... + node.shape = shape; + }, + drawEdge: function(edge) { + /* if edge already has been drawn, only refresh the edge */ + edge.connection && edge.connection.draw(); + if(!edge.connection) + edge.connection = this.r.connection(edge.source.shape, edge.target.shape, { fg: edge.color, bg: edge.colorbg, directed: edge.directed }); + } +}; +Graph.Layout = {}; +Graph.Layout.Spring = function(graph) { + this.graph = graph; + this.iterations = 500; + this.maxRepulsiveForceDistance = 6; + this.k = 2; + this.c = 0.01; + this.maxVertexMovement = 0.5; + }; +Graph.Layout.Spring.prototype = { + layout: function() { + this.layoutPrepare(); + for (var i = 0; i < this.iterations; i++) { + this.layoutIteration(); + } + this.layoutCalcBounds(); + }, + + layoutPrepare: function() { + for (var i = 0; i < this.graph.nodes.length; i++) { + var node = this.graph.nodes[i]; + node.layoutPosX = 0; + node.layoutPosY = 0; + node.layoutForceX = 0; + node.layoutForceY = 0; + } + + }, + + layoutCalcBounds: function() { + var minx = Infinity, maxx = -Infinity, miny = Infinity, maxy = -Infinity; + + for (var i = 0; i < this.graph.nodes.length; i++) { + var x = this.graph.nodes[i].layoutPosX; + var y = this.graph.nodes[i].layoutPosY; + + if(x > maxx) maxx = x; + if(x < minx) minx = x; + if(y > maxy) maxy = y; + if(y < miny) miny = y; + } + + this.graph.layoutMinX = minx; + this.graph.layoutMaxX = maxx; + this.graph.layoutMinY = miny; + this.graph.layoutMaxY = maxy; + }, + + layoutIteration: function() { + // Forces on nodes due to node-node repulsions + for (var i = 0; i < this.graph.nodes.length; i++) { + var node1 = this.graph.nodes[i]; + for (var j = i + 1; j < this.graph.nodes.length; j++) { + var node2 = this.graph.nodes[j]; + this.layoutRepulsive(node1, node2); + } + } + // Forces on nodes due to edge attractions + for (var i = 0; i < this.graph.edges.length; i++) { + var edge = this.graph.edges[i]; + this.layoutAttractive(edge); + } + + // Move by the given force + for (var i = 0; i < this.graph.nodes.length; i++) { + var node = this.graph.nodes[i]; + var xmove = this.c * node.layoutForceX; + var ymove = this.c * node.layoutForceY; + + var max = this.maxVertexMovement; + if(xmove > max) xmove = max; + if(xmove < -max) xmove = -max; + if(ymove > max) ymove = max; + if(ymove < -max) ymove = -max; + + node.layoutPosX += xmove; + node.layoutPosY += ymove; + node.layoutForceX = 0; + node.layoutForceY = 0; + } + }, + + layoutRepulsive: function(node1, node2) { + var dx = node2.layoutPosX - node1.layoutPosX; + var dy = node2.layoutPosY - node1.layoutPosY; + var d2 = dx * dx + dy * dy; + if(d2 < 0.01) { + dx = 0.1 * Math.random() + 0.1; + dy = 0.1 * Math.random() + 0.1; + var d2 = dx * dx + dy * dy; + } + var d = Math.sqrt(d2); + if(d < this.maxRepulsiveForceDistance) { + var repulsiveForce = this.k * this.k / d; + node2.layoutForceX += repulsiveForce * dx / d; + node2.layoutForceY += repulsiveForce * dy / d; + node1.layoutForceX -= repulsiveForce * dx / d; + node1.layoutForceY -= repulsiveForce * dy / d; + } + }, + + layoutAttractive: function(edge) { + var node1 = edge.source; + var node2 = edge.target; + + var dx = node2.layoutPosX - node1.layoutPosX; + var dy = node2.layoutPosY - node1.layoutPosY; + var d2 = dx * dx + dy * dy; + if(d2 < 0.01) { + dx = 0.1 * Math.random() + 0.1; + dy = 0.1 * Math.random() + 0.1; + var d2 = dx * dx + dy * dy; + } + var d = Math.sqrt(d2); + if(d > this.maxRepulsiveForceDistance) { + d = this.maxRepulsiveForceDistance; + d2 = d * d; + } + var attractiveForce = (d2 - this.k * this.k) / this.k; + if(edge.weight == undefined || edge.weight < 1) edge.weight = 1; + attractiveForce *= Math.log(edge.weight) * 0.5 + 1; + + node2.layoutForceX -= attractiveForce * dx / d; + node2.layoutForceY -= attractiveForce * dy / d; + node1.layoutForceX += attractiveForce * dx / d; + node1.layoutForceY += attractiveForce * dy / d; + } +}; diff --git a/beer_contracts_with_stubs/js/raphael-min.js b/beer_contracts_with_stubs/js/raphael-min.js new file mode 100644 index 000000000..7b1ae8584 --- /dev/null +++ b/beer_contracts_with_stubs/js/raphael-min.js @@ -0,0 +1,7 @@ +/* + * Raphael 1.3.1 - JavaScript Vector Library + * + * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (https://raphaeljs.com) + * Licensed under the MIT (https://www.opensource.org/licenses/mit-license.php) license. + */ +Raphael=(function(){var a=/[, ]+/,aO=/^(circle|rect|path|ellipse|text|image)$/,L=document,au=window,l={was:"Raphael" in au,is:au.Raphael},an=function(){if(an.is(arguments[0],"array")){var d=arguments[0],e=w[aW](an,d.splice(0,3+an.is(d[0],al))),S=e.set();for(var R=0,a0=d[m];R

";if(ag.childNodes[m]!=2){return null;}}an.svg=!(an.vml=an.type=="VML");aT[aY]=an[aY];an._id=0;an._oid=0;an.fn={};an.is=function(e,d){d=aZ.call(d);return((d=="object"||d=="undefined")&&typeof e==d)||(e==null&&d=="null")||aZ.call(aw.call(e).slice(8,-1))==d;};an.setWindow=function(d){au=d;L=au.document;};var aD=function(e){if(an.vml){var d=/^\s+|\s+$/g;aD=aj(function(R){var S;R=(R+at)[aP](d,at);try{var a0=new ActiveXObject("htmlfile");a0.write("");a0.close();S=a0.body;}catch(a2){S=createPopup().document.body;}var i=S.createTextRange();try{S.style.color=R;var a1=i.queryCommandValue("ForeColor");a1=((a1&255)<<16)|(a1&65280)|((a1&16711680)>>>16);return"#"+("000000"+a1[aA](16)).slice(-6);}catch(a2){return"none";}});}else{var E=L.createElement("i");E.title="Rapha\xebl Colour Picker";E.style.display="none";L.body[aL](E);aD=aj(function(i){E.style.color=i;return L.defaultView.getComputedStyle(E,at).getPropertyValue("color");});}return aD(e);};an.hsb2rgb=aj(function(a3,a1,a7){if(an.is(a3,"object")&&"h" in a3&&"s" in a3&&"b" in a3){a7=a3.b;a1=a3.s;a3=a3.h;}var R,S,a8;if(a7==0){return{r:0,g:0,b:0,hex:"#000"};}if(a3>1||a1>1||a7>1){a3/=255;a1/=255;a7/=255;}var a0=~~(a3*6),a4=(a3*6)-a0,E=a7*(1-a1),e=a7*(1-(a1*a4)),a9=a7*(1-(a1*(1-a4)));R=[a7,e,E,E,a9,a7,a7][a0];S=[a9,a7,a7,e,E,E,a9][a0];a8=[E,E,a9,a7,a7,e,E][a0];R*=255;S*=255;a8*=255;var a5={r:R,g:S,b:a8},d=(~~R)[aA](16),a2=(~~S)[aA](16),a6=(~~a8)[aA](16);d=d[aP](aU,"0");a2=a2[aP](aU,"0");a6=a6[aP](aU,"0");a5.hex="#"+d+a2+a6;return a5;},an);an.rgb2hsb=aj(function(d,e,a1){if(an.is(d,"object")&&"r" in d&&"g" in d&&"b" in d){a1=d.b;e=d.g;d=d.r;}if(an.is(d,"string")){var a3=an.getRGB(d);d=a3.r;e=a3.g;a1=a3.b;}if(d>1||e>1||a1>1){d/=255;e/=255;a1/=255;}var a0=g(d,e,a1),i=aI(d,e,a1),R,E,S=a0;if(i==a0){return{h:0,s:0,b:a0};}else{var a2=(a0-i);E=a2/a0;if(d==a0){R=(e-a1)/a2;}else{if(e==a0){R=2+((a1-d)/a2);}else{R=4+((d-e)/a2);}}R/=6;R<0&&R++;R>1&&R--;}return{h:R,s:E,b:S};},an);var aE=/,?([achlmqrstvxz]),?/gi;an._path2string=function(){return this.join(",")[aP](aE,"$1");};function aj(E,e,d){function i(){var R=Array[aY].slice.call(arguments,0),a0=R[az]("\u25ba"),S=i.cache=i.cache||{},a1=i.count=i.count||[];if(S[Q](a0)){return d?d(S[a0]):S[a0];}a1[m]>=1000&&delete S[a1.shift()];a1[f](a0);S[a0]=E[aW](e,R);return d?d(S[a0]):S[a0];}return i;}an.getRGB=aj(function(d){if(!d||!!((d=d+at).indexOf("-")+1)){return{r:-1,g:-1,b:-1,hex:"none",error:1};}if(d=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}!(({hs:1,rg:1})[Q](d.substring(0,2))||d.charAt()=="#")&&(d=aD(d));var S,i,E,a2,a3,a0=d.match(x);if(a0){if(a0[2]){a2=G(a0[2].substring(5),16);E=G(a0[2].substring(3,5),16);i=G(a0[2].substring(1,3),16);}if(a0[3]){a2=G((a3=a0[3].charAt(3))+a3,16);E=G((a3=a0[3].charAt(2))+a3,16);i=G((a3=a0[3].charAt(1))+a3,16);}if(a0[4]){a0=a0[4][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);}if(a0[5]){a0=a0[5][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;}if(a0[6]){a0=a0[6][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);return an.hsb2rgb(i,E,a2);}if(a0[7]){a0=a0[7][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;return an.hsb2rgb(i,E,a2);}a0={r:i,g:E,b:a2};var e=(~~i)[aA](16),R=(~~E)[aA](16),a1=(~~a2)[aA](16);e=e[aP](aU,"0");R=R[aP](aU,"0");a1=a1[aP](aU,"0");a0.hex="#"+e+R+a1;return a0;}return{r:-1,g:-1,b:-1,hex:"none",error:1};},an);an.getColor=function(e){var i=this.getColor.start=this.getColor.start||{h:0,s:1,b:e||0.75},d=this.hsb2rgb(i.h,i.s,i.b);i.h+=0.075;if(i.h>1){i.h=0;i.s-=0.2;i.s<=0&&(this.getColor.start={h:0,s:1,b:i.b});}return d.hex;};an.getColor.reset=function(){delete this.start;};an.parsePathString=aj(function(d){if(!d){return null;}var i={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},e=[];if(an.is(d,"array")&&an.is(d[0],"array")){e=av(d);}if(!e[m]){(d+at)[aP](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(R,E,a1){var a0=[],S=aZ.call(E);a1[aP](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(a3,a2){a2&&a0[f](+a2);});while(a0[m]>=i[S]){e[f]([E][aS](a0.splice(0,i[S])));if(!i[S]){break;}}});}e[aA]=an._path2string;return e;});an.findDotsAtSegment=function(e,d,be,bc,a0,R,a2,a1,a8){var a6=1-a8,a5=aM(a6,3)*e+aM(a6,2)*3*a8*be+a6*3*a8*a8*a0+aM(a8,3)*a2,a3=aM(a6,3)*d+aM(a6,2)*3*a8*bc+a6*3*a8*a8*R+aM(a8,3)*a1,ba=e+2*a8*(be-e)+a8*a8*(a0-2*be+e),a9=d+2*a8*(bc-d)+a8*a8*(R-2*bc+d),bd=be+2*a8*(a0-be)+a8*a8*(a2-2*a0+be),bb=bc+2*a8*(R-bc)+a8*a8*(a1-2*R+bc),a7=(1-a8)*e+a8*be,a4=(1-a8)*d+a8*bc,E=(1-a8)*a0+a8*a2,i=(1-a8)*R+a8*a1,S=(90-ab.atan((ba-bd)/(a9-bb))*180/ab.PI);(ba>bd||a91){bi=ab.sqrt(by)*bi;bg=ab.sqrt(by)*bg;}var E=bi*bi,br=bg*bg,bt=(a4==S?-1:1)*ab.sqrt(ab.abs((E*br-E*bn*bn-br*bo*bo)/(E*bn*bn+br*bo*bo))),bd=bt*bi*bn/bg+(a9+a8)/2,bc=bt*-bg*bo/bi+(bE+bD)/2,a3=ab.asin(((bE-bc)/bg).toFixed(7)),a2=ab.asin(((bD-bc)/bg).toFixed(7));a3=a9a2){a3=a3-R*2;}if(!S&&a2>a3){a2=a2-R*2;}}else{a3=bb[0];a2=bb[1];bd=bb[2];bc=bb[3];}var a7=a2-a3;if(ab.abs(a7)>bf){var be=a2,bh=a8,a5=bD;a2=a3+bf*(S&&a2>a3?1:-1);a8=bd+bi*ab.cos(a2);bD=bc+bg*ab.sin(a2);bm=K(a8,bD,bi,bg,ba,0,S,bh,a5,[a2,be,bd,bc]);}a7=a2-a3;var a1=ab.cos(a3),bC=ab.sin(a3),a0=ab.cos(a2),bB=ab.sin(a2),bp=ab.tan(a7/4),bs=4/3*bi*bp,bq=4/3*bg*bp,bz=[a9,bE],bx=[a9+bs*bC,bE-bq*a1],bw=[a8+bs*bB,bD-bq*a0],bu=[a8,bD];bx[0]=2*bz[0]-bx[0];bx[1]=2*bz[1]-bx[1];if(bb){return[bx,bw,bu][aS](bm);}else{bm=[bx,bw,bu][aS](bm)[az]()[z](",");var bk=[];for(var bv=0,bl=bm[m];bv1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}a7=(a8-2*E+d)-(a2-2*a8+E);a4=2*(E-d)-2*(a8-E);a1=d-E;a0=(-a4+ab.sqrt(a4*a4-4*a7*a1))/2/a7;S=(-a4-ab.sqrt(a4*a4-4*a7*a1))/2/a7;ab.abs(a0)>1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}return{min:{x:aI[aW](0,a6),y:aI[aW](0,a3)},max:{x:g[aW](0,a6),y:g[aW](0,a3)}};}),H=aj(function(a9,a4){var R=r(a9),a5=a4&&r(a4),a6={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},d={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},a0=function(ba,bb){var i,bc;if(!ba){return["C",bb.x,bb.y,bb.x,bb.y,bb.x,bb.y];}!(ba[0] in {T:1,Q:1})&&(bb.qx=bb.qy=null);switch(ba[0]){case"M":bb.X=ba[1];bb.Y=ba[2];break;case"A":ba=["C"][aS](K[aW](0,[bb.x,bb.y][aS](ba.slice(1))));break;case"S":i=bb.x+(bb.x-(bb.bx||bb.x));bc=bb.y+(bb.y-(bb.by||bb.y));ba=["C",i,bc][aS](ba.slice(1));break;case"T":bb.qx=bb.x+(bb.x-(bb.qx||bb.x));bb.qy=bb.y+(bb.y-(bb.qy||bb.y));ba=["C"][aS](aK(bb.x,bb.y,bb.qx,bb.qy,ba[1],ba[2]));break;case"Q":bb.qx=ba[1];bb.qy=ba[2];ba=["C"][aS](aK(bb.x,bb.y,ba[1],ba[2],ba[3],ba[4]));break;case"L":ba=["C"][aS](aX(bb.x,bb.y,ba[1],ba[2]));break;case"H":ba=["C"][aS](aX(bb.x,bb.y,ba[1],bb.y));break;case"V":ba=["C"][aS](aX(bb.x,bb.y,bb.x,ba[1]));break;case"Z":ba=["C"][aS](aX(bb.x,bb.y,bb.X,bb.Y));break;}return ba;},e=function(ba,bb){if(ba[bb][m]>7){ba[bb].shift();var bc=ba[bb];while(bc[m]){ba.splice(bb++,0,["C"][aS](bc.splice(0,6)));}ba.splice(bb,1);a7=g(R[m],a5&&a5[m]||0);}},E=function(be,bd,bb,ba,bc){if(be&&bd&&be[bc][0]=="M"&&bd[bc][0]!="M"){bd.splice(bc,0,["M",ba.x,ba.y]);bb.bx=0;bb.by=0;bb.x=be[bc][1];bb.y=be[bc][2];a7=g(R[m],a5&&a5[m]||0);}};for(var a2=0,a7=g(R[m],a5&&a5[m]||0);a23){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}},aG=function(d,i){var e=this;for(var E in i){if(i[Q](E)&&!(E in d)){switch(typeof i[E]){case"function":(function(R){d[E]=d===e?R:function(){return R[aW](e,arguments);};})(i[E]);break;case"object":d[E]=d[E]||{};aG.call(this,d[E],i[E]);break;default:d[E]=i[E];break;}}}},ak=function(d,e){d==e.top&&(e.top=d.prev);d==e.bottom&&(e.bottom=d.next);d.next&&(d.next.prev=d.prev);d.prev&&(d.prev.next=d.next);},Y=function(d,e){if(e.top===d){return;}ak(d,e);d.next=null;d.prev=e.top;e.top.next=d;e.top=d;},k=function(d,e){if(e.bottom===d){return;}ak(d,e);d.next=e.bottom;d.prev=null;e.bottom.prev=d;e.bottom=d;},A=function(e,d,i){ak(e,i);d==i.top&&(i.top=e);d.next&&(d.next.prev=e);e.next=d.next;e.prev=d;d.next=e;},aq=function(e,d,i){ak(e,i);d==i.bottom&&(i.bottom=e);d.prev&&(d.prev.next=e);e.prev=d.prev;d.prev=e;e.next=d;},s=function(d){return function(){throw new Error("Rapha\xebl: you are calling to method \u201c"+d+"\u201d of removed object");};},ar=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/;if(an.svg){aT[aY].svgns="http://www.w3.org/2000/svg";aT[aY].xlink="http://www.w3.org/1999/xlink";var O=function(d){return +d+(~~d===d)*0.5;},V=function(S){for(var e=0,E=S[m];e0.5)*2-1);aM(a1-0.5,2)+aM(S-0.5,2)>0.25&&(S=ab.sqrt(0.25-aM(a1-0.5,2))*ba+0.5)&&S!=0.5&&(S=S.toFixed(5)-0.00001*ba);}return at;});a7=a7[z](/\s*\-\s*/);if(a4=="linear"){var a0=a7.shift();a0=-W(a0);if(isNaN(a0)){return null;}var R=[0,0,ab.cos(a0*ab.PI/180),ab.sin(a0*ab.PI/180)],a6=1/(g(ab.abs(R[2]),ab.abs(R[3]))||1);R[2]*=a6;R[3]*=a6;if(R[2]<0){R[0]=-R[2];R[2]=0;}if(R[3]<0){R[1]=-R[3];R[3]=0;}}var a3=p(a7);if(!a3){return null;}var e=aJ(a4+"Gradient");e.id="r"+(an._id++)[aA](36);aJ(e,a4=="radial"?{fx:a1,fy:S}:{x1:R[0],y1:R[1],x2:R[2],y2:R[3]});d.defs[aL](e);for(var a2=0,a8=a3[m];a2a1.height)&&(a1.height=a0.y+a0.height-a1.y);(a0.x+a0.width-a1.x>a1.width)&&(a1.width=a0.x+a0.width-a1.x);}}E&&this.hide();return a1;};ax[aY].attr=function(){if(this.removed){return this;}if(arguments[m]==0){var R={};for(var E in this.attrs){if(this.attrs[Q](E)){R[E]=this.attrs[E];}}this._.rt.deg&&(R.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(R.scale=this.scale());R.gradient&&R.fill=="none"&&(R.fill=R.gradient)&&delete R.gradient;return R;}if(arguments[m]==1&&an.is(arguments[0],"string")){if(arguments[0]=="translation"){return t.call(this);}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}if(arguments[0]=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient){return this.attrs.gradient;}return this.attrs[arguments[0]];}if(arguments[m]==1&&an.is(arguments[0],"array")){var d={};for(var e in arguments[0]){if(arguments[0][Q](e)){d[arguments[0][e]]=this.attrs[arguments[0][e]];}}return d;}if(arguments[m]==2){var S={};S[arguments[0]]=arguments[1];aa(this,S);}else{if(arguments[m]==1&&an.is(arguments[0],"object")){aa(this,arguments[0]);}}return this;};ax[aY].toFront=function(){if(this.removed){return this;}this.node.parentNode[aL](this.node);var d=this.paper;d.top!=this&&Y(this,d);return this;};ax[aY].toBack=function(){if(this.removed){return this;}if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);k(this,this.paper);var d=this.paper;}return this;};ax[aY].insertAfter=function(d){if(this.removed){return this;}var e=d.node;if(e.nextSibling){e.parentNode.insertBefore(this.node,e.nextSibling);}else{e.parentNode[aL](this.node);}A(this,d,this.paper);return this;};ax[aY].insertBefore=function(d){if(this.removed){return this;}var e=d.node;e.parentNode.insertBefore(this.node,e);aq(this,d,this.paper);return this;};var P=function(e,d,S,R){d=O(d);S=O(S);var E=aJ("circle");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:S,r:R,fill:"none",stroke:"#000"};i.type="circle";aJ(E,i.attrs);return i;};var aF=function(i,d,a1,e,S,a0){d=O(d);a1=O(a1);var R=aJ("rect");i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,r:a0||0,rx:a0||0,ry:a0||0,fill:"none",stroke:"#000"};E.type="rect";aJ(R,E.attrs);return E;};var ai=function(e,d,a0,S,R){d=O(d);a0=O(a0);var E=aJ("ellipse");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:a0,rx:S,ry:R,fill:"none",stroke:"#000"};i.type="ellipse";aJ(E,i.attrs);return i;};var o=function(i,a0,d,a1,e,S){var R=aJ("image");aJ(R,{x:d,y:a1,width:e,height:S,preserveAspectRatio:"none"});R.setAttributeNS(i.xlink,"href",a0);i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,src:a0};E.type="image";return E;};var X=function(e,d,S,R){var E=aJ("text");aJ(E,{x:d,y:S,"text-anchor":"middle"});e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={x:d,y:S,"text-anchor":"middle",text:R,font:j.font,stroke:"none",fill:"#000"};i.type="text";aa(i,i.attrs);return i;};var aV=function(e,d){this.width=e||this.width;this.height=d||this.height;this.canvas[v]("width",this.width);this.canvas[v]("height",this.height);return this;};var w=function(){var E=ao[aW](null,arguments),i=E&&E.container,e=E.x,a0=E.y,R=E.width,d=E.height;if(!i){throw new Error("SVG container not found.");}var S=aJ("svg");R=R||512;d=d||342;aJ(S,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:R,height:d});if(i==1){S.style.cssText="position:absolute;left:"+e+"px;top:"+a0+"px";L.body[aL](S);}else{if(i.firstChild){i.insertBefore(S,i.firstChild);}else{i[aL](S);}}i=new aT;i.width=R;i.height=d;i.canvas=S;aG.call(i,i,an.fn);i.clear();return i;};aT[aY].clear=function(){var d=this.canvas;while(d.firstChild){d.removeChild(d.firstChild);}this.bottom=this.top=null;(this.desc=aJ("desc"))[aL](L.createTextNode("Created with Rapha\xebl"));d[aL](this.desc);d[aL](this.defs=aJ("defs"));};aT[aY].remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if(an.vml){var aH=function(a8){var a5=/[ahqstv]/ig,a0=r;(a8+at).match(a5)&&(a0=H);a5=/[clmz]/g;if(a0==r&&!(a8+at).match(a5)){var e={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},R=/([clmz]),?([^clmz]*)/gi,S=/-?[^,\s-]+/g;var a4=(a8+at)[aP](R,function(a9,bb,i){var ba=[];i[aP](S,function(bc){ba[f](O(bc));});return e[bb]+ba;});return a4;}var a6=a0(a8),E,a4=[],d;for(var a2=0,a7=a6[m];a21&&(e=1);a7.opacity=e;}a8.fill&&(a7.on=true);if(a7.on==null||a8.fill=="none"){a7.on=false;}if(a7.on&&a8.fill){var i=a8.fill.match(c);if(i){a7.src=i[1];a7.type="tile";}else{a7.color=an.getRGB(a8.fill).hex;a7.src=at;a7.type="solid";if(an.getRGB(a8.fill).error&&(bd.type in {circle:1,ellipse:1}||(a8.fill+at).charAt()!="r")&&b(bd,a8.fill)){a9.fill="none";a9.gradient=a8.fill;}}}ba&&a6[aL](a7);var R=(a6.getElementsByTagName("stroke")&&a6.getElementsByTagName("stroke")[0]),bb=false;!R&&(bb=R=ah("stroke"));if((a8.stroke&&a8.stroke!="none")||a8["stroke-width"]||a8["stroke-opacity"]!=null||a8["stroke-dasharray"]||a8["stroke-miterlimit"]||a8["stroke-linejoin"]||a8["stroke-linecap"]){R.on=true;}(a8.stroke=="none"||R.on==null||a8.stroke==0||a8["stroke-width"]==0)&&(R.on=false);R.on&&a8.stroke&&(R.color=an.getRGB(a8.stroke).hex);var e=((+a9["stroke-opacity"]+1||2)-1)*((+a9.opacity+1||2)-1),a4=(W(a8["stroke-width"])||1)*0.75;e<0&&(e=0);e>1&&(e=1);a8["stroke-width"]==null&&(a4=a9["stroke-width"]);a8["stroke-width"]&&(R.weight=a4);a4&&a4<1&&(e*=a4)&&(R.weight=1);R.opacity=e;a8["stroke-linejoin"]&&(R.joinstyle=a8["stroke-linejoin"]||"miter");R.miterlimit=a8["stroke-miterlimit"]||8;a8["stroke-linecap"]&&(R.endcap=a8["stroke-linecap"]=="butt"?"flat":a8["stroke-linecap"]=="square"?"square":"round");if(a8["stroke-dasharray"]){var a5={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};R.dashstyle=a5[Q](a8["stroke-dasharray"])?a5[a8["stroke-dasharray"]]:at;}bb&&a6[aL](R);}if(bd.type=="text"){var a0=bd.paper.span.style;a9.font&&(a0.font=a9.font);a9["font-family"]&&(a0.fontFamily=a9["font-family"]);a9["font-size"]&&(a0.fontSize=a9["font-size"]);a9["font-weight"]&&(a0.fontWeight=a9["font-weight"]);a9["font-style"]&&(a0.fontStyle=a9["font-style"]);bd.node.string&&(bd.paper.span.innerHTML=(bd.node.string+at)[aP](/"));bd.W=a9.w=bd.paper.span.offsetWidth;bd.H=a9.h=bd.paper.span.offsetHeight;bd.X=a9.x;bd.Y=a9.y+O(bd.H/2);switch(a9["text-anchor"]){case"start":bd.node.style["v-text-align"]="left";bd.bbx=O(bd.W/2);break;case"end":bd.node.style["v-text-align"]="right";bd.bbx=-O(bd.W/2);break;default:bd.node.style["v-text-align"]="center";break;}}};var b=function(d,a1){d.attrs=d.attrs||{};var a2=d.attrs,a4=d.node.getElementsByTagName("fill"),S="linear",a0=".5 .5";d.attrs.gradient=a1;a1=(a1+at)[aP](ar,function(a6,a7,i){S="radial";if(a7&&i){a7=W(a7);i=W(i);aM(a7-0.5,2)+aM(i-0.5,2)>0.25&&(i=ab.sqrt(0.25-aM(a7-0.5,2))*((i>0.5)*2-1)+0.5);a0=a7+am+i;}return at;});a1=a1[z](/\s*\-\s*/);if(S=="linear"){var e=a1.shift();e=-W(e);if(isNaN(e)){return null;}}var R=p(a1);if(!R){return null;}d=d.shape||d.node;a4=a4[0]||ah("fill");if(R[m]){a4.on=true;a4.method="none";a4.type=(S=="radial")?"gradientradial":"gradient";a4.color=R[0].color;a4.color2=R[R[m]-1].color;var a5=[];for(var E=0,a3=R[m];E');};}catch(af){ah=function(d){return L.createElement("<"+d+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}var w=function(){var i=ao[aW](null,arguments),d=i.container,a2=i.height,a3,e=i.width,a1=i.x,a0=i.y;if(!d){throw new Error("VML container not found.");}var R=new aT,S=R.canvas=L.createElement("div"),E=S.style;e=e||512;a2=a2||342;e==+e&&(e+="px");a2==+a2&&(a2+="px");R.width=1000;R.height=1000;R.coordsize="1000 1000";R.coordorigin="0 0";R.span=L.createElement("span");R.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";S[aL](R.span);E.cssText=an.format("width:{0};height:{1};position:absolute;clip:rect(0 {0} {1} 0);overflow:hidden",e,a2);if(d==1){L.body[aL](S);E.left=a1+"px";E.top=a0+"px";}else{d.style.width=e;d.style.height=a2;if(d.firstChild){d.insertBefore(S,d.firstChild);}else{d[aL](S);}}aG.call(R,R,an.fn);return R;};aT[aY].clear=function(){this.canvas.innerHTML=at;this.span=L.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[aL](this.span);this.bottom=this.top=null;};aT[aY].remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if((/^Apple|^Google/).test(navigator.vendor)&&!(navigator.userAgent.indexOf("Version/4.0")+1)){aT[aY].safari=function(){var d=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){d.remove();});};}else{aT[aY].safari=function(){};}var ae=(function(){if(L.addEventListener){return function(R,i,e,d){var E=function(S){return e.call(d,S);};R.addEventListener(i,E,false);return function(){R.removeEventListener(i,E,false);return true;};};}else{if(L.attachEvent){return function(S,E,i,e){var R=function(a0){return i.call(e,a0||au.event);};S.attachEvent("on"+E,R);var d=function(){S.detachEvent("on"+E,R);return true;};return d;};}}})();for(var ac=F[m];ac--;){(function(d){ax[aY][d]=function(e){if(an.is(e,"function")){this.events=this.events||[];this.events.push({name:d,f:e,unbind:ae(this.shape||this.node,d,e,this)});}return this;};ax[aY]["un"+d]=function(E){var i=this.events,e=i[m];while(e--){if(i[e].name==d&&i[e].f==E){i[e].unbind();i.splice(e,1);!i.length&&delete this.events;return this;}}return this;};})(F[ac]);}ax[aY].hover=function(e,d){return this.mouseover(e).mouseout(d);};ax[aY].unhover=function(e,d){return this.unmouseover(e).unmouseout(d);};aT[aY].circle=function(d,i,e){return P(this,d||0,i||0,e||0);};aT[aY].rect=function(d,R,e,i,E){return aF(this,d||0,R||0,e||0,i||0,E||0);};aT[aY].ellipse=function(d,E,i,e){return ai(this,d||0,E||0,i||0,e||0);};aT[aY].path=function(d){d&&!an.is(d,"string")&&!an.is(d[0],"array")&&(d+=at);return q(an.format[aW](an,arguments),this);};aT[aY].image=function(E,d,R,e,i){return o(this,E||"about:blank",d||0,R||0,e||0,i||0);};aT[aY].text=function(d,i,e){return X(this,d||0,i||0,e||at);};aT[aY].set=function(d){arguments[m]>1&&(d=Array[aY].splice.call(arguments,0,arguments[m]));return new T(d);};aT[aY].setSize=aV;aT[aY].top=aT[aY].bottom=null;aT[aY].raphael=an;function u(){return this.x+am+this.y;}ax[aY].scale=function(a6,a5,E,e){if(a6==null&&a5==null){return{x:this._.sx,y:this._.sy,toString:u};}a5=a5||a6;!+a5&&(a5=a6);var ba,a8,a9,a7,bm=this.attrs;if(a6!=0){var a4=this.getBBox(),a1=a4.x+a4.width/2,R=a4.y+a4.height/2,bl=a6/this._.sx,bk=a5/this._.sy;E=(+E||E==0)?E:a1;e=(+e||e==0)?e:R;var a3=~~(a6/ab.abs(a6)),a0=~~(a5/ab.abs(a5)),be=this.node.style,bo=E+(a1-E)*bl,bn=e+(R-e)*bk;switch(this.type){case"rect":case"image":var a2=bm.width*a3*bl,bd=bm.height*a0*bk;this.attr({height:bd,r:bm.r*aI(a3*bl,a0*bk),width:a2,x:bo-a2/2,y:bn-bd/2});break;case"circle":case"ellipse":this.attr({rx:bm.rx*a3*bl,ry:bm.ry*a0*bk,r:bm.r*aI(a3*bl,a0*bk),cx:bo,cy:bn});break;case"path":var bg=ad(bm.path),bh=true;for(var bj=0,bc=bg[m];bjS){if(e&&!a8.start){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);R+=["C",a6.start.x,a6.start.y,a6.m.x,a6.m.y,a6.x,a6.y];if(a0){return R;}a8.start=R;R=["M",a6.x,a6.y+"C",a6.n.x,a6.n.y,a6.end.x,a6.end.y,E[5],E[6]][az]();a3+=a1;a5=+E[5];a4=+E[6];continue;}if(!d&&!e){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);return{x:a6.x,y:a6.y,alpha:a6.alpha};}}a3+=a1;a5=+E[5];a4=+E[6];}R+=E;}a8.end=R;a6=d?a3:e?a8:an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],1);a6.alpha&&(a6={x:a6.x,y:a6.y,alpha:a6.alpha});return a6;};},n=aj(function(E,d,a0,S,a6,a5,a4,a3){var R={x:0,y:0},a2=0;for(var a1=0;a1<1.01;a1+=0.01){var e=M(E,d,a0,S,a6,a5,a4,a3,a1);a1&&(a2+=ab.sqrt(aM(R.x-e.x,2)+aM(R.y-e.y,2)));R=e;}return a2;});var ap=aB(1),C=aB(),J=aB(0,1);ax[aY].getTotalLength=function(){if(this.type!="path"){return;}return ap(this.attrs.path);};ax[aY].getPointAtLength=function(d){if(this.type!="path"){return;}return C(this.attrs.path,d);};ax[aY].getSubpath=function(i,e){if(this.type!="path"){return;}if(ab.abs(this.getTotalLength()-e)<0.000001){return J(this.attrs.path,i).end;}var d=J(this.attrs.path,e,1);return i?J(d,i).end:d;};an.easing_formulas={linear:function(d){return d;},"<":function(d){return aM(d,3);},">":function(d){return aM(d-1,3)+1;},"<>":function(d){d=d*2;if(d<1){return aM(d,3)/2;}d-=2;return(aM(d,3)+2)/2;},backIn:function(e){var d=1.70158;return e*e*((d+1)*e-d);},backOut:function(e){e=e-1;var d=1.70158;return e*e*((d+1)*e+d)+1;},elastic:function(i){if(i==0||i==1){return i;}var e=0.3,d=e/4;return aM(2,-10*i)*ab.sin((i-d)*(2*ab.PI)/e)+1;},bounce:function(E){var e=7.5625,i=2.75,d;if(E<(1/i)){d=e*E*E;}else{if(E<(2/i)){E-=(1.5/i);d=e*E*E+0.75;}else{if(E<(2.5/i)){E-=(2.25/i);d=e*E*E+0.9375;}else{E-=(2.625/i);d=e*E*E+0.984375;}}}return d;}};var I={length:0},aR=function(){var a2=+new Date;for(var be in I){if(be!="length"&&I[Q](be)){var bj=I[be];if(bj.stop){delete I[be];I[m]--;continue;}var a0=a2-bj.start,bb=bj.ms,ba=bj.easing,bf=bj.from,a7=bj.diff,E=bj.to,a6=bj.t,a9=bj.prev||0,a1=bj.el,R=bj.callback,a8={},d;if(a0255?255:(d<0?0:d);},t=function(d,i){if(d==null){return{x:this._.tx,y:this._.ty,toString:u};}this._.tx+=+d;this._.ty+=+i;switch(this.type){case"circle":case"ellipse":this.attr({cx:+d+this.attrs.cx,cy:+i+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+d+this.attrs.x,y:+i+this.attrs.y});break;case"path":var e=ad(this.attrs.path);e[0][1]+=+d;e[0][2]+=+i;this.attr({path:e});break;}return this;};ax[aY].animateWith=function(e,i,d,R,E){I[e.id]&&(i.start=I[e.id].start);return this.animate(i,d,R,E);};ax[aY].animateAlong=ay();ax[aY].animateAlongBack=ay(1);function ay(d){return function(E,i,e,S){var R={back:d};an.is(e,"function")?(S=e):(R.rot=e);E&&E.constructor==ax&&(E=E.attrs.path);E&&(R.along=E);return this.animate(R,i,S);};}ax[aY].onAnimation=function(d){this._run=d||0;return this;};ax[aY].animate=function(be,a5,a4,E){if(an.is(a4,"function")||!a4){E=a4||null;}var a9={},e={},a2={};for(var a6 in be){if(be[Q](a6)){if(Z[Q](a6)){a9[a6]=this.attr(a6);(a9[a6]==null)&&(a9[a6]=j[a6]);e[a6]=be[a6];switch(Z[a6]){case"along":var bc=ap(be[a6]),a7=C(be[a6],bc*!!be.back),R=this.getBBox();a2[a6]=bc/a5;a2.tx=R.x;a2.ty=R.y;a2.sx=a7.x;a2.sy=a7.y;e.rot=be.rot;e.back=be.back;e.len=bc;be.rot&&(a2.r=W(this.rotate())||0);break;case"number":a2[a6]=(e[a6]-a9[a6])/a5;break;case"colour":a9[a6]=an.getRGB(a9[a6]);var a8=an.getRGB(e[a6]);a2[a6]={r:(a8.r-a9[a6].r)/a5,g:(a8.g-a9[a6].g)/a5,b:(a8.b-a9[a6].b)/a5};break;case"path":var S=H(a9[a6],e[a6]);a9[a6]=S[0];var a3=S[1];a2[a6]=[];for(var bb=0,a1=a9[a6][m];bb \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/beer_contracts_with_stubs/mvnw.cmd b/beer_contracts_with_stubs/mvnw.cmd new file mode 100644 index 000000000..afba9814d --- /dev/null +++ b/beer_contracts_with_stubs/mvnw.cmd @@ -0,0 +1,161 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/beer_contracts_with_stubs/pom.xml b/beer_contracts_with_stubs/pom.xml new file mode 100644 index 000000000..c62e3ebe6 --- /dev/null +++ b/beer_contracts_with_stubs/pom.xml @@ -0,0 +1,168 @@ + + + 4.0.0 + + com.example + beer-contracts + 0.0.1.BUILD-SNAPSHOT + + Contracts + Contains all the contracts + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + Greenwich.BUILD-SNAPSHOT + 1.8 + 3.1.0 + + + + + + + org.springframework.boot + spring-boot-starter + test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.cloud + spring-cloud-starter-contract-verifier + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + contracts + prepare-package + + single + + + true + + ${project.basedir}/src/assembly/contracts.xml + + + false + + + + + + maven-jar-plugin + ${maven-jar-plugin.version} + + + default-jar + none + + jar + + + + + + maven-surefire-plugin + + true + + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/relationships.js b/beer_contracts_with_stubs/relationships.js new file mode 100644 index 000000000..15772c4d7 --- /dev/null +++ b/beer_contracts_with_stubs/relationships.js @@ -0,0 +1 @@ +relationships = '[{"source":"com.example:beer-api-producer-external:1.0.0","target":"foo.bar:beer-api-consumer"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:barService"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:bazService"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"anotherConsumerOnly"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:consumerOnly"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:fooService:1.2.3"},{"source":"foo.bar:barService","target":"yetAnotherConsumer"},{"source":"foo.bar:bazService","target":"bazConsumer1"}]' \ No newline at end of file diff --git a/beer_contracts_with_stubs/relationships_d3.html b/beer_contracts_with_stubs/relationships_d3.html new file mode 100644 index 000000000..1ef18117e --- /dev/null +++ b/beer_contracts_with_stubs/relationships_d3.html @@ -0,0 +1,97 @@ + + + + + + + \ No newline at end of file diff --git a/beer_contracts_with_stubs/relationships_dracula.html b/beer_contracts_with_stubs/relationships_dracula.html new file mode 100644 index 000000000..9211df492 --- /dev/null +++ b/beer_contracts_with_stubs/relationships_dracula.html @@ -0,0 +1,38 @@ + + + + + Dependency Graph + + + + + + + +

+ + + \ No newline at end of file diff --git a/beer_contracts_with_stubs/src/assembly/contracts.xml b/beer_contracts_with_stubs/src/assembly/contracts.xml new file mode 100644 index 000000000..0b18a4b97 --- /dev/null +++ b/beer_contracts_with_stubs/src/assembly/contracts.xml @@ -0,0 +1,28 @@ + + project + + jar + + false + + + + ${project.basedir}/src/main/resources/contracts/ + + / + true + + + **/${project.build.directory}/** + **/mvnw + **/mvnw.cmd + **/.mvn/** + **/src/assembly/** + **/src/test/** + **/target/** + + + + diff --git a/beer_contracts_with_stubs/src/main/resources/.gitignore b/beer_contracts_with_stubs/src/main/resources/.gitignore new file mode 100644 index 000000000..515c6f913 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/.gitignore @@ -0,0 +1,25 @@ +*~ +#* +*# +.#* +.classpath +.project +.settings/ +.springBeans +target/ +_site/ +.idea +*.iml +*.swp +.factorypath +*.logtjmeter +.checkstyle +*.log +.DS_Store +/spring-cloud-sleuth-core/nb-configuration.xml +/spring-cloud-sleuth-core/nbactions.xml +build/ +.gradle +mvnw +.mvn +mvnw.cmd \ No newline at end of file diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy new file mode 100644 index 000000000..247c62bae --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy @@ -0,0 +1,33 @@ +package contracts.beer.messaging + +org.springframework.cloud.contract.spec.Contract.make { + description(""" +Sends a positive verification message when person is eligible to get the beer + +``` +given: + client is old enough +when: + he applies for a beer +then: + we'll send a message with a positive verification +``` + +""") + // Label by means of which the output message can be triggered + label 'accepted_verification' + // input to the contract + input { + // the contract will be triggered by a method + triggeredBy('clientIsOldEnough()') + } + // output message of the contract + outputMessage { + // destination to which the output message will be sent + sentTo 'verifications' + // the body of the output message + body([ + eligible: true + ]) + } +} diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy new file mode 100644 index 000000000..514f24488 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy @@ -0,0 +1,33 @@ +package contracts.beer.messaging + +org.springframework.cloud.contract.spec.Contract.make { + description(""" +Sends a negative verification message when person is not eligible to get the beer + +``` +given: + client is too young +when: + he applies for a beer +then: + we'll send a message with a negative verification +``` + +""") + // Label by means of which the output message can be triggered + label 'rejected_verification' + // input to the contract + input { + // the contract will be triggered by a method + triggeredBy('clientIsTooYoung()') + } + // output message of the contract + outputMessage { + // destination to which the output message will be sent + sentTo 'verifications' + // the body of the output message + body([ + eligible: false + ]) + } +} diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/response.json b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/response.json new file mode 100644 index 000000000..ddf522f18 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/response.json @@ -0,0 +1,3 @@ +{ + "status": "OK" +} \ No newline at end of file diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy new file mode 100644 index 000000000..3e71c00ed --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy @@ -0,0 +1,37 @@ +package contracts.beer.rest + +org.springframework.cloud.contract.spec.Contract.make { + request { + description(""" +Represents a successful scenario of getting a beer + +given: + client is old enough +when: + he applies for a beer +then: + we'll grant him the beer +""") + method 'POST' + url '/check' + body( + age: value(consumer(regex('[2-9][0-9]'))) + ) + headers { + header 'Content-Type', 'application/json' + } + } + response { + status 200 + body( """ + { + "status": "OK" + } + """) + headers { + header( + 'Content-Type', value(consumer('application/json'),producer(regex('application/json.*'))) + ) + } + } +} diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy new file mode 100644 index 000000000..b66595b67 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy @@ -0,0 +1,36 @@ +package contracts.beer.rest + +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + description(""" +Represents a successful scenario of getting a beer + +``` +given: + client is old enough +when: + he applies for a beer +then: + we'll grant him the beer +``` + +""") + request { + method 'POST' + url '/check' + body( + age: value(consumer(regex('[2-9][0-9]'))) + ) + headers { + contentType(applicationJson()) + } + } + response { + status 200 + body(file('response.json')) + headers { + contentType(applicationJson()) + } + } +} diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy new file mode 100644 index 000000000..ef84a9a58 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy @@ -0,0 +1,37 @@ +package contracts.beer.rest + +org.springframework.cloud.contract.spec.Contract.make { + request { + description(""" +Represents a unsuccessful scenario of getting a beer + +given: + client is not old enough +when: + he applies for a beer +then: + we'll NOT grant him the beer +""") + method 'POST' + url '/check' + body( + age: value(consumer(regex('[0-1][0-9]'))) + ) + headers { + header 'Content-Type', 'application/json' + } + } + response { + status 200 + body( """ + { + "status": "NOT_OK" + } + """) + headers { + header( + 'Content-Type', value(consumer('application/json'),producer(regex('application/json.*'))) + ) + } + } +} diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/pom.xml b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/pom.xml new file mode 100644 index 000000000..97c11ac82 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/pom.xml @@ -0,0 +1,121 @@ + + + + 4.0.0 + + com.example + beer-api-producer-external + 0.0.1.BUILD-SNAPSHOT + + Beer API producer Stubs + POM used to install locally stubs for consumer side + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + 1.8 + 2.1.3.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT + + true + + true + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + ${project.basedir} + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/anotherConsumerOnly/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/anotherConsumerOnly/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/barService/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/barService/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.bazService/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.bazService/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.consumerOnly/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.consumerOnly/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.fooService.1_2_3/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.fooService.1_2_3/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/pom.xml b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/pom.xml new file mode 100644 index 000000000..97c11ac82 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/pom.xml @@ -0,0 +1,121 @@ + + + + 4.0.0 + + com.example + beer-api-producer-external + 0.0.1.BUILD-SNAPSHOT + + Beer API producer Stubs + POM used to install locally stubs for consumer side + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + 1.8 + 2.1.3.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT + + true + + true + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + ${project.basedir} + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/pom.xml b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/pom.xml new file mode 100644 index 000000000..a06dd875c --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/pom.xml @@ -0,0 +1,126 @@ + + + 4.0.0 + + foo.bar + barService + 0.0.1.BUILD-SNAPSHOT + + Baz Service producer Stubs + POM used to install locally stubs for consumer side + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + 1.8 + 2.1.3.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT + true + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + ${project.basedir} + **/target/**/*.* + + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy new file mode 100644 index 000000000..5a99d7f0e --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy @@ -0,0 +1,11 @@ +package contracts.foo.bar.bazService.bazConsumer.rest + +org.springframework.cloud.contract.spec.Contract.make { + request { + method 'GET' + url '/hello' + } + response { + status 200 + } +} diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/pom.xml b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/pom.xml new file mode 100644 index 000000000..ee4700868 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + foo.bar + bazService + 0.0.1.BUILD-SNAPSHOT + + Baz Service producer Stubs + POM used to install locally stubs for consumer side + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + 1.8 + 2.1.3.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT + true + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + ${project.basedir} + **/target/**/*.* + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/pom.xml b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/pom.xml new file mode 100644 index 000000000..b1e620370 --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + foo.bar + beer-api-consumer + 0.0.1.BUILD-SNAPSHOT + + Baz Service producer Stubs + POM used to install locally stubs for consumer side + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + 1.8 + 2.1.3.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT + true + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + ${project.basedir} + **/target/**/*.* + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/fooService/1.2.3/pom.xml b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/fooService/1.2.3/pom.xml new file mode 100644 index 000000000..378635e3c --- /dev/null +++ b/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/fooService/1.2.3/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + foo.bar + fooService + 1.2.3 + + Baz Service producer Stubs + POM used to install locally stubs for consumer side + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + 1.8 + 2.1.3.BUILD-SNAPSHOT + Greenwich.BUILD-SNAPSHOT + true + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud-dependencies.version} + pom + import + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.19.1 + + true + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + ${project.basedir} + **/target/**/*.* + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java b/beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java new file mode 100644 index 000000000..68ebca6cf --- /dev/null +++ b/beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java @@ -0,0 +1,118 @@ +package docs; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.contract.spec.Contract; +import org.springframework.cloud.contract.verifier.util.ContractVerifierDslConverter; +import org.springframework.core.io.Resource; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.Collection; +import java.util.regex.Pattern; + +@RunWith(SpringRunner.class) +public class GenerateAdocsFromContractsTests { + + // TODO: Can be parametrized + @Value("classpath:contracts") Resource contracts; + private static String header = "= Application Contracts\n" + "\n" + + "In the following document you'll be able to see all the contracts that are present for this application.\n" + + "\n" + "== Contracts\n"; + + @Test public void should_convert_contracts_into_adoc() throws IOException { + final StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(header); + final Path rootDir = this.contracts.getFile().toPath(); + + Files.walkFileTree(rootDir, new FileVisitor() { + private Pattern pattern = Pattern.compile("^.*groovy$"); + + @Override + public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes atts) + throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path path, BasicFileAttributes mainAtts) + throws IOException { + boolean matches = this.pattern.matcher(path.toString()).matches(); + if (matches) { + appendContract(stringBuilder, path); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path path, IOException exc) + throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override public FileVisitResult visitFileFailed(Path path, IOException exc) + throws IOException { + // If the root directory has failed it makes no sense to continue + return path.equals(rootDir) ? + FileVisitResult.TERMINATE : + FileVisitResult.CONTINUE; + } + }); + + //String outputAdoc = asciidoctor.convert(stringBuilder.toString(), new HashMap()); + String outputAdoc = stringBuilder.toString(); + // TODO: Can be parametrized + File outputDir = new File("target/generated-snippets"); + outputDir.mkdirs(); + // TODO: Can be parametrized + File outputFile = new File(outputDir, "contracts.adoc"); + if (outputFile.exists()) { + outputFile.delete(); + } + if (outputFile.createNewFile()) { + Files.write(outputFile.toPath(), outputAdoc.getBytes()); + } + } + + static StringBuilder appendContract(final StringBuilder stringBuilder, Path path) + throws IOException { + Collection contracts = ContractVerifierDslConverter.convertAsCollection(path.getParent().toFile(), path.toFile()); + // TODO: Can be parametrized + contracts.forEach(contract -> { + stringBuilder.append("### ") + .append(path.getFileName().toString()) + .append("\n\n") + .append(contract.getDescription()) + .append("\n\n") + .append("#### Contract structure") + .append("\n\n") + .append("[source,java,indent=0]") + .append("\n") + .append("----") + .append("\n") + .append(fileAsString(path)) + .append("\n") + .append("----") + .append("\n\n"); + }); + return stringBuilder; + } + + static String fileAsString(Path path) { + try { + byte[] encoded = Files.readAllBytes(path); + return new String(encoded, StandardCharsets.UTF_8); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java b/beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java new file mode 100644 index 000000000..5f668eaac --- /dev/null +++ b/beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java @@ -0,0 +1,206 @@ +package docs; + +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * Generates a JSON file that will be used to sketch + * the dependencies between projects + * + * @author Marcin Grzejszczak + */ +@RunWith(SpringRunner.class) +public class GenerateGraphFromContractsTests { + private final ObjectMapper mapper = new ObjectMapper(); + + @Value("classpath:contracts") Resource contracts; + + @Test + public void should_build_a_list_of_relationships() throws IOException { + Path root = Paths.get(this.contracts.getURI()); + DependencyWalker dependencyWalker = new DependencyWalker(root); + + Files.walkFileTree(root, dependencyWalker); + + File outputFile = new File("relationships.js"); + String relationships = this.mapper.writeValueAsString(dependencyWalker.relationships()); + outputFile.createNewFile(); + Files.write(outputFile.toPath(), ("relationships = '" + relationships + "'").getBytes()); + } +} + +class Relationship { + public String source; + public String target; + + public Relationship(String source, String target) { + this.source = source; + this.target = target; + } +} + +class DependencyWalker extends SimpleFileVisitor { + + private static final Logger log = LoggerFactory.getLogger(DependencyWalker.class); + private static final Pattern SEMVER = Pattern.compile("^(\\d+\\.)?(\\d+\\.)?(\\*|\\d+)$"); + private static final List SKIPPED_FOLDERS = Arrays.asList("mvn", "target", "build", ".mvn", ".gradle", ".idea", "eclipse"); + + private final List foundProducers = new ArrayList<>(); + private final List foundConsumers = new ArrayList<>(); + private final List relationships = new ArrayList<>(); + private final Path root; + + DependencyWalker(Path root) { + this.root = root; + } + + List foundProducers() { + return this.foundProducers; + } + + List foundConsumers() { + // TODO: print which consumers are not matched + return this.foundConsumers; + } + + List relationships() { + // parent has always group and artifact but a child not necessarily + // we need to assume that if a child has just artifact id then we'll match it against + // the first parent + // TODO: Add an option to explicitly match it (or just document to use groupid.artifactid.version_with_underscores) + this.relationships.forEach(relationship -> { + this.foundProducers.stream() + .filter(s -> relationship.target.equals(artifactId(s))) + .findFirst() + .ifPresent(s -> relationship.target = s); + }); + return this.relationships; + } + + private String artifactId(String name) { + if (name.contains(".")) { + String[] split = name.split(":"); + // [foo],[bar],[bazService],[1.2.3] + String potentialVersion = split[split.length - 1]; + if (isSemver(potentialVersion)) { + // bazService + return split[split.length - 2]; + } + // [foo],[bar],[bazService] + return potentialVersion; + } + // bazService + return name; + } + + @Override public FileVisitResult preVisitDirectory(Path dir, + BasicFileAttributes attrs) throws IOException { + File producer = dir.toFile(); + boolean pomExists = new File(producer, "pom.xml").exists(); + boolean gradleExists = new File(producer, "build.gradle").exists(); + // in this case we don't know explicitly who the consumers are + boolean producerContracts = new File(producer, ".producer_contracts").exists(); + if (pomExists || gradleExists) { + // com/example/producer/1.0.0 -> com/example + // com/example/producer -> com/example + boolean isSemVerDir = isSemver(dir.getFileName().toString()); + Path artifactId = isSemVerDir ? dir.getParent() : dir; + Path artifactIdParent = artifactId.getParent(); + String version = isSemVerDir ? dir.getFileName().toString() : ""; + Path relativePath = this.root.relativize(artifactIdParent); + // com/example -> com.example + String relativeGroupId = relativePath.toString().replace(File.separator, "."); + String producerName = artifactId.getFileName().toString(); + // com.example:producer + // com.example:producer:1.0.0 + String gav = relativeGroupId + ":" + producerName + (isSemVerDir ? ":" + version : ""); + File[] consumers = new File[0]; + List consumerForProducer = new ArrayList<>(); + if (!producerContracts) { + consumers = producer.listFiles(File::isDirectory); + if (consumers != null && consumers.length > 0) { + Arrays.stream(consumers) + .filter(file -> !SKIPPED_FOLDERS.contains(file.getName())) + .forEach(file -> { + String consumerName = folderToGav(file); + consumerForProducer.add(consumerName); + this.foundConsumers.add(consumerName); + this.relationships.add(new Relationship(gav, consumerName)); + }); + } + } + log.info("Found [" + gav + "] producer with consumers " + consumerForProducer); + this.foundProducers.add(gav); + return FileVisitResult.SKIP_SUBTREE; + } + return super.preVisitDirectory(dir, attrs); + } + + private boolean isSemver(String name) { + //TODO: Consider adding some file like .version for non semver + return SEMVER.matcher(name).matches(); + } + + private String folderToGav(File file) { + String fileName = file.getName(); + // (1) bazService + // (2) foo.bar.bazService + // (3) foo.bar.bazService.1_2_3 + if (fileName.contains(".")) { + String[] split = fileName.split("\\."); + // (2) [foo],[bar],[bazService] + // (3) [foo],[bar],[bazService],[1.2.3] + String potentialVersion = split[split.length - 1].replace("_", "."); + if (isSemver(potentialVersion)) { + // 1.2.3 + String version = potentialVersion; + // bazService + String artifactId = split[split.length - 2]; + StringBuilder group = new StringBuilder(); + for (int i = 0; i < split.length - 2; i++) { + group.append(split[i]); + if (i + 1 < split.length - 2) { + group.append("."); + } + } + // foo.bar + String groupId = group.toString(); + // (3) foo.bar:bazService:1.2.3 + return groupId + ":" + artifactId + ":" + version; + } + // (2) foo.bar.bazService -> foo.bar:bazService + return replaceLast(fileName, ".", ":"); + } + // (3) bazService + return fileName; + } + + private String replaceLast(String string, String substring, String replacement) { + int index = string.lastIndexOf(substring); + if (index == -1) { + return string; + } + return string.substring(0, index) + replacement + string + .substring(index + substring.length()); + } + +} \ No newline at end of file From cbb90f6f24f27c100f27ed91d8cc61c03f433904 Mon Sep 17 00:00:00 2001 From: Robert Zilke Date: Tue, 6 Aug 2019 14:15:25 +0200 Subject: [PATCH 2/3] Module producer_with_external_contracts_classpath added, copied from producer_with_external_contracts --- .../.gitignore | 22 ++ .../.mvn/wrapper/MavenWrapperDownloader.java | 110 +++++++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 48336 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + .../LICENSE.txt | 202 +++++++++++++ .../build.gradle | 88 ++++++ .../gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54413 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + .../gradlew | 172 +++++++++++ .../gradlew.bat | 84 +++++ .../mvnw | 286 ++++++++++++++++++ .../mvnw.cmd | 161 ++++++++++ .../pom.xml | 196 ++++++++++++ .../settings.gradle | 1 + .../AgeCheckingPersonCheckingService.java | 46 +++ .../java/com/example/ProducerApplication.java | 15 + .../java/com/example/ProducerController.java | 57 ++++ .../src/main/resources/application.yml | 11 + .../java/com/example/BeerMessagingBase.java | 50 +++ .../test/java/com/example/BeerRestBase.java | 22 ++ 21 files changed, 1533 insertions(+) create mode 100644 producer_with_external_contracts_classpath/.gitignore create mode 100644 producer_with_external_contracts_classpath/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 producer_with_external_contracts_classpath/.mvn/wrapper/maven-wrapper.jar create mode 100644 producer_with_external_contracts_classpath/.mvn/wrapper/maven-wrapper.properties create mode 100644 producer_with_external_contracts_classpath/LICENSE.txt create mode 100644 producer_with_external_contracts_classpath/build.gradle create mode 100644 producer_with_external_contracts_classpath/gradle.properties create mode 100644 producer_with_external_contracts_classpath/gradle/wrapper/gradle-wrapper.jar create mode 100644 producer_with_external_contracts_classpath/gradle/wrapper/gradle-wrapper.properties create mode 100644 producer_with_external_contracts_classpath/gradlew create mode 100644 producer_with_external_contracts_classpath/gradlew.bat create mode 100644 producer_with_external_contracts_classpath/mvnw create mode 100644 producer_with_external_contracts_classpath/mvnw.cmd create mode 100644 producer_with_external_contracts_classpath/pom.xml create mode 100644 producer_with_external_contracts_classpath/settings.gradle create mode 100644 producer_with_external_contracts_classpath/src/main/java/com/example/AgeCheckingPersonCheckingService.java create mode 100644 producer_with_external_contracts_classpath/src/main/java/com/example/ProducerApplication.java create mode 100644 producer_with_external_contracts_classpath/src/main/java/com/example/ProducerController.java create mode 100644 producer_with_external_contracts_classpath/src/main/resources/application.yml create mode 100644 producer_with_external_contracts_classpath/src/test/java/com/example/BeerMessagingBase.java create mode 100644 producer_with_external_contracts_classpath/src/test/java/com/example/BeerRestBase.java diff --git a/producer_with_external_contracts_classpath/.gitignore b/producer_with_external_contracts_classpath/.gitignore new file mode 100644 index 000000000..29391880e --- /dev/null +++ b/producer_with_external_contracts_classpath/.gitignore @@ -0,0 +1,22 @@ +*~ +#* +*# +.#* +.classpath +.project +.settings/ +.springBeans +target/ +_site/ +.idea +*.iml +*.swp +.factorypath +*.logtjmeter +.checkstyle +*.log +.DS_Store +/spring-cloud-sleuth-core/nb-configuration.xml +/spring-cloud-sleuth-core/nbactions.xml +build/ +.gradle \ No newline at end of file diff --git a/producer_with_external_contracts_classpath/.mvn/wrapper/MavenWrapperDownloader.java b/producer_with_external_contracts_classpath/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 000000000..8768217da --- /dev/null +++ b/producer_with_external_contracts_classpath/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,110 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: : " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/producer_with_external_contracts_classpath/.mvn/wrapper/maven-wrapper.jar b/producer_with_external_contracts_classpath/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..08ebbb67f088c53eac9a4e2cb019b93f69a1e49c GIT binary patch literal 48336 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 H*Ps3mB7Q<; literal 0 HcmV?d00001 diff --git a/producer_with_external_contracts_classpath/.mvn/wrapper/maven-wrapper.properties b/producer_with_external_contracts_classpath/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 000000000..a5fcc1192 --- /dev/null +++ b/producer_with_external_contracts_classpath/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/producer_with_external_contracts_classpath/LICENSE.txt b/producer_with_external_contracts_classpath/LICENSE.txt new file mode 100644 index 000000000..62589edd1 --- /dev/null +++ b/producer_with_external_contracts_classpath/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/producer_with_external_contracts_classpath/build.gradle b/producer_with_external_contracts_classpath/build.gradle new file mode 100644 index 000000000..f6823aeed --- /dev/null +++ b/producer_with_external_contracts_classpath/build.gradle @@ -0,0 +1,88 @@ +buildscript { + repositories { + mavenCentral() + mavenLocal() + maven { url "https://repo.spring.io/snapshot" } + maven { url "https://repo.spring.io/milestone" } + maven { url "https://repo.spring.io/release" } + } + dependencies { + classpath "org.springframework.boot:spring-boot-gradle-plugin:${findProperty('bootVersion') ?: bootVersion}" + // remove::start[] + classpath "org.springframework.cloud:spring-cloud-contract-gradle-plugin:${findProperty('verifierVersion') ?: verifierVersion}" + // remove::end[] + } +} + +println "Boot Version [${findProperty('bootVersion') ?: bootVersion}], Cloud version [${findProperty('BOM_VERSION') ?: BOM_VERSION}], Contract version [${findProperty('verifierVersion') ?: verifierVersion}]" + +group = 'com.example' +version = '0.0.1.BUILD-SNAPSHOT' + +repositories { + mavenCentral() + mavenLocal() + maven { url "https://repo.spring.io/snapshot" } + maven { url "https://repo.spring.io/milestone" } + maven { url "https://repo.spring.io/release" } +} + +apply plugin: 'groovy' +apply plugin: 'org.springframework.boot' +apply plugin: 'io.spring.dependency-management' +// remove::start[] +apply plugin: 'spring-cloud-contract' +// remove::end[] +apply plugin: 'maven-publish' + +dependencyManagement { + imports { + mavenBom "org.springframework.cloud:spring-cloud-dependencies:${project.findProperty('BOM_VERSION') ?: BOM_VERSION}" + } +} + +sourceCompatibility = org.gradle.api.JavaVersion.VERSION_1_8 + +dependencies { + compile("org.springframework.boot:spring-boot-starter-web") + compile("org.springframework.boot:spring-boot-starter-actuator") + compile("org.springframework.cloud:spring-cloud-starter-stream-rabbit") + + testCompile("org.springframework.cloud:spring-cloud-stream-test-support") + // remove::start[] + testCompile("org.springframework.cloud:spring-cloud-starter-contract-verifier") + // remove::end[] +} + +// remove::start[] +contracts { + // We want to use the JAR with contracts with the following coordinates + // group id `com.example`, artifact id `beer-contracts`, LATEST version and NO classifier + contractDependency { + stringNotation = 'com.example:beer-contracts:+:' + } + // The JAR with contracts should be taken from Maven local + contractsMode = "LOCAL" + // Base package for generated tests + basePackageForTests = "com.example" + baseClassMappings { + baseClassMapping(".*messaging.*", "com.example.BeerMessagingBase") + baseClassMapping(".*rest.*", "com.example.BeerRestBase") + } +} +// remove::end[] + +test { + testLogging { + exceptionFormat = 'full' + } + afterSuite { desc, result -> + if (!desc.parent) { + println "Results: (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)" + boolean skipTests = Boolean.parseBoolean(project.findProperty('SKIP_TESTS') ?: "false") + if (result.testCount == 0 && !skipTests) { + throw new IllegalStateException("No tests were found. Failing the build") + } + } + } +} diff --git a/producer_with_external_contracts_classpath/gradle.properties b/producer_with_external_contracts_classpath/gradle.properties new file mode 100644 index 000000000..e1d53bc8c --- /dev/null +++ b/producer_with_external_contracts_classpath/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.daemon=false +verifierVersion=2.1.3.BUILD-SNAPSHOT +bootVersion=2.1.3.RELEASE +BOM_VERSION=Greenwich.BUILD-SNAPSHOT diff --git a/producer_with_external_contracts_classpath/gradle/wrapper/gradle-wrapper.jar b/producer_with_external_contracts_classpath/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1948b9074f1016d15d505d185bc3f73deb82d8c8 GIT binary patch literal 54413 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/producer_with_external_contracts_classpath/gradlew.bat b/producer_with_external_contracts_classpath/gradlew.bat new file mode 100644 index 000000000..f9553162f --- /dev/null +++ b/producer_with_external_contracts_classpath/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/producer_with_external_contracts_classpath/mvnw b/producer_with_external_contracts_classpath/mvnw new file mode 100644 index 000000000..1d5ace7fc --- /dev/null +++ b/producer_with_external_contracts_classpath/mvnw @@ -0,0 +1,286 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/producer_with_external_contracts_classpath/mvnw.cmd b/producer_with_external_contracts_classpath/mvnw.cmd new file mode 100644 index 000000000..afba9814d --- /dev/null +++ b/producer_with_external_contracts_classpath/mvnw.cmd @@ -0,0 +1,161 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/producer_with_external_contracts_classpath/pom.xml b/producer_with_external_contracts_classpath/pom.xml new file mode 100644 index 000000000..d9ef054e4 --- /dev/null +++ b/producer_with_external_contracts_classpath/pom.xml @@ -0,0 +1,196 @@ + + + 4.0.0 + + com.example + beer-api-producer-external + 0.0.1.BUILD-SNAPSHOT + jar + + Producer With External Contracts + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + Greenwich.BUILD-SNAPSHOT + 2.1.3.BUILD-SNAPSHOT + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.springframework.cloud + spring-cloud-starter-stream-rabbit + + + org.springframework.cloud + spring-cloud-stream-test-support + test + + + + + + org.springframework.cloud + spring-cloud-starter-contract-verifier + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + maven-surefire-plugin + + true + + + + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true + + + + .*messaging.* + com.example.BeerMessagingBase + + + .*rest.* + com.example.BeerRestBase + + + + + com.example + beer-contracts + + + LOCAL + + com.example + + + + + org.springframework.cloud + spring-cloud-contract-verifier + ${spring-cloud-contract.version} + + + + + + + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-releases + Spring Releases + https://repo.spring.io/release + + false + + + + + + spring-snapshots + Spring Snapshots + https://repo.spring.io/libs-snapshot-local + + true + + + + spring-milestones + Spring Milestones + https://repo.spring.io/libs-milestone-local + + false + + + + spring-plugin-snapshots + Spring Snapshots + https://repo.spring.io/plugins-snapshot-local + + true + + + + spring-plugin-milestones + Spring Milestones + https://repo.spring.io/plugins-release-local + + false + + + + + diff --git a/producer_with_external_contracts_classpath/settings.gradle b/producer_with_external_contracts_classpath/settings.gradle new file mode 100644 index 000000000..b4bfa0810 --- /dev/null +++ b/producer_with_external_contracts_classpath/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'beer-api-producer-external' diff --git a/producer_with_external_contracts_classpath/src/main/java/com/example/AgeCheckingPersonCheckingService.java b/producer_with_external_contracts_classpath/src/main/java/com/example/AgeCheckingPersonCheckingService.java new file mode 100644 index 000000000..cc508f9ae --- /dev/null +++ b/producer_with_external_contracts_classpath/src/main/java/com/example/AgeCheckingPersonCheckingService.java @@ -0,0 +1,46 @@ +package com.example; + +import org.springframework.cloud.stream.messaging.Source; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Service; + +/** + * @author Marcin Grzejszczak + */ +@Service +public class AgeCheckingPersonCheckingService implements PersonCheckingService { + + private final Source source; + + public AgeCheckingPersonCheckingService(Source source) { + this.source = source; + } + + @Override + public Boolean shouldGetBeer(PersonToCheck personToCheck) { + //remove::start[] + boolean shouldGetBeer = personToCheck.age >= 20; + this.source.output().send(MessageBuilder.withPayload(new Verification(shouldGetBeer)).build()); + return shouldGetBeer; + //remove::end[return] + } + + public static class Verification { + boolean eligible; + + public Verification(boolean eligible) { + this.eligible = eligible; + } + + public Verification() { + } + + public boolean isEligible() { + return this.eligible; + } + + public void setEligible(boolean eligible) { + this.eligible = eligible; + } + } +} diff --git a/producer_with_external_contracts_classpath/src/main/java/com/example/ProducerApplication.java b/producer_with_external_contracts_classpath/src/main/java/com/example/ProducerApplication.java new file mode 100644 index 000000000..e667894e9 --- /dev/null +++ b/producer_with_external_contracts_classpath/src/main/java/com/example/ProducerApplication.java @@ -0,0 +1,15 @@ +package com.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.messaging.Source; + +@SpringBootApplication +@EnableBinding(Source.class) +public class ProducerApplication { + + public static void main(String[] args) { + SpringApplication.run(ProducerApplication.class, args); + } +} diff --git a/producer_with_external_contracts_classpath/src/main/java/com/example/ProducerController.java b/producer_with_external_contracts_classpath/src/main/java/com/example/ProducerController.java new file mode 100644 index 000000000..357351129 --- /dev/null +++ b/producer_with_external_contracts_classpath/src/main/java/com/example/ProducerController.java @@ -0,0 +1,57 @@ +package com.example; + +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class ProducerController { + + private final PersonCheckingService personCheckingService; + + public ProducerController(PersonCheckingService personCheckingService) { + this.personCheckingService = personCheckingService; + } + + @RequestMapping(value = "/check", + method=RequestMethod.POST, + consumes="application/json", + produces="application/json") + public Response check(@RequestBody PersonToCheck personToCheck) { + //remove::start[] + if (this.personCheckingService.shouldGetBeer(personToCheck)) { + return new Response(BeerCheckStatus.OK); + } + return new Response(BeerCheckStatus.NOT_OK); + //remove::end[return] + } + +} + +interface PersonCheckingService { + Boolean shouldGetBeer(PersonToCheck personToCheck); +} + +class PersonToCheck { + public int age; + + public PersonToCheck(int age) { + this.age = age; + } + + public PersonToCheck() { + } +} + +class Response { + public BeerCheckStatus status; + + Response(BeerCheckStatus status) { + this.status = status; + } +} + +enum BeerCheckStatus { + OK, NOT_OK +} \ No newline at end of file diff --git a/producer_with_external_contracts_classpath/src/main/resources/application.yml b/producer_with_external_contracts_classpath/src/main/resources/application.yml new file mode 100644 index 000000000..ee49c635e --- /dev/null +++ b/producer_with_external_contracts_classpath/src/main/resources/application.yml @@ -0,0 +1,11 @@ +spring: + application.name: beer-api-producer + cloud.stream.bindings.output: + content-type: application/json + # remove::start[] + destination: verifications + # remove::end[] +server.port: ${PORT:8080} +logging: + level: + org.springframework.cloud: debug \ No newline at end of file diff --git a/producer_with_external_contracts_classpath/src/test/java/com/example/BeerMessagingBase.java b/producer_with_external_contracts_classpath/src/test/java/com/example/BeerMessagingBase.java new file mode 100644 index 000000000..3a4b530be --- /dev/null +++ b/producer_with_external_contracts_classpath/src/test/java/com/example/BeerMessagingBase.java @@ -0,0 +1,50 @@ +package com.example; + +import org.junit.Before; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +//remove::start[] +import org.springframework.cloud.contract.verifier.messaging.MessageVerifier; +import org.springframework.cloud.contract.verifier.messaging.boot.AutoConfigureMessageVerifier; +//remove::end[] +import org.springframework.test.context.junit4.SpringRunner; + +//remove::start[] +import javax.inject.Inject; +//remove::end[] +import java.util.concurrent.TimeUnit; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ProducerApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) +//remove::start[] +@AutoConfigureMessageVerifier +//remove::end[] +public abstract class BeerMessagingBase { + //remove::start[] + @Inject MessageVerifier messaging; + //remove::end[] + @Autowired PersonCheckingService personCheckingService; + + @Before + public void setup() { + // let's clear any remaining messages + // output == destination or channel name + //remove::start[] + this.messaging.receive("output", 100, TimeUnit.MILLISECONDS); + //remove::end[] + } + + public void clientIsOldEnough() { + //remove::start[] + this.personCheckingService.shouldGetBeer(new PersonToCheck(25)); + //remove::end[] + } + + public void clientIsTooYoung() { + //remove::start[] + this.personCheckingService.shouldGetBeer(new PersonToCheck(5)); + //remove::end[] + } + +} diff --git a/producer_with_external_contracts_classpath/src/test/java/com/example/BeerRestBase.java b/producer_with_external_contracts_classpath/src/test/java/com/example/BeerRestBase.java new file mode 100644 index 000000000..024966dcd --- /dev/null +++ b/producer_with_external_contracts_classpath/src/test/java/com/example/BeerRestBase.java @@ -0,0 +1,22 @@ +package com.example; + +//remove::start[] +import io.restassured.module.mockmvc.RestAssuredMockMvc; +import org.junit.Before; + +//remove::end[] + +public abstract class BeerRestBase { + //remove::start[] + ProducerController producerController = new ProducerController(oldEnough()); + + @Before + public void setup() { + RestAssuredMockMvc.standaloneSetup(this.producerController); + } + + private PersonCheckingService oldEnough() { + return argument -> argument.age >= 20; + } + //remove::end[] +} From 34046f6b4c88cf83bfcf00e0a9a238514d6085e1 Mon Sep 17 00:00:00 2001 From: Robert Zilke Date: Tue, 6 Aug 2019 14:45:58 +0200 Subject: [PATCH 3/3] Draft for PR: External contracts with contractsMode CLASSPATH --- beer_contracts_with_stubs/README.adoc | 179 ----------- .../example/graphs/d3.png | Bin 33940 -> 0 bytes .../example/graphs/dracula.png | Bin 61477 -> 0 bytes beer_contracts_with_stubs/example/pom.xml | 129 -------- beer_contracts_with_stubs/js/d3.min.js | 5 - beer_contracts_with_stubs/js/dracula.min.js | 1 - beer_contracts_with_stubs/js/graffle.js | 101 ------ beer_contracts_with_stubs/js/graph.js | 303 ------------------ beer_contracts_with_stubs/js/raphael-min.js | 7 - beer_contracts_with_stubs/pom.xml | 51 +-- beer_contracts_with_stubs/relationships.js | 1 - .../relationships_d3.html | 97 ------ .../relationships_dracula.html | 38 --- .../src/assembly/contracts.xml | 28 -- .../docs/GenerateAdocsFromContractsTests.java | 118 ------- .../docs/GenerateGraphFromContractsTests.java | 206 ------------ .../src/{main => test}/resources/.gitignore | 0 .../shouldSendAcceptedVerification.groovy | 0 .../shouldSendRejectedVerification.groovy | 0 .../beer-api-consumer/rest/response.json | 0 .../rest/shouldGrantABeerIfOldEnough.groovy | 0 ...shouldGrantABeerIfOldEnoughFromFile.groovy | 0 .../rest/shouldRejectABeerIfTooYoung.groovy | 0 .../1.0.0/pom.xml | 0 .../2.0.0/anotherConsumerOnly/.gitkeep | 0 .../2.0.0/barService/.gitkeep | 0 .../2.0.0/foo.bar.bazService/.gitkeep | 0 .../2.0.0/foo.bar.consumerOnly/.gitkeep | 0 .../2.0.0/foo.bar.fooService.1_2_3/.gitkeep | 0 .../2.0.0/pom.xml | 0 .../contracts/foo/bar/barService/pom.xml | 0 .../barService/yetAnotherConsumer/.gitkeep | 0 .../bazConsumer1/rest/shouldSayHello.groovy | 0 .../contracts/foo/bar/bazService/pom.xml | 0 .../bar/beer-api-consumer/.producer_contracts | 0 .../bar/beer-api-consumer/messaging/.gitkeep | 0 .../foo/bar/beer-api-consumer/pom.xml | 0 .../foo/bar/beer-api-consumer/rest/.gitkeep | 0 .../foo/bar/fooService/1.2.3/pom.xml | 0 pom-external-classpath.xml | 39 +++ .../pom.xml | 24 +- 41 files changed, 68 insertions(+), 1259 deletions(-) delete mode 100644 beer_contracts_with_stubs/README.adoc delete mode 100644 beer_contracts_with_stubs/example/graphs/d3.png delete mode 100644 beer_contracts_with_stubs/example/graphs/dracula.png delete mode 100644 beer_contracts_with_stubs/example/pom.xml delete mode 100644 beer_contracts_with_stubs/js/d3.min.js delete mode 100644 beer_contracts_with_stubs/js/dracula.min.js delete mode 100644 beer_contracts_with_stubs/js/graffle.js delete mode 100644 beer_contracts_with_stubs/js/graph.js delete mode 100644 beer_contracts_with_stubs/js/raphael-min.js delete mode 100644 beer_contracts_with_stubs/relationships.js delete mode 100644 beer_contracts_with_stubs/relationships_d3.html delete mode 100644 beer_contracts_with_stubs/relationships_dracula.html delete mode 100644 beer_contracts_with_stubs/src/assembly/contracts.xml delete mode 100644 beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java delete mode 100644 beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java rename beer_contracts_with_stubs/src/{main => test}/resources/.gitignore (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/1.0.0/beer-api-consumer/rest/response.json (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/1.0.0/pom.xml (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/2.0.0/anotherConsumerOnly/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/2.0.0/barService/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/2.0.0/foo.bar.bazService/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/2.0.0/foo.bar.consumerOnly/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/2.0.0/foo.bar.fooService.1_2_3/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main/resources/contracts/com/example/beer-api-producer-external => test/resources/contracts/com/example/beer-api-producer-external-classpath}/2.0.0/pom.xml (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/barService/pom.xml (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/bazService/pom.xml (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/beer-api-consumer/pom.xml (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep (100%) rename beer_contracts_with_stubs/src/{main => test}/resources/contracts/foo/bar/fooService/1.2.3/pom.xml (100%) create mode 100644 pom-external-classpath.xml diff --git a/beer_contracts_with_stubs/README.adoc b/beer_contracts_with_stubs/README.adoc deleted file mode 100644 index 0f9f72052..000000000 --- a/beer_contracts_with_stubs/README.adoc +++ /dev/null @@ -1,179 +0,0 @@ -= Common contracts repo - -This repo contains all contracts for apps in the system. - -== As a consumer - -You are working offline in order to play around with the API of the producer. -What you need to do is to have the producer's stubs installed locally. To do that -you have to (from the root of the repo) - -[source,bash] ----- -cd src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0 -mvn clean install -DskipTests ----- - -Then if you do `ls ./target` you'll see `beer-api-producer-external-0.0.1-SNAPSHOT-stubs.jar`. This jar will - contain the stubs generated from your contracts. That way you -can reference the `com.example:server:+:stubs` dependency in your consumer tests. - -TIP: Don't mind that there's a version mismatch in the stubs and the folder structure. -The version number is there in the folder name for tests related to dealing with -non-Java friendly naming of packages. - -== As a producer - -Assuming that the consumers have filed a PR with the proposed contract the producers -can work offline to generate tests and stubs. To work offline, as a producer you just have -to go to the root folder of the contracts and: - -[source,bash] ----- -./mvnw clean install -DskipTests ----- - -Then if you do `ls ./target` you'll see `contracts-0.0.1-SNAPSHOT.jar`. This file contains -all DSL contracts, for all applications. - -Now the producer can include the `contracts-0.0.1-SNAPSHOT.jar` from your local maven repository. -You can achieve that by setting the proper flag in plugin properties. - -Example for Maven - -[source,xml] ----- - - org.springframework.cloud - spring-cloud-contract-maven-plugin - - - LOCAL - - com.example - beer-contracts - - - ----- - -and for Gradle: - -[source,groovy] ----- -contracts { - contractsMode = "LOCAL" - contractDependency { - stringNotation = "com.example:beer-contracts" - } -} ----- - -== Dependency Visualization - -When keeping contracts in an external repository, and by following the -stubs per consumer feature, we have the full knowledge of who is -calling who within our system. That way we can sketch a graph of dependencies -between applications. - -As a reminder, the **stubs per consumer** feature is all about creating a -consumer subfolder, in each producer's folder. E.g. if consumer `baz` uses producer `foo.bar` -then the folder structure would look like this `foo/bar/baz/contracts/...`. - -Let's assume that we have such setup (`...` signifies contract definitions): - -[source] ----- -├── com -│   └── example -│   └── beer-api-producer-external -│   ├── 1.0.0 -│   │   ├── beer-api-consumer -│   │   │   ├── messaging -│   │   │   │   ├── ... -│   │   │   └── rest -│   │   │   ├── ... -│   │   ├── mvnw -│   │   ├── pom.xml -│   └── 2.0.0 -│   ├── anotherConsumerOnly -│      │   ├── ... -│   ├── barService -│      │   ├── ... -│   ├── foo.bar.bazService -│      │   ├── ... -│   ├── foo.bar.consumerOnly -│      │   ├── ... -│   ├── foo.bar.fooService.1_2_3 -│      │   ├── ... -│   └── pom.xml -└── foo - └── bar - ├── barService - │   ├── pom.xml - │   └── yetAnotherConsumer - │      ├── ... - ├── bazService - │   ├── bazConsumer1 - │   │   └── rest - │   │   └── ... - │   └── pom.xml - ├── beer-api-consumer - │   ├── messaging - │   │   ├── ... - │   ├── pom.xml - │   └── rest - │   ├── ... - └── fooService - └── 1.2.3 -    ├── ... - └── pom.xml ----- - -We can reason that: - -* `com.example:beer-api-producer-external` in version `2.0.0` is used by 5 consumers -** `foo.bar:bazService` -** `foo.bar:barService` -** `anotherConsumerOnly` -** `foo.bar:fooService` in version `1.2.3` -** `foo.bar:consumerOnly` -* `com.example:beer-api-producer-external` in version `1.0.0` is used by 1 consumer -** `foo.bar:beer-api-consumer` -* `foo.bar:bazService` is used by 1 consumer -** `bazConsumer1` -* `foo.bar:barService` is used by 1 consumer -** `yetAnotherConsumer` - -This information gives as all data we need to sketch a graph of the dependencies. - -.Example of d3 graph -image::example/graphs/d3.png[] - -.Example of Dracula graph -image::example/graphs/dracula.png[] - -=== Storing data - -It's enough to execute the `docs.GenerateGraphFromContractsTests.java`. The test -scans the contract structure and builds a graph of relationships between -consumers and producers. - -It will create a file called `relationships.js` that you can source in -your HTML file. It will load to a var called `relationships` the JSON representing -the relationships. The JSON consists of `source`, `target` pairs where `source` is -the `producer` and `target` is the `consumer`. - -There are two example HTML files `relationships_d3.html` that uses https://d3js.org/[d3js] -and `relationships_dracula.html` that uses https://www.graphdracula.net[Graph Dracula] to -render the graph. - -=== Assumptions - -* You have to use the stubs per consumer feature to sketch a precise graph -(i.e. each consumer has its own subfolder in the producer's directory) -* If using the producer contract approach (you don't know who your consumers are) -you can create file `.producer_contracts` that will tell the test that -generates data that the subfolders do not represent consumer names -* The folder where the consumers of a given producer lay, needs to have the `pom.xml` -or `build.gradle` file (you need it anyways to, as a consumer, install stubs of the producer) diff --git a/beer_contracts_with_stubs/example/graphs/d3.png b/beer_contracts_with_stubs/example/graphs/d3.png deleted file mode 100644 index d1279a2a433e567917dd416f8be68fdf3eadacf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33940 zcmdpe^LO3f)@~c8v5m$~qsCTatFdjnN!r*>W7~FP+qP{d_mh6lIqyB=zJI~}VULWx z#$KLl;+fA(kgT*Q+$Zc$A3l756ZOW#EGg1p%~JN`Ui!_(1qUOo(66Me8^f z#wBLvrH>b>D9D#AxVkh0RagwoI4c8eF9#|{S?+tsLV<$1!(x^ny5jeiiA^%vf|@G+ zE%10oUARx?h!q`$sN{(h_tvtJ6+SueMnsC2dc_aCXUTQft9H~i?0c>*{ZlDJXLs!R zFKv65Y3Wp$unZ5%_ltqAzvt`#67x8;1r)a{@7#`1$V^ zLNJxkf93}IXP`hqb)10pXF>m6&HIQ@WtgCU*8%kBBS%E^U4o7jM)`Nk4@3J}4`4K6I)7vEpS5kB)UWNv$nb1b_Tdw=u&`Wv#zFR>2jZaH zTf`sRE3|ZntN0f1+mfsr@p)RXIDI!YO(%FXX%1~og%DvT0cOA>0>&3iY?8@ix8FVQ z#j!p=??TZ3g8ALi;$pL>M7uq0b5pOZ0)|6@N-ab@=&ZQ6 z)_~*y=4u{gnDDT`{N$%E3-W8~P9mgHG>VPhK9vkq>JO2>a*jt1%(PX~5(M^HY3_mvF`3kw#P ztwNJ}Tdk}m|LOJVY!0UECWf2j_9_yU1-F{>hgYsYYAwnh3FuC>Qcf|ojdXBF^9oGs zpV##d@+xTSFo}Uv2KuFR!fVy8Q?~(%B-hl$=dnSTjbtKL!(^%@o~O(MVc^hF2xnxQ z-6;~e_G9YmK=>h73w;5mbb;pGGf5~x-gJGjS8k}U`&Qs22#Xam(KePwoPM-i<28gdTQ`f)F*NB!#J+!A>UpT{nm0+h4M(99Tv1@?A))&M8n&PoDBVX z8e2r4vm#qSO%2vm!)KE6j+4=Glw4>(USF}0&`4&Q^!O$EcV|URZ>A+UsM^${Mqif& zO^QWk*y_L;WhjA73CMkkpxCKSO8Mbu7Y08^O-h0=NpxZ#8Hp=Qs6!;C--kUcF#DYp zy2H}BB@h;PzvEv4EvU;Z5KpIBM1$~l5#cRVT$&KA3|;cQHrRR96>`rwUEylRJa`=< zWgz&z5rZspEkCduAzN(zx6e(K3(-r@_R|zaDhWMHg8nodc@Gw$)atb&7k-7t1?#E5*=a{6{HhL6T=(FU@DgH9qAw$7oB2uN^Br!7NeOmM_D^`OY4+ zK2qwzb+cQ@0*3Ufg}A|dZEZQqueJ^>ijMIqiHq!sM2uObm~Vwk;?IN+88L8SJcYL* zF5>lZh--76F3Q0|m2!gXBOiLlCK*~hz+WQB(7^c;G-ZhPnpG8EC5m5mz~ zwg(_HZrQ)w;si;UF7O@HU6P&Pqc7(KN>=sYTirbvBBlX0Rr1}Yg7PkmELeO^^So8F zYTQ9TZP*G&A9(;210@ZOqE&iyLah7UsVAFu80zoJ!TbpG7)7+-okcq@D$t9ba!S$X z5*agJ*-xq4y%b0@PjlgBW|WJf&*zv61?x&hN{90zC}uKhmWI=ai-Zi&-~EgXOTZ#^ z+58+%KKvvdzyC_}7$4va!*xdtK5{JigWq7JOFTJPZ(C>zKEwat$ zh`x;{Gze-A{N2Z4vwa_vtuEhTgusnwdv?ysu)U^zb+rD}H3Ygn#YTLIHuQ+?v@u~N_QbU)rX z_dC7L5Xn|kGuG>`EgFk$p3Qd1o>#jgLLwqm0!!JV2yHL7>Q2Y=nLiDN2M6U(2hiU= zKaL1stWkYW@ml8VxJ--X+R7-YgRZG0=e`z&L22FLD5UvTcUHT5;fL-QchD|A5>@}+aN+r4PfA0GD7qq>*}DlYJRYwSzk%SKno zOi;|t8(j~Qw_8K|um_0_%R`-B939XpOc|XS`D4K6AIk2tWHdQAUe7d;1)ORi7ak!+ zCPeO3glzRisH~P-QM+>ClSck}eoWvZj*l_6g1$Wv`L$Hri6khVx14Ya={Y7&M@icmL67W3aP>!2zvWmY#IX&ErRtH( zACWm{rk3cDvpeHpgIC+o4)i9b!1$vM#-k%T7h<0+dVIR;iLtb)#dSh9Da7@{SQrqo zQ{f*BF+`ON6Qo_bFTy!lwzy6P&6y5J&)GSTi_R8K=B9?Rg_HbjD+`)ia1ou(1-i!9 zpKAEos|oGMe!#@}s}+-1dafGpXV?CA`k>(xxg4RzN*z)ineMc>2rrR%WTQ(PRSBD6 zY2$5XiNL8~kj>b{8L0&yZfcx_S()1=Hjvx#l|#pYGpb$-W_^`j31}>0LT3{Wh90{g zh!s*|ot`Hv2FYhi!Tom`Y-5ylb3QI1nt4AxXS0mMjiH73XUx3bK1MflBj-cHr$0TA-U5Qx=Tu)X2k^+pJ; z?L~^O{p_B(m}Y|vY3bpl>q6~Qz9QBN-AZ@5WW5IEm+WTxWR()g&|GIKU`*v62&SOi ziK7J4yLE*AN}2m|l=3_rD92C+nM?A4Rs|t=Gr|R|==#Oj{NnA7;tzScH zl;+Xy-g(QMq5vnZ6i!2oW93NU+)f~d?CVZa(r|zC!(6KE-TWoZC|ogFdj_vb+i+Z-7)8mw5&rcV--&Un}b+ z!JgNCV7uGP9~RJQ+SpK3Ln1x&xvhMf#=~%+d~l*h*Zz_RhAF;r9A1*l*bem)Z9>*pjKcRgCu_jnDZk{abPKlY2Ax3}2E0D1Q-#28=n0|?%+w#FlylJWE^vj# z83yW+-4fLJgpkE0suPV0e&Er{(a!jBjVGtS4E3ve~C8iD1O zorboWs=ZPMSLw`}B%B#j-QlAo%Q}|cG$&4O+{0qfx4drFInWkbwG1Gj+T5N-)mU$6@4v7+gfp=prTT_}P^iSn0&PJ*x*G65hEPWbOwB*92n_2i^^0NH6oV%U- zA&7#DEmfoZDu`?S=!;Q#78q?c#=!-eX+yze1&Y45TI6lnDE;ZMt#7P|8upgSQcuzc z`5z;;8g9gB92xTBAY<#mS!HnvbDh|i&JrlnXOTHkZYygg>Z)|gYd03jk=QBlUq*4W zFp4UrL*Z5m;rB&J_4kP>ky?g_GKO(T=&F3y!|k&V=in8DZE$MTo_@$Ju8Ci(Vz`D( zV$RMJWA^)0!0pMXZt#M$3*3)x&aMe5OtJaZ#8 zWM;OF9Xf$oY;C}u^$_=m2Z|U|cf=(AY+DxnPEY-tJPT?O#k{8;(KtgfY2z#MGRH+J zh6WsmC$zLSw7-^C?rI{$S2C}t?hh&u9qhKUJ4BhzpIv8!yN~U+3WGoAiG<6~FdrNI zXb7W?g)yLjG@rbM2s#3-s@O5Ps?a(qsIO$OfA|oQr*=PhsXZVuSh}=qBG%X|B`-u{ zn|}WdC#xqam&jWdoD^;mmfM5*gq(ons9<A_>ay+*(nx`dyPff#4Bg8=8AYo+VeNUBb=hG`>iM?5-E!*1 z`{hWxUt&<@?bZxk+C7ZPO<9hM6#i;?JhPET9h`kjuR>}fl9^Re>G{eqb~vzW%0_v~ zz&}|GpR_&t4r6CQ5&Ljuq>DhLRHCzCR?^0l@ipvW-`{Paa!zvhK_r$hLLXU7!%*5S?@B*~!Du zi&HWgri^Q}L?s~`2m2GK8D_e#dD5?}5gr#JVRmM;#W!mkMs;0Rw(h)|+VgX^o(NK{ zd>Z#5G4^2=D8s^qa+;80+YyP*d({GR`Cw{_rsfUG-SC%MB;O?l=@qg$x;HvH?+ZJS z86R{{H>y)gqp*W{e4Toq$uQigwNlTk5!S}LRrfgc-0$L-&^rlQUO{KfYa4i{!YG-# zqn1uy&L@ujl^D5cwVCMVFcMzvmrRy^k)fhLOR_f*lKs6(J}yE}QCL=HJf!;nAs+}n zf$I|aS|fMsQ`gB;hv+0vx2DI=-jaihUFFC1+rK=v&T-hN$IDPTUTW0`SY#K`Wfz-u!j1fvICuh=)RD;moG_hPj^sBv#gX6D(oc2 z^hru5GD|Qg3%%<%XE0$gc~OE#!4&N<1rZ#v`H0KJk3$nTOm9cLZ+h3h6UV#`_u_s2 zTBJD9m1OG8ZP~iV9r_X6y#T6OKJ4%=xF~379P^dlZ(cmF_xh_|PnJb9GajBJbGRH# z*K~CrvZIKWf855_8Y-Nhh9>eqtv0nTHwh}_2Wwg`*b04}YhVyb#KF5h{KWGKN1coi zjCEL~mzV05-_Dj15+2WF;tEI4YQ0O87nX@?WlZxyFNAf~MbNfHrCjU!cmbuIYY5b; z?ZL!fotB=&78J^f`Z^$n`a~7`2>Z9^*E3BvCwP#?QzO5?Tztl zS@>&m!4@wJx*Dg=ac@ACgZab&`2DHa4==`K8ddE-v2h9ouZ2xYOkQpm}NY)^lw6yQzQ0~_*Y9^xtzN6H=w_{&_dygzJuVz!)3B@xY1_| zEMs-1hr9$2wRx+?*UFnD7-94r@TEaiU_R%h?}z>P zdN3oybk&+<>DGFG+Ow?RLJmw?-t2yRw(&cmEc24juo!WaNGTBH;Q_(`r4s$S+pjpg19ZOtb%)Fi@vn4Paaj+Q6|jTd&pat4*{AyF91%se2-* z(4o5X)4U}-cr-mm>tdgZw8bK+1!&4f^+F8R13G?^nt9%3S5wFipZzk^Op6rZgu4|hl;RfPj4Tqom<2d zXRNjXGFWHQJFUj1FF>sg`Tf>L zt=Ux=f}e018ma@X8mZ!@T^;Lja9sIJzO3uwfPkmRC6i%zAIcdAx#404=V5&6wRLfm zTa&>G%qJWPSnRt#Q<=%6a*#PHcxa@HR~jm#eOs|RZKyh#6KaA(-S`#)_IkGTrm#B3 zt%wp#F|EuY>Ipv<>gGSdDs4qye6NKFrT&g@RUC~a*-9t7H!wygSbM8!>|yxpXBQ4x zTe$f_uDWFil8o-VLRhc8eZ8b~j(SJM*x!*}HY$icgx!!q`o(LmtvRegye1-O5YwS4 zm)hqUcptXAVf(_w?;YT+bo;ViQDTTtl@&d6f7{%uxLW6DY^iXRb*^}SH~O_?>UMp~ zXhK4idxyJxji<|6Jm1V26IZ9}YA&y?ExbW`Mre=?0YIi2t{p&m=Pb4JTd=QNuRV)b zMQ_6O#-`jmBg1VPSwOB>hxg=`vhhH21bX6!X*Fy+(Eio=J&DJ5ZHGc&n0ay~neHS* zB|-nKA5vEc8SD^>tKphoYwg}G;78(PvTAx=o1m*O89yN|kXD2X(6Z|2OH^YxzCN*- zdZJIij~;r|K+pU6bBPuy63|uJXl7^QsT#^&N+!3Z)k!WZLLU_Xe2nks9?YB^Vf*3d z_R9(7?@#03t?*s!8;Fp->IK$`$3&kGXS5vyBRnX3PmfnpN_mLqgBpI(p;J(nHpPf;A&qj=qyl$Ftw~lf zKm=>z1g>(WH9-BsdJW+z(2b{P#8cy8m++yc@S8861Xy(G0L_DiShI~=+HA~NzDJo* zCNglB#_w0saJSU_Vaw+;!ujIQxz5B$n^szo%MDIf-n*kW&lS1?&awu-ojZDK*7W!H z`QD}3{;Y0mDSh@O2&>pw_C>)lgk4mNBl-^Ci#`+@dTxpMe6{WlvsOpZeL+^VAP!}S zh)|@tK*-l>-Fh%nh5%V$M8YRFbd4)7OJE~ zbzpw3uP%u;OBAea&ojmGQSC&DybS}a3Ge+X$|NF|Gu4BwbZ-)h)oJc$xvd#C5>Uch z$%+ezqtUGab1Rc+Pw)=ZLsdrAbj_LX2J3D zT+QkOePfP1d8%W5vYLd8aoM?50VCzl=mOj3Y}&cAZ|A(%3^Cl^*+#&B_@J+?A8>?< z1@3eD{$`x_d$!j7JjyTit$6_;#{CJc{_6I{GM$GTek6pd3CqVYIe|gf_DCJc`+kNX zk<-bF_3C>AF;tDzdk+5d4cK-uJ~e{kS0cTJ@gG+R()?nGY z*}I_OanZAE(*+lb#Uvt&0u~|G(@;7BMdqx(T3@c1YP7B%De9PMe2 zwZC4KyVV2m(8y*p2GiHNlcmBY9LNosdm#0N)8@IBwYTPR1&6?MPx$t9>b=aeLFbP^ zuu8F(pY9brVzjm1;fIQb#)7Ol)}*I#h(rR<+0>lCjf3|MbZeZT>!;}AX{Q>BpXoS* zqWn%rUAKQTvR+vPv2EmQNJ_$v5U&bk16d4%rQdftJcpRhy;kfp}n9>*rWf z=Y)8}J4(MQ`JCHFv?RJWTBvN+(Ffzwu&q0~;z_rsnAWwRWIVOChYzGR7%k?%oVHv^ zL%?zPf3zuLr#VIf!v+#D)c%6pK2phFDXW+MMLDPu>pgI&(&+$sz3&t5?nB68)ADmg zGgxqnWPnc|jm8+lsPXOG3*@`sv^Q`fXItv zgTk$z!eSo*0f2jDR7CQS$7qYtfyT^qT3W&~9GI*2w-@VZ0E>f(YCsUQFOVR-*5k>u56Dc|SKnYZGwT_u^EvJ`)jTtpw-E zq?ZkgYq@NIw;b68h5O<8&@4w3e%n_OS*JwVv6l*6PL!%}!AwG$*vED6$A)k<*S%4UWoz~sxksXG>0mK6b*Cz<{WrY zb}N3F^93DG7z7st`8w?#;+LlmS$(|~#F0MUYRJ8fMjpTL9r6%aSKHphMdSSY*{OK3-P<>a)qVF3hQ4X^HR%8*V8;oHq{ zqC0mNi)Jc6>M8MVD0NEa3^EvjCatyj4e zsnB|QdMajo#SwhWP{fdo?21w`4JHa~qY&l3oyO~8LI@HjBL8N$q7=IM8J@x2Soaw^ zL=LovUw#{{2b;AwP?E++Ue5_|7Ft|*>?1iw{Fr2Y-E=`_sY|y*O*D#5p$6FgkqF-uOSAlCcevb}6i?YkLc(5SuO2|R7@y7>ip}wM2CXZn# za@y70B4s7|{Vf5foalxo_wb!qR>#twQbn?o8tu{f!rJ~2b}7C9aI04H%zgNN zkf(b@|NIH|o|<0{i3w~S6M4Rt7q{D@NKY8;?~4tC9<2KnzrM6u7D@1Pn}efn2C;TZ zQiMxN2XjdRH_pXpME=KURA#m{u?Yn zdeTr($le<6fXZQq<*mrea9x10t~j7D8IKAr>hasharv?6Gnt*EKK5hh^)z$E?I+oS z@i0&@t(CM&OM3o!jSN2ijK+30vuWqok)d#FQ>vd5E6unLBwepjD(_dXGu?@TGq{o7 zQF-caED9ws6|FoaqmU{WOUI2PbH49sLdVN&9;3`Paqx4F9g$Vsedn7QgZ728tGaQBRa(b{Cm%!rh_|psMz}{Yov}FnD|%K^ zDRITOhy}&)8MXR7oZk%jWgtg&9|jVN%)#fxpGE&4u-5PgHSzU&Chj~HNqG~+b;V@Z zBtVvljYE0RJ?(^{x0qvcH5Xhx)2udvqj*UaTPU-;rgK%(8cXAYu!wvb8wvj-`H98S zQU%D0K-Oaum6%)?qLvi?;S!M1(PyYDLdv;T&xiUi4jA8?;qP5_IGCEj&z=93jk`X= zw*G|+A?I#VF;FMEY+HFz1L`3<~aAy1bUgfZ`CNo$(%R=Qt_E_*K6%MCU zE<=WPUFYa@HLk++x2mI)FR~j$-SzXsHs0ty7go$}tnNiuI!a^{W0=tKM`B;%6tY6C zU3>b0+#%SD^ux!cyujkqF3HdVtsVR6UP-+K5@d}G9)Y(dJmeK3KOm-<2Oyg+PiYwCg!R*tVp^NT(a>AO*y3MWp4ZA>8( z)l-+9YfrmG>oz1srUV49nw7?@W81)D0znlsrq0v;5TM&W>t*mEBGoazE&x_reaA?_Vd< zvc&E2q{V@tJQtVHrw6j&`Kf;)A?U=7T1{~JFIkGfM^nz^ku>VEB@WV>1(8!VqOMn1 z{slDm`HN|<2{nIvDdN-;gdw=-g0ve)@cQKaVkv15{KMKR;lBSGzp@GP3ZwGx3QD2+*o1q?5E;L~tn9wQ>|0aPpU0>UqNjYg;a?;d_fk%ifjL zW`C{Tz7teXK2e(f)uvrzg5>JzI-JB5z%<5HtvR&Qr2r6Xc`gSY#%~44*nN0JK zc1S;kkVH97fZ2HNTmC4IU7;qV-HnA7w7b%;!> z25A-aaxf^*ijf|Ol4fg7>QEb`hiocY?PCoD+PWFWuR1IdTPetAGeKYSxA3*De-BzS z?yHp{vXkYKOCE;1^ySLq8p3}2zY>*Wkw^7@zLejZHQC}5BCk~G$}VQdKS{sDi}_)l z)(J$fvdD4F{HV!|%(>g5NX;o<`+hmU++DNh-JG5AWC-A8FOS!WT#o=*OiWB{qqw|{ zh=Cyr$GQc{vDED4dP-&xTK*wI_iVK_E`(lBuW8NVIPpVpCoOX1+DW_&-rMV4`yL>> zRteEGqsFO@=ph*NR)h_?1#yC=YG6A_Ggdf7Ug%UHt_Fa`Doe!lTiW?-R)K#O9d6B% zqf>~1VrZm((5rwZC>hpbr*8<5He>$b4my7rL6y2H^;gTlQuU!v^h4+UC4$$q`N6;T za=2zdzG5;ECOhw;E}$x>g#t0RruJ@$@7 ziVQ`D`zF?|z6yYeM4|haQ1?>o;l1y>2o`BBf$THI(AcHfQ0v`lF_e|O5ZQu{JZ!^} z_EI$UfLf(r$&%jp<+8v7%5;Z_9%QI2&9udiQhy>3Yw?^G^Q;^vQ)MlV@Edg~ASa7$ zQdYn6r8V|)*=3s6l11ZFc#>GC$70!b`Os0}l9q`R?8;haohVY-fD`N;B@UIixY~Bk zzE;q*N+?QtP=P2U<1F92!E4oF{5)mHwv| z&&TV`oSYmb%uB({@1>SChJ289)Z48=`io|fv}R2`na?G0rT$dB@?&I9brU^O_1w$l zJhkX zEp!7LQyyba(x%D3Y&8RZaM`Ewdh@)!oOz>V?64X>ek>zVak<^5Do*zv!BAxiV=FOu&yAwFgAXq3u+u5``C z@PRRM0X(zWMW;QTf%EODbd3Nr>0dhK9r1gr=H@`oU9l?nCjfW<01bd=F51#t={Zhm zyDB(B1OH2@L{M?N#pop>O5`7|T*&gUm|r>dU1j8BN-_1-n|Es<%&C@Nlrg zoQrPK-_bOG0B1}$E|#jhc_!gCrp@yz5h4W_jy=3fnatS*JK_KLS1a-FFy&IM=&tIU z+RH=z*%~c+6UU>OMhrqgF=y3pVJrTB3T6P9OoIWwfJ=6urxD|7ONO`Z+ty;+T-C)z zm~ZU=EZ^51_Pj|#ZV4UduHDf)##p_~)-CE|@2 z*3DM7`Y8tI@#|yNL`hmh6K4ap$KNuV^&9}Wbe|kg$A&9^F{5>+Ym0f2Kl-@a2aD~; z-Q#73NmKIocNrn?7a+`e>XO9m-Q|&2lIW{QT>E{;va-H%(+91uSWGVB?}6xw0n(%D z^rV~rc0Nkr@{padlw;Eu=UnmZJk*sEYoq;l2l{~c+|A!RK1^Q3yC_>~&g2m|YdMk+ zoodeRc%s4oJqsH~0EFgFx|Z>&D^Ig$Nq6V9o{C=6dQp#0Oh^Hl{e<%OT=$!Rb9Gv2 z?X=<^dK=w@7<{O@I*eDJJa8UZN4Y!3T~7#cPo1^r?9vnL!f zwhL2t^3%PEHiMvi!Iqe>Gmr2$>7DCvsqdz5WmU=F-_D;xLEwmRJmr*?dws!SBEjo* z4=1uA2L=Wt)3}lVJCVlG>iRPt_xXZwZYKyCe!-Vj%%T}0%(}H1&Z7-I`(@DJrK)nXw z$shCcs-$B8C0AQJ#Jd=@Swi%3#XlR{bkYf9^f#uYUyZ0zTbZorF`Lc)hdpk4t(WMk zje6~>gG(rj9`8O)XofDU-O*&o^9N3*hSTubZ0K6U0(ZZVg3k~&efJuhYvh?H*;bX5 zg_C}L2y!p_<8_h3i+epskeX`+=mBi+MbRQ^xN|PWn%MY7YSuxo&%3i}I+&yui z>ch~PH{r44WVHS{wwuL}RtTjoG!jwZhQDo1k8VGbeP`R)1k1bE+>9;|dpUJd=scn{M$0sd)O&24;E#kc?^cM6c*5 zwt{qfvNxt4kD_Q@lt6_O^gm@th%~b?h)5xiag3jO1svWysEQ;ew#YtrN{;&2rLg{H zh)-DeloS@=ZEQhWQpKBXc8;vI=ey!aAlqD#4J|bTGtD+@w5ZR(hVs!7uf{6#PA9M= zaP6g%lP3YYi&q$)gKZsw9W zoy#uEiOHi9Xw-a%b~dvkczm(dOc((`tb;|-?`-6Q>ELDF&z^$JJs9C-Zwb(idHKLY zXgq%ROWh95e=x%x(j8g$gOLxEa#|_sT*u3&osY6)LCK(rl{$~f_{JwCRc+D46mIqz%c$<1l36KDjF@UU8_aevPkF z9oLwtS|8+*Si;Lezzs5#{K#ox+Rd!#Ty~+C{DwU{R~>aqm+fF?f=&lysR4DF`fg89 z7Qw;6f#eD0Q#GF0S<4l?`CM7gfx|3}m2?JJy_jGI8{c3?PupBo);Rt(BzSAYJ2}@ik=JcN1(#I(H*@fM zVyEGSOWKIpXU$6eF(~q$Lj(Ng3uC7_A!PerEj!|@AcsaJI7q{5sTkvVhE0Du7XWXm1hCCr)t6yTziEeX{UZ`EfGwBWZ@rmS-`?G& zdK=|DYjIj=yInLtUaSoPDnwZkm*uBJPy$PbiP*Zpnk@?+)e4}tqY4>fYUhFq5#|Zx zqquWG_PQ~b=@8`nZd?*bkT_Z4)0yB(tAtWzdVFw)TkR>J;}I3MNSTO!W4elA!H5CO zxKwOpN+9pl)&`+Botfk$z21LJaS|itkQIgJQ!);a6+?2a!g5aFf=z|TQzc>|==E0QJ4{+Ra-{JaHqMGmiD91} zPD&|x)F!v-?8!Zr)UtX?^iqd58mI#cYw8Udg7fb{E<^$iw1))5u(z2mVZWgtJt1%D z!~|eFyt_sE?*;{$@4+`DCx>Kbtw1h&v0GhJbEL*}3X|In07%PPa#B#E#GEovK~EoF zWE-PX&^Y^>Xd(UA5vAh;-{ggH6!M81h|isHavbD@NL@qsBvX$jANQ zzQ_r!*I&^3c_tMU>ns&Z;Y+P6XL`;FY5;qS`wQ0#@a4EM}F-cp`g0wC-lIAS=Z^5=V?i+4pdFxR)j98gta>l1F-fvzX80R3{7$QN^8= zpSaVSc1<?qiwInkHzBTr#Ptp`uO+Z zI2gXWLS+`P~Cg2hg44o?#A6q)=Qf=)IdJV;EU;rcfh0I17%1ZG;= z&jd2YMD1kPr_E=VXWjunm9*elk|ZS)zxWtF#a{s7K}Z&He}s(t;~L&=W* zdXw(W;I^@^>=_wGhpCdm#TEF@s{%G)bN%kxMy??6K4%EQaNI516+NQ^WV|%}ca*HKI^#7vyyP!Q0p;Ee_OQsM|HKwj@BTDA z9%r5j?A!8%48Y}dGH>p4i6CkLq7~0(S59ide-W>XM`&@|Bd0S9Qw_sSME^c6D?ksQ z+8)j(V=PNPj9$VAl`R|i^6)3!gkv%9vZ>iz&j74l^Y-scX5i&(H*N_WP)^q*LSlad zDQVpIU?l2<7RGv`E0ut#FX_aD@rISMGueX8qg7vY2*2FJ^=)`d>?x-IiU< zK0E^zAT+NI7f2yx7UGI$6owHhX*Xspsm{dm-6%+<_$h8jY4wTcL(t?urVG_``?fX~ zjMJ4s6s`}ZM3EM!q&cNrr7Z4FSAd*%bZY8I7=TM3a(t#i0ko1rFd*e9(|Gp0i9^>) z08kJYPFCn%bo7gLcR4Y;a5Hca*3*yz$Jx@NQgXnPlmuRyE9)`b*ysW5{?>Ep!edW2 z!8_sdjQ91eqTY<&YoMHF;|*Z>J>x#Bnbz%@a?6Pp95}ksZ>v;q2PD4k-R=>c2y2uy zCw|<6ljW(8Z+qCqIc^!I4Wz#!mEiX6 z)(sG(!-s|$6M>xk!*-o|SK>&rn>yZdTH7M47ICDSFt=42-lC+KnCy>47-G3)DfiLnXE+J+3rC8JWMZ2R=T)-v95Qq z+?lAGQEq%we!+NHS(j@5N=e?n^5%He?)SD;GBqafD_D>vApCbenLu`6<@2Xln$fCz zt*JX~FYfg@*aOy_v@@W>kb<7x_;9*#aJVj)q@C!i@hGm>^M&ZPp|R_2$eNFMf>_}a z|8qvRoMezd9KdZo zyUKPG0r{4hQpAIFpmW2&^Ya>@?RG3$nqQpW+3g+}Q(@RnkEqHBHNzd1pllwd7c&T9 z7JS$0xxd)LVz06s1@g(c$gB^A`LCTT&Nvj|b2?h!YIS(qp&^|N^r=x113nb;6ido{ z%eiJbEAW#~VL}fFe=GaU2{Gjh!UtVo={V^G(MMU>F&}@pyV6w#*&#xJs)f*OFPr~3 z`6{pNn4Ov&=4JmQv3{x$SDWvW@SmzZ7)*HzbvZr_?e7(k$7%=vr?t0=s%s0jMK^&2 zhhTx=?h-UO!QI{6Vc~AU-60S(xI=J<;O_43?hbdZ?0wq1r@i<2@|89lYtA7xYV@k= zRrSA8@04U=pN<_-6D~iO*6-;bZjpPWgdcMZ6vqBG-pR>~4RlwgZ%lpXYPz$TuJ&yd zEA+TqO3UzazES{b7^0kP0W01?u#Ps7qyNNYYw~eG2QzpNg@V!WCNhV8#`Tbd2hm|K zz8TiDx~g)3)&&D)u1`2_Aaq9>ad)mZVKh{=X*xDhXve0El*X9A!bV0HOe`~TQ_U;i{4r#6Acu!HaJ|xT z7GwHm19Fd#cJ}UGFijh|o4muLa__u)-aOK^?YM&1IjKvEkMH^p0hy4uBX`f2 za2|A6TLdIZR8z!2;9Q1AIaHH;i5HM&;q1e&3gT}gPqAOZm*}0LOP_@U>C$-Yl5V>3 zgl?1!Ls`2krC6o4DIl=!V2#Q4q1tAzQT4&fC>ubeitZP=@(`FyVY{pT?^HRD3JK;B>X-b%5Dc4}%q<4b+F$)ijb6|J++!6#+QYUi zp-qL;W_C}s`j+SARmNQ;bwA)@|AB90a4ZbU&L+M+S?U8~pL!+l6M>{RX11Kav8{xk zKWOFt3vTtV1$QD;<$at%p1G)Z$?XoDsTiFR?CREVj34V5(aK>B4 zjAf(_j`%;mamXm5GDazE*4Q`nKn-uRqAbS{WVGLlJ+r@Gx>2bLD%AI2EcWGn2Z3gy zZktXuZ=~-{|1GHL;|Q8OqN{TuJea0B1@;HBOlJk%zWz=MetrFDyfhefi0&Y{JLnPX zq$-;6*=|?fgY+yl>V7E1r25>cT{oD!gg2$;>1kzn?Mo(~%{?SXZ7#SBajXD>RshEzk!|@|kfpz{|?tc}Km9CIr`-<5QeSm5=T`Nt){t3>Hb@f3YQ{yE55ZzP7VE}F#owm&(y+xSWyvq zxit|tSqmR>#IbGXEi|cy(R1&0l2B=6y8MBMOqlwEI0YT;{injf+ezrgt8LE#VCi4n zjrbJwne%9HM>q*#WPBg?_ht;4hc{^4^rJa^dvm-g7}PIZUe@|+r)iE14jS~o)w{5* zORJa?yeU(X!=+GKSqF{~OHE}ZOUe1kP#xxCOq<+K3|HiF)~@TALDWJBYd-(lPf(#? zfoqtCt@GA{_e1plfSy!n=Fc$yYr0OxgsEreB9HmZDI+&8Z%vNMdaRM2-qK;z>-35X z`PpF<_+K0pP%<`5RHdhNAZQTSfWu&^_m8zKn>(xmUNV8>+hovlB>x=<*(l~m{PJxSPp#b_%O`;op&s2`qq?n!d&guHomEazy4NM)dFmmvS?NkIC3Y z9^al7R~p_eq1I75KfK+j@@|9HB6Z%HzF`8RezPZ=RbE2E$Wpzn?c}^M5yL&`JNk0Q z#_IghO2z6(YsE@Q#-EcY>)j7s^->MO+BZ?5I8%8j^lpZ*SGwtI$KR7Yf>MFn4&zi@ z0%pPi58Dfyj__k?`dQiuZDU;bhkropHIH&L6n+Xvu_jmpww6$vZjos{dtM9 zRUzC-+Fw&d!V@&P>8W-tAorchJhzNSSY1VYfP=pDXe6P~uVg)B0`)qeU*bBp?5pro z)FS)BS{UC2yFyBZZS_FGF?L`C5jieQvyN2>H@bEz7Kixqz9x2J7OI(PV98>Wyx{76 z?0jo1<4%i~@agpKOR?^!mY#j-*_SK*;k?TcTm*mfI(wD(U$rIsR~&l~%Yk}BtC}LN z>f7fDv~ho8#lFFvqI{t-5H{Df5pCHz2E{fV4wooxoE*d5l$^B@zqYw{ZoHf&ueH8t z_ePs}W8QqT+60xtAXBNFZXU|WqT99K{=q1@_pyU(q!BI!WqO=)Sh1xxxm%aP=zCvJ zh;p3NOsQ2G2&eA$IG2m$2u?Z9>q0B^eCr2ygodF@LdW(&0yG$Hui*WT3~b z=c5*u|9ID!I%_$T$u>;cL5REFd|omUO#e;U8gcf7K-SXw2*Z#6{fD}-eB-Hp{p!V* zeUBshd$JOVcfs+1RCI|q`?v8HK70?v!L0IrdIVvvhWj{Gx>vbbOim+-rqwY;s;+q_ zZoRtUik|VLIQY2Hi|528v)d5^bnmFqL_pT91<)9xa19UHvA7;P&0&GyWF zzkkY=;tnLiRT~d|qHo$Kb{ZyLOrRtdt!l`5+6-qXZbv(_MME<_52TmTzf-Qb(+`!- zb_|P`Yiy_@4JWnTMvd|FfEpdCYqH*M&loHADOEVjbtd~PAlijOqkNHZ*R-ZJXQ7Ou zeQ@hmfAy+)R+5>?@=R)AX!uZkN+XcNFqYM36H6 zbd)zCw}~z&pt7^SQ?NyjTGBUHzSG8&ZM{Q}ZoR@9612U17=r#>b(=NCY#z zpJ&d)436#rgK51QNGbyeunb+n$bD994!xgE|LE|QTgPx`?Wr~tj|oO%5yM}c(ut0< zH@oQ3l|9tEPvAuEBh8nq9zNgufAp~@E^C9G$LZF^`?fZ_x5?vFoB5ABYA}HmdR3sQwTe;I9-a$`e+NG+9suN?2WI>eBBCf%4!(cYJvz$A=;#G=tM#B$=y*1wR zhna8B6q5Mrof!mozhBZ$zF zs)!$6XhdNG+Yl-KI zsG=b90+m{P_+k(!rv}x!|FG%P+lfGyR0a9Y7`MrkxF-LzVSmo5B#3g=l^d3kXB~n4jT#ca zoh;_~PfY^f;6SQoco0s)l--zo-tr?NH3!wwxIE|kAe1%3cD^66HqqOYk_^gkHLAS# z>yWRHbL|Q|`6++I%{{$+Ah-z3u_bJ&_R`V2G~d$+;ymi^v!m-7uHEp5oz)p=D@9%8 zze|fY&R#O3aEgb$>oPwq(sO9ath%#@DYquM-VnrhoN=Qq8tQBu53o$ZfHqe;c8-fk zjab;}KJeV8W1uLQ7d&MZxlyv}y7}=#AC`3*q$RKc#7#vQG>GgKBN8gE;;IMHU>hk% zZ|h)83sFSvDhpEkHRni6w;(n?TT2U~e(>7P)2ytxGDwT_H&mt<>6s}Wd#w$06E>S|@T!~XG1Y>F~E$dM()qj_w1 z1210q@t`a)ZrTxR^5Tz6`DSj_j8UG}O-?|mc+6Mt51~C|77c@w3!gkqwf$GH2S!Ta zG}9^|^C33hGFF&8$@nGC>h;wLN4*O+JjeJS*+*U#mprtLxN&p!tXK_h%CSLUab2g+dp66wUdne%oKF8V!bOr zx9gbIOJKQ#kTY|}A5 zI@(-W$dbx-Gwq3yRIMs69Nv~};$!(JO0<{<5W6P zKV>awNFA(-&x=?oEOD)s5LpKhNInadwtb}Xon72f#4ZtCkP{vyMGV|RJ0Gpc{_FlnS7?oO#fcXN!&1MCML=%CvqJw?(Q@s7w0SB6HJ7MXeV8# zk`qcm?c5+f>n4WBhO%_}rMK*JgcP&fh5h$|sb40#^leXu$)!pk2btxurckDY1~uVz zi|l^Y9>BO-S?o)n8D& z4N>m(bL}iq%qGIZc*l$A&dQ`jI&B~r!e3yZ`u^(!s{@TbEKj5_2KH$Hn^4px-B*3( zG|OI9?N(f5+M^-Y&2-CHy+oObOHGLw>16j$8OB zWKiIrJP`|{5$QKg*?_cZ{Rk-_{sE>fW|3b^6lJ+n<|2wPsEA{JQ(_|ePQHo=FWvRM zogKBiUBNs|6gu7KqhCg%$u;uQ#0D!^e^_!M^EbWiC1^Hi_OQ-9yzX5d&f5}YZ*PzL zF~i93;!JfE4UpANt< z%@Kp|jfxNN&!i?XxXJSI=3+&sYDn*#Zl*bzug(#sSGQYZ`v_N9qHky8{N3XpiVw2e zzQV|k7Qcs*81_QL(6h5!wpZgiDO#*$2qtK*9R8yvB(Fj^kpI1iAwIOH#&r-Xw=Zgh zzol}swBcR8mz6oN{wSdyp7(d;aca6@v+LXG-#(kHyw0}|Xlj~c4tADH6JH&D84%=$ z(JZGY*!x*-vhn%OKYF`&<_syG*V6|}?9R~9{GzA!RJbGse8(R2PcQ{hl-S)WAYA{qQe2G(Vp4XF$S<@ILi{i%Q?$!&S2on@&gc~T!#1>k!qOTC-az7`fvTq2LyM9{<%QL@m@5x)ecPr}a{uyqa1+kduQ3>w|Ue%#@&KaP`j}G*mNY)<2S?XlE=vx5nft7MS@c@u5QR zSrqEJq@T&*^CML{OQv8!+J4@ibjrG#1NgJv`+`Ibi25IKRPucd#&J>t&{_t>_0*fN zn^h6}ecY`96^4eQ*(c5qtzX%R-P+!IQO>mNMrC&RQdU>8k}TTULtIdXB}1=#w)639 z>1@t-ymg2!8KeTq8Rx8soi~KR=A&oa`Sav{d5~*aq#jMVBf}CtGej80=o!jqsP`Lee z(l6A4l7ByT=4O8K>XFkB?iirIN%Y(2$^(f*OKHNDyN;%rHcdoF8!a%&)Ng2S{o2p@ zXSlj(0GGH38AG5MjWJp*lGk5egt*jXYR@qmXXtlm?0BkC5o0xC3V9Y=BzB7=Fo)>r z-x#V2jw8M_JN_@JG)p(+0E+jRvU=%m8%_Nh?Q}HDXgNzO!*esO;(?Y0ah0@<#!ML$ z=7ceFh-*RFp~6)fysneC@+HKg*&o)6G7eFzg6vv{lNe;6Nd(V@AnB^NHsM>dC?gLu z>t9YJWC-oBNZXzBZZK-}fp)lf0G*SOw-)pzgjj%@?M5;{LrLSpslsm(sEX6&stHTB zK-3J`*RFbR_l|>3BWSd@9{EnA@9CM9U^<)J9;ZD(MGu^CMVCIFpuu*N{M5IdIwQFR&FwZ z82(Wl)!lL-Q^w})sgA^pR{Nrn#wq&RPV$Y^x9uB%gmsg9Kv@3$N=EAD`X_v|_6j@V z7Pvd}{FQ0XL-8Dkg*o>CcX_&{m=E_2a;8A}ieSa(V`cbR<34`X=-A;0TX) zk8BWB4PG9=eZUzTuS!bmYTaiUdE@iCGWL_xm3l)@4RMFvpc|$)3P-Yut5qGeL?nv5 zQ9j^e*O$x1Ig?aM3M=+5?wb!8pvT%rJsp=>*JcY1o=!2(*hq*_=T(Q(gc1RtCAo#lZQ1+u zgl^wc;SSdDM@>XE?IL&bBVqkdo1;FVopCY<@aX+$GJPRoo^u`v4hL_;*D>klLoh7Y zSO0-r6r|C&VKX`(LhoMmW3BdVYEGM>^?;`#a=o zOz;l}q{6pve5fB3n{%v>jO;Zdy<_j-ouOUoA1nLiNC7gf(~jaxz;E3Azmq%xuPt&$ zOz@g#a%t@ebiqf>0pY1|pk`NMI(eLGY_OLX3!5!XS-?nM62s18b@^G1w7UG?8MXn! z3ertq*l+j*((32IIX$pVz)Z7;NChoS>$m1(+BrT+E;Y;k{=7xN=9Wq9(U5_*mBGIWn{u9@SnT|Qk;KHlw$PD{m(4`D-Y z2k}XZwTy%&|74CnB`C^p@5DUDMgA42{W7rfpZ#gsbM{DZH1qw_X1TR#SO{sY^(`9$ z-`S&zz2ehRT?I)`?4*8D`_s&sn$OfD($TASZm9;IKhZtInyJ4UMMeNwW1OJKw3_R7O1W~s~TdlIntG&rV zvuiWz_?kJt`tmSwh0VRs1Bq$Y$kFV~=w;yk?9xR|Rt1nnK%^?bKOHiyxh#=Twi4dW z9Q`r1CA*iiK;Ts8UT~D|xF#Or=yQ^|#nKn+B96~YKDu9{{Xg5x8s?e)KU@H?R$<5x zj_pzbPU6E!QaXO1OimZ`kl-e4XgX+WA?yy+lGOZlc}3qTU8OI>V#wL_!lAD9|dSOPoL^hd$eC0Jcbu_ zG9Oc?(1{>5tb+Iz^s& zf;e5#1fw92qlF+&D_R;r=K-QR1OtdF8QSgm5i(67sYc5brCy8(|zyzDp(@RlL}E2efGCGZVrwNFjk2bKO&#uEv`V5O&RF{ho_ zQ&%;wb6S{|zdTSy&v%UB4T-|}WMxRrq-CWYXUe4+^Z5tndSIem39*Eom9V;}S zmM;GcxXW(OfyN){Qzu}y*e^Ui)>-^}I@Uu-06$VlYTOG_XumYEpQ38m$KQJuUKx_{ z^d}P4nYp0lPWHCNC*|h4z;=#!hv^96s()vi1RP2p0n@v~cI^=d0^T|Ev+iQH*9KRe zrVX-DDfa5A6Ys$=VwfP9pb7cUSvVb-9J-E5(*JF21v&6lnAA3cLmxRo)*m(uXEmmq zGDi#T?5TSd9{6_e_r<7)hjU===H*d%+iwfzu=or-MU{8{o3I9W!oP}^u3qq!t=2Bv zXUr>DAc5Mzm1-?Ue%Eeyi1SWnHBwy_N*bcMhoGs28`f3=b5Haw%^3{>~>qz!p zvZyc0!ge`bSfH}$PRv}(yzsaot@^l1(i*aTO)T!^Asmpg{G&D!tVqNNqON8C>Q8@S zV9vjOJL!_#(brSg>3Yq*n(It#G5SYsK%KyH>$~|$BJ%jaHCChRJZ_WG>)N?B&qRmv z1c~PJbdKyTFRNEqW&C@r!T|BaPb*jD^HN?Bd3}9rJ4?WXr`P%eR((nTz`jsTs5t9Ue)i6-;Ub|9*|t$YQqpC0y9|r`4Cl31*Vv z?`x4lfl&!|&b3?s=~Nv6Ans~^y_>v1or>#a>#lWyHPiq@id6gv zz+YesxTi}>7D~#S!n(V=O@6qXt&TX1@$`+Rb1fJz_PBJlS=O4`!BD#?RbjiCcQQ~o zE^w`xFkEa!?0;}>EL!|iUzvPKSNkiJ;vt14qKg&Uv@lWS_Qv^=`f{;`0?D5)v+enp z{ViO(Wc@t^Ua#bo7-Mh!QN2$IX6wZ|hZ7FExfn2@M?~O8TVa_|)v|k^B^LrThWIsO zp;@b;t2+jX%=2gO?J;f8fri8hmFaP&8{=UBU<=|UH;AaVXiMqf0?BPI_$_yc$9zAft-0w6K!(8NbaadZt235krXoH{OaarU^ z<-6|2IxjQ+r_!B;@80eWZI~p*NB&^mIcAgQM$N@U{!$N)GcT&sT;=&rW&LO7vWP=q zCl+&W479_YSLXh_vbrF60<7Q(e0c$?2bi8NH!iy$l||rj)oF((CMI&<&Kr6<^{RS$ z$Z%#F)9MXvBGAH1__Cy(aflHVWO18*07XW%yqDB-hhXjb*^L~qC>@wfKK3U(_8C#8 z3c=ezB)8a$(+ff^Cc?4?wvQNEiXl6HKELjY*Rn4m16l+JqXb?I|NRb!b4wH9t@Ob3 zXa(tNni!>34!?iGN!~VSI+lyM(YPJ+^LcxW=<3r)HKPJ_9E|30G5m75HrEeD4tRRQ zo9UOH!-8J(d+wEdX``zI?@DzW5~fa^gGzO~vwbM1=?8Oe^WWJQP|ijt05*5=j-LTAhOfoBA&~NFDN(4 zST^BTi6=stwCEp0{}IXYRHuMW6$xpLQpG`-W%KTbB`Ci@2z%6(?(U_c`IBDm@kkDD zrrQ;LN7=qF>P3VJrui(wlCKGHT3@j#8<~8Y9w3;gglvL}<&Xd(zRH2kAeydHkjrv@}j z2dsQh7y(Ie|HKszNzCWdvrn=eW-cP-i4};XiIjFg``xDdEs+NCY#C~>U|No4Ks16k zH4G0F=Y+2iEZtqlC6%j-h(Uny@y*?$#2d4qdp(nY(7K>DFnZ>&aW3X?^l=!d1Ws zyF-6c;m+uLnq8C3NX~!efhzc-gezk^T(uvfo1U2|Dp?*)Xa}4dhjmwji8K)J+vkFP zl910dAB=3q$dxjJn0x%PYNS>!uleE!` zX4ZUe&zsTr8oIh4yg}CN${lq4cYcAfTqgl%0m<`P)OU$``-je+rsUeQ00i{)mIdI~ zSMGN{uUDBfU2+^8>EWidDxG|94`XhZ0~AHtmVi4X=~?-w6qe3VM9(^XJsX^#yr7U$ zf@fOFu}Sv6c1qY)4Y5@-(=9wmNi3yqXyu2{#&2RP!y3v%*R5oh6{&}sko`iZK=$@T zaaVN-5|o~1s50?j7j-HhE8^bB7f>euL!(Sp1a`s+Qq70yGVQ#@@S{Lfdz-N?t`%{! zL}ZnJ(zS`ryn zmL7nfKL`pI{P(;Of(?MpH8$fDq*3{md~P}FlMgePq=j# z$5Rk{ZF{#Y4VCmO73)RlQd`+bS|Xs8_gFCQ97A=3rD<`$J}>#1Lots2I6SazQ%HJ5TXe>Cb)WhJ zj^$%PFw`mIhm}i5q><`O>2X93%E7+9SYqQ0(=@u32FVh%hkYe4-`-_rDPA894UL#{ z$_yNUC!Q#Xa7o-4mCQ14-@Mz@OI$Tt;fwFpqFx*B_@ZXjT)&wkYPE3oW}whKA=B9d zr~Gs|)1~+?AU#(E13PIY2L}iBR`=Q_`}8kaH&4}?^`M>&TiXTWBs+j1eR8HQFL%gl z_5t!{Lbv`3xg8ZD8)5nv&ax3J`Jxlyr))fbC$q&8Rph}{LNiA*B(>w(MH`&w={BU_ zS;xxbLSC;IeO?J4UWaVjk~{hhpnXy?J6pIeuVy`N?Pe>b)0Sy^mnJh!wC8A`{NZ5e zo65@+yvEdi&n{d5D~4+H*RESH09!RUjjPT})-5l$OKCuFr$Yi1D8U4VwtGKtj~tZH z!{h2PmHJF*1g!B$o;w*um-6O#Xe~O2bseACo6-i09(}9?fr~_qQp?G6PgOs8&y85& zzaTR+1VCY+4>U4_d_W$r1%ffktUUTfHRYVP3*N%Q!pgGY8S9A z+fH-^Zia8@N}zAbt?El~AKF4V05h-c0F3S92Mc7pzm=6c0{OcR%2qxX;ksY!Hicx^ zHv%$$)vsD#KDO(E1N;_jAy=qlTO&)W$19NWtCC<_$o3!LTD*+imw!i0aNgY+I^xN0 zd9QBuay5&8BkBCFf#(8tN300twbG+C*e(Pr9T%EeePz?9B^ZAEHRNmr`4?G68G+&c z_QC;08_(Osm6VT36Xznt4dlJkbH#%#=xN~a2^O0}3i#W7L9nr&HE>)e_y8nlHJZG# z${{lH2_dC~-mPM4JI1x5yb&T63(;5Vw>E?cHCKkBL(#8Z+5#^I6W zB39&`bHX#vx-!Zz{CQByr|zsxg%g*~@Ku%8I*TA@3vt&yQ?$M>C|K84lo_O@7!4MJ z`$L#_xAdEq^8KW3+a94;TDf|sN1x04hSz&^svdRM0`tn*JiY55Tdce53o+q#l=nLQ zBvd2x*?jTUgZ!tpBJ=7Jy<5DF(esQ}D^k4;OXmUH7Ww4zEo11Y$wnk@4Ij>`ouv-k z^lIcQo4#+$%Vik$mB1VLI6);LWA|?{?0w|>Xz_KI(MJ`V!;Zcs$2vFtLwOH#GWQ&c z`I|jI4qM(Am$_=%6R~&cU_+!j*QgalW_waQHyOiGMA8McrZe0f{%PjpfFJ!*8*_FR zsb7`vH~ws-^|ddCGuv-G-DEjB`De?F%snF_ZVXQdUNQy%vHR^lcht#BBUyr68{fP!o*(JG>KSeB~E#f-xe;B&_+3eiYfz_ABE`PZ+Er^ z?mxJ=zH{$WI;P+ayYh>SD7^oyt7EtxHqWtr<`Jj}{YRdFPiFWAo0ZO>?0=)gDBW$m zDDsxIvy%R!lEBR`Y?XOhXI<#2kt9kY2DO;c?VsMD>6vyPF9IaK98-2byFg~NytsK- z);BI(Ka!`_FH!Z0^~~X4%cg!g`7O_=or_&c^0euROY{}LI#5XU^FWi?>1LB>XEnNk z0XzV`1195e_@;;1)wa(KTE(v^RI`| zl&=H*s%0bg zawj#~AvO8tn&xkCJ8{7Gy~JZ$qSF@O2a_$9JMV$w>`<<3xmgugNTsgg+NtAVyDWcJ zVlD5~eLDDu1nDab2xiG#VA(Ubmy`06B0eTrVpdQ_VKg#lSu2E7ixDvQfShP^@1gX`YTKg_&h9YDpZ zd?Krl%W`(p6c=q=h3gq5);%UwO=NW7D+HGpP#eeumJ5n#@0^>{feMM0t{0m~jh?p) zrWUP-Qzhz;V$w>sm|H(N6jl^&FhBJF{FQSXh=6)3NiK&gU;|SOyYF=4&14|T)PZU6 zsK=-4%@v{ha%fo|Ax-?y`p?fTfYg$%SZVM-C~t&(0|ZGVD`blkHxHk6nIZPT zLN`i6oXLHmKuhkG3FA86_f$^ zKLrOD!^K3^^!~A{w4KNlT{;X!f^Y+Cs^6Q7*5N8;C*mrR(zpb2qbG&l&xsE%nZ)@$ z1nf~LHnaH$G{+aE>{#`fOc3E>9oY^Vy$5b4v%v4@S`TX1Fc7iJ{JG4}KwXTnKun$a za^#^ObcTTHNN7>$tncgYxKcGhr0u>c5K7Rl$Yxc`K2fAxy5Po)j@a0-qWd9A+%D5t z?}zHa^xD@KbA7@buxHjEBHcMLZ%Ln+)f}>Ri~e}=`OqeE%Gz~~o$`?~z%3qQ&P|4C z##*D&DJ_5mz0)OK>|{=_TP$=;S|bfPd^LdGxhH{TayBuWwj_5O7jyQ;L?WBR#cOO) z92GhTdr(?d|bO;4}tw8TOD*yWs?m(*EAxK;Rb_vF7 zJU;*Sj<{wEsNK}{_OkZI`eX*Q3_U#jN=H{VHO}^Y_F>kuA!vr6Y!~c&uRoIL=@3QU zrHnEF;#vc3gv~V4#@b-y)CWdRTLXM?L9akTNy2wp)6>&mY}dcZaO|K#sAGyl}hGRR*ex}N&x*_9GK z`}?tLrop+X32)XeWeW>%1y2qoF&!j`uYh#1696-}jUTu)){;dz!emhIk99LyK^z|K zR<1zNuwFbRF7jKfa$FCx_p0c&$G;4l`wDA_f!Kf-m>A8=oM=y|O?DoA=u=ptQ+d;J zl&Y<5y=viQ7b8*Xn)K$)p&HSct!X7e0tPW(!DbT96{VomscjH!2p)1 z4Bf@h4)%iIoC=OljZ{;3y@|s@33l|-?E&!)=#@EnM$yX6VvMp6BkX25RaxNW`5Ts4 zNe~bA@caIT(@x!Ha6_~D;#?a-BlHuE*^O|=x125U27so&qQT~jD7gaC);Y?#=Rs)5 zS+Hf{V}9`zUU-*Myr^{kwL9x%6)pJtW8j&YqR|I0wL(!ls|b~U_G(D^Mme5kXI=WE z^1^W8z92G0`3$H;k<}aa3IO8=Af*$?oh!sXH(abSN5JQ95cK#P`?$sjw$EcsOI$YE z_T6TTa+hz(trni`^gl9q&eU@~TEPx^ie;QY@HdL*R?V-2(8U}$o=FM@gtjuP>A=>?kjnB}T_Z^oE_eFQFd#2ATM@7pe z+)|yj;qCDPxa#o=6DQzfXjT!uY!H+hQ6=bZt^ITb)z$H!OwfH(8b9I$$C>V1W2qRz zN2od3@%cv?sV_+?APXcO-nlNVX@AQ9lmqL3SF)xmN)n&~b84KV-J3wAxQM#}z|`sc zN#e?``AWlP5d*;8Q!m)S&9f*2_R1WxZa$3qUl2N%gew}r@Zk13S7FA_MpC3Lux1LK z@PKH$$g`JsNRK7~xXjS&-W(iO!9$9C(!{YKfVwXYK0Emfac#F2?+B(nf3+RaX)5(r zY;SPt?wWo*=p z+}5%D?oM#qsB?^5p!g(!?{*eksGT5sBK>|_M*eq!@m6}A?97llDH7EGjk?9!pI(p> z3rZg1flBB|z@@k>m_@N9@lKm`{pz9Nu()K}dedQ)qo8XRTn`W2v-#z2Ew~kA5VXAk zo2ZYwPXfTkQ5SkPeJmj;TEF0_;!gN5D-W4ipoR?DIX^vXzH#0$u#&~oE!+0@g zsA3au3g1x^RIf)xi#|{a?HObl`Xz1vZ==#Tb*Yvt&a0O|(5xH2dsz7%_FGIk$urqQVLqwa&v z`zV-!F*08e>2IJWHqaki{kI+jEG#UZ22dx5nMSodx245zqbr!G&glhS(8wHaVlAFfG-k6IbN>ih+7GR-N*g~@Xx^jh^IiXZ7NZJWbNR&0BnA7}YvJ4avYNIq*@?Be^ z6Jxwnkc^|lr>|WF^l@b3|HaH9ba@lbj`ug4?QlI?Ik(D;t7|s_iX>db;WaXpipT%X^M{si0hn0w=3+x2486G&2U{vV;%ebf2vNCo3hJ6ql8f z6y{m(QGXjdfoOkZ-}1Uk@DwQ!gG~p5Z1sxCMr7i@JYZO0PM;sHz}GS-%OYXJ=3z`B z!LpI)TS_RCG<~_lVED)KYRBTkd_dHByZ!dK~MJ&__I9(I0=R zBqTr*-LVEeN*aFhrGCl~gCtMpBw3pu>!yf1Rn3^<)lSKit8{JY%<+(m;m1Si)AgRiBrYp@dE1sW>LOHM?9^!Ze+8gw>>zs4q`SSi12V;k>R|Ef#AGcW4PAUbI z@45Ku&6P$877-`_7o>kDEfIUSBE0@TK0%+C8z6B%ORyR!AB_vDPc74|7dfQXq18ak z%Vh!4X&S`$KXaDib6(O*lc^?Eghk&XL{c}L9(?li|K}el8gU_hrBp-8GzG!X$JI~s zr-Z%h1>{x*ErIL1Thm7IN=bsQZJ&!JmH8`{RsFbB!Z%@K&Ce%(yIY|zClXy>)%@So zM4qe}bN1A0l;yPG)#H2vQP_bT7Rn{b32a(+mjFhPgmvp0c_-$BLX2!1U+BmbY%p+17>V`-@QR~G0s?P@_#Lu=&$2W1DxiQaP z?;G;go$oyd;k3c=PRkY}Yw`6M*pR6KNN6ObvxPcUfvgyJv%}}BvAqsx0;|%)6uhqO zR^xyqVI?#)f0rA58_(Ds zz(HC*Z*z7}-5=#Nhws zJOKC&5)5xUNQa0dz%EYU0XJ~kc=(_v|8-RYF&i*thA-KOL+G#XlGHZ?Y%lEXeRBs> z+rVfI8I0DT<7tB_|9fx+h7ZrUV#vS{{_^i2fOo#=#qE6jm(m91o&jk6j7-P_U*L;i zbjk-trvy?}xY_?b7z6uJuN(+@{>}q{^U&aT`iuV%1OPVpt^00ZVCRjL3;lQ4V((tQ p1Ml?yGGHI_--G{O7Q^=qTJivcQ7$EA`yb$+xUh^+xqzPE{{alC)V2Ts diff --git a/beer_contracts_with_stubs/example/graphs/dracula.png b/beer_contracts_with_stubs/example/graphs/dracula.png deleted file mode 100644 index e1bdee948dd8fa3b9c1798eb9221774e19532dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61477 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

fBE$u}rtg?>myRHN;dPc4%Tbb{~7)Kn!v{6RyD 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 rup+;%` - - - 4.0.0 - - com.example - beer-api-producer-external - 0.0.1.BUILD-SNAPSHOT - - Beer API producer Stubs - POM used to install locally stubs for consumer side - - - org.springframework.boot - spring-boot-starter-parent - 2.1.3.RELEASE - - - - - UTF-8 - 1.8 - 2.1.3.BUILD-SNAPSHOT - Greenwich.BUILD-SNAPSHOT - - true - - true - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud-dependencies.version} - pom - import - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.19.1 - - true - - - - org.springframework.cloud - spring-cloud-contract-maven-plugin - ${spring-cloud-contract.version} - true - - - ${project.basedir} - - - - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot-local - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - spring-releases - Spring Releases - https://repo.spring.io/release - - false - - - - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot-local - - true - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone-local - - false - - - - spring-plugin-snapshots - Spring Snapshots - https://repo.spring.io/plugins-snapshot-local - - true - - - - spring-plugin-milestones - Spring Milestones - https://repo.spring.io/plugins-release-local - - false - - - - - diff --git a/beer_contracts_with_stubs/js/d3.min.js b/beer_contracts_with_stubs/js/d3.min.js deleted file mode 100644 index e5bac8af6..000000000 --- a/beer_contracts_with_stubs/js/d3.min.js +++ /dev/null @@ -1,5 +0,0 @@ -!function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(n){return aa+n in this}function o(n){return n=aa+n,n in this&&delete this[n]}function a(){var n=[];return this.forEach(function(t){n.push(t)}),n}function c(){var n=0;for(var t in this)t.charCodeAt(0)===ca&&++n;return n}function s(){for(var n in this)if(n.charCodeAt(0)===ca)return!1;return!0}function l(){}function f(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function h(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=sa.length;r>e;++e){var u=sa[e]+t;if(u in n)return u}}function g(){}function p(){}function v(n){function t(){for(var t,r=e,u=-1,i=r.length;++ue;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function D(n){return fa(n,ya),n}function P(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t0&&(n=n.substring(0,a));var s=Ma.get(n);return s&&(n=s,c=F),a?t?u:r:t?g:i}function H(n,t){return function(e){var r=Xo.event;Xo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Xo.event=r}}}function F(n,t){var e=H(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function O(){var n=".dragsuppress-"+ ++ba,t="click"+n,e=Xo.select(Go).on("touchmove"+n,d).on("dragstart"+n,d).on("selectstart"+n,d);if(_a){var r=Jo.style,u=r[_a];r[_a]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),_a&&(r[_a]=u),i&&(e.on(t,function(){d(),o()},!0),setTimeout(o,0))}}function Y(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>wa&&(Go.scrollX||Go.scrollY)){e=Xo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();wa=!(u.f||u.e),e.remove()}return wa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function I(n){return n>0?1:0>n?-1:0}function Z(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function V(n){return n>1?0:-1>n?Sa:Math.acos(n)}function X(n){return n>1?Ea:-1>n?-Ea:Math.asin(n)}function $(n){return((n=Math.exp(n))-1/n)/2}function B(n){return((n=Math.exp(n))+1/n)/2}function W(n){return((n=Math.exp(2*n))-1)/(n+1)}function J(n){return(n=Math.sin(n/2))*n}function G(){}function K(n,t,e){return new Q(n,t,e)}function Q(n,t,e){this.h=n,this.s=t,this.l=e}function nt(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,gt(u(n+120),u(n),u(n-120))}function tt(n,t,e){return new et(n,t,e)}function et(n,t,e){this.h=n,this.c=t,this.l=e}function rt(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),ut(e,Math.cos(n*=Na)*t,Math.sin(n)*t)}function ut(n,t,e){return new it(n,t,e)}function it(n,t,e){this.l=n,this.a=t,this.b=e}function ot(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=ct(u)*Fa,r=ct(r)*Oa,i=ct(i)*Ya,gt(lt(3.2404542*u-1.5371385*r-.4985314*i),lt(-.969266*u+1.8760108*r+.041556*i),lt(.0556434*u-.2040259*r+1.0572252*i))}function at(n,t,e){return n>0?tt(Math.atan2(e,t)*La,Math.sqrt(t*t+e*e),n):tt(0/0,0/0,n)}function ct(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function st(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function lt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ft(n){return gt(n>>16,255&n>>8,255&n)}function ht(n){return ft(n)+""}function gt(n,t,e){return new pt(n,t,e)}function pt(n,t,e){this.r=n,this.g=t,this.b=e}function vt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function dt(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(Mt(u[0]),Mt(u[1]),Mt(u[2]))}return(i=Va.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function mt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),K(r,u,c)}function yt(n,t,e){n=xt(n),t=xt(t),e=xt(e);var r=st((.4124564*n+.3575761*t+.1804375*e)/Fa),u=st((.2126729*n+.7151522*t+.072175*e)/Oa),i=st((.0193339*n+.119192*t+.9503041*e)/Ya);return ut(116*u-16,500*(r-u),200*(u-i))}function xt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Mt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function _t(n){return"function"==typeof n?n:function(){return n}}function bt(n){return n}function wt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),St(t,e,n,r)}}function St(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Xo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Go.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Xo.event;Xo.event=n;try{o.progress.call(i,c)}finally{Xo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Bo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Xo.rebind(i,o,"on"),null==r?i:i.get(kt(r))}function kt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Et(){var n=At(),t=Ct()-n;t>24?(isFinite(t)&&(clearTimeout(Wa),Wa=setTimeout(Et,t)),Ba=0):(Ba=1,Ga(Et))}function At(){var n=Date.now();for(Ja=Xa;Ja;)n>=Ja.t&&(Ja.f=Ja.c(n-Ja.t)),Ja=Ja.n;return n}function Ct(){for(var n,t=Xa,e=1/0;t;)t.f?t=n?n.n=t.n:Xa=t.n:(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function zt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t>0&&o>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:bt;return function(n){var e=Qa.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(s||"0"===r&&"="===o)&&(s=r="0",o="=",f&&(l-=Math.floor((l-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=nc.get(g)||qt;var y=s&&f;return function(n){if(m&&n%1)return"";var e=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var u=Xo.formatPrefix(n,h);n=u.scale(n),d=u.symbol}else n*=p;n=g(n,h);var c=n.lastIndexOf("."),x=0>c?n:n.substring(0,c),M=0>c?"":t+n.substring(c+1);!s&&f&&(x=i(x));var _=v.length+x.length+M.length+(y?0:e.length),b=l>_?new Array(_=l-_+1).join(r):"";return y&&(x=i(b+x)),e+=v,n=x+M,("<"===o?e+n+b:">"===o?b+e+n:"^"===o?b.substring(0,_>>=1)+e+n+b.substring(_):e+(y?n:b+n))+d}}}function qt(n){return n+""}function Tt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Rt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new ec(e-1)),1),e}function i(n,e){return t(n=new ec(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{ec=Tt;var r=new Tt;return r._=n,o(r,t,e)}finally{ec=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Dt(n);return c.floor=c,c.round=Dt(r),c.ceil=Dt(u),c.offset=Dt(i),c.range=a,n}function Dt(n){return function(t,e){try{ec=Tt;var r=new Tt;return r._=t,n(r,e)._}finally{ec=Date}}}function Pt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++aa;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in uc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function s(n,t,r){return e(n,C.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{ec=Tt;var t=new ec;return t._=n,r(t)}finally{ec=Date}}var r=t(n);return e.parse=function(n){try{ec=Tt;var t=r.parse(n);return t&&t._}finally{ec=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ee;var x=Xo.map(),M=jt(v),_=Ht(v),b=jt(d),w=Ht(d),S=jt(m),k=Ht(m),E=jt(y),A=Ht(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Ut(n.getDate(),t,2)},e:function(n,t){return Ut(n.getDate(),t,2)},H:function(n,t){return Ut(n.getHours(),t,2)},I:function(n,t){return Ut(n.getHours()%12||12,t,2)},j:function(n,t){return Ut(1+tc.dayOfYear(n),t,3)},L:function(n,t){return Ut(n.getMilliseconds(),t,3)},m:function(n,t){return Ut(n.getMonth()+1,t,2)},M:function(n,t){return Ut(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Ut(n.getSeconds(),t,2)},U:function(n,t){return Ut(tc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ut(tc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Ut(n.getFullYear()%100,t,2)},Y:function(n,t){return Ut(n.getFullYear()%1e4,t,4)},Z:ne,"%":function(){return"%"}},N={a:r,A:u,b:i,B:o,c:a,d:Bt,e:Bt,H:Jt,I:Jt,j:Wt,L:Qt,m:$t,M:Gt,p:l,S:Kt,U:Ot,w:Ft,W:Yt,x:c,X:s,y:Zt,Y:It,Z:Vt,"%":te};return t}function Ut(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function jt(n){return new RegExp("^(?:"+n.map(Xo.requote).join("|")+")","i")}function Ht(n){for(var t=new u,e=-1,r=n.length;++e68?1900:2e3)}function $t(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Bt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Wt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Jt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Gt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Kt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Qt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ne(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(oa(t)/60),u=oa(t)%60;return e+Ut(r,"0",2)+Ut(u,"0",2)}function te(n,t,e){oc.lastIndex=0;var r=oc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ee(n){for(var t=n.length,e=-1;++ea;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new ke(e,n,null,!0),s=new ke(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new ke(r,n,null,!1),s=new ke(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Se(i),Se(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Se(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Ae))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Xo.merge(g);var n=Le(m,p);g.length?we(g,Ne,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Ce(),M=t(x);return y}}function Ae(n){return n.length>1}function Ce(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:g,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ne(n,t){return((n=n.x)[0]<0?n[1]-Ea-Aa:Ea-n[1])-((t=t.x)[0]<0?t[1]-Ea-Aa:Ea-t[1])}function Le(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+Sa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+Sa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=oa(_)>Sa,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_>=0?ka:-ka):_,b^h>=e^m>=e){var S=fe(se(f),se(n));pe(S);var k=fe(u,S);pe(k);var E=(b^_>=0?-1:1)*X(k[2]);(r>E||r===E&&(S[0]||S[1]))&&(o+=b^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Aa>i||Aa>i&&0>hc)^1&o}function ze(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Sa:-Sa,c=oa(i-e);oa(c-Sa)0?Ea:-Ea),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Sa&&(oa(e-u)Aa?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function Te(n,t,e,r){var u;if(null==n)u=e*Ea,r.point(-Sa,u),r.point(0,u),r.point(Sa,u),r.point(Sa,0),r.point(Sa,-u),r.point(0,-u),r.point(-Sa,-u),r.point(-Sa,0),r.point(-Sa,u);else if(oa(n[0]-t[0])>Aa){var i=n[0]i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Sa:-Sa),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(de(e,g)||de(p,g))&&(p[0]+=Aa,p[1]+=Aa,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&de(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=se(n),u=se(t),o=[1,0,0],a=fe(r,u),c=le(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=fe(o,a),p=ge(o,f),v=ge(a,h);he(p,v);var d=g,m=le(p,d),y=le(d,d),x=m*m-y*(le(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ge(d,(-m-M)/y);if(he(_,p),_=ve(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=oa(A-Sa)A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(oa(_[0]-w)Sa^(w<=_[0]&&_[0]<=S)){var L=ge(d,(-m+M)/y);return he(L,p),[_,ve(L)]}}}function u(t,e){var r=o?n:Sa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=oa(i)>Aa,c=cr(n,6*Na);return Ee(t,e,c,o?[0,-n]:[-Sa,n-Sa])}function De(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Pe(n,t,e,r){function u(r,u){return oa(r[0]-n)0?0:3:oa(r[0]-e)0?2:1:oa(r[1]-t)0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c>o;++o)i=a[o],s[1]<=r?i[1]>r&&Z(s,i,n)>0&&++t:i[1]<=r&&Z(s,i,n)<0&&--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){l(n,t)&&a.point(n,t)}function h(){N.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&A.rejoin(),v.push(A.buffer())),N.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=l(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=Ce(),C=De(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Xo.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&&we(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return N}}function Ue(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function je(n){var t=0,e=Sa/3,r=nr(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Sa/180,e=n[1]*Sa/180):[180*(t/Sa),180*(e/Sa)]},u}function He(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,X((i-(n*n+e*e)*u*u)/(2*u))]},e}function Fe(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function Oe(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),zc>t&&(zc=t),t>Tc&&(Tc=t)}function Ye(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Ie(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ie(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Ie(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Ze(n,t){dc+=n,mc+=t,++yc}function Ve(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,Ze(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,Ze(t=r,e=u)}}function Xe(){Pc.point=Ze}function $e(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,Ze(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,Ze(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function Be(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,ka)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:g};return a}function We(n){function t(n){return(a?r:e)(n)}function e(t){return Ke(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=se([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=oa(oa(w)-1)i||oa((y*L+x*z)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Na),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function Je(n){var t=We(function(t,e){return n([t*La,e*La])});return function(n){return tr(t(n))}}function Ge(n){this.stream=n}function Ke(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Qe(n){return nr(function(){return n})()}function nr(n){function t(n){return n=a(n[0]*Na,n[1]*Na),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*La,n[1]*La]}function r(){a=Ue(o=ur(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=We(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=bt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=tr(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):Re((b=+n)*Na),u()):b -},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Pe(n[0][0],n[0][1],n[1][0],n[1][1]):bt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Na,d=n[1]%360*Na,r()):[v*La,d*La]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Na,y=n[1]%360*Na,x=n.length>2?n[2]%360*Na:0,r()):[m*La,y*La,x*La]},Xo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function tr(n){return Ke(n,function(t,e){n.point(t*Na,e*Na)})}function er(n,t){return[n,t]}function rr(n,t){return[n>Sa?n-ka:-Sa>n?n+ka:n,t]}function ur(n,t,e){return n?t||e?Ue(or(n),ar(t,e)):or(n):t||e?ar(t,e):rr}function ir(n){return function(t,e){return t+=n,[t>Sa?t-ka:-Sa>t?t+ka:t,e]}}function or(n){var t=ir(n);return t.invert=ir(-n),t}function ar(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),X(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),X(l*r-a*u)]},e}function cr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=sr(e,u),i=sr(e,i),(o>0?i>u:u>i)&&(u+=o*ka)):(u=n+o*ka,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=ve([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function sr(n,t){var e=se(t);e[0]-=n,pe(e);var r=V(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Aa)%(2*Math.PI)}function lr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function fr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function hr(n){return n.source}function gr(n){return n.target}function pr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(J(r-t)+u*o*J(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*La,Math.atan2(o,Math.sqrt(r*r+u*u))*La]}:function(){return[n*La,t*La]};return p.distance=h,p}function vr(){function n(n,u){var i=Math.sin(u*=Na),o=Math.cos(u),a=oa((n*=Na)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*Na,e=Math.sin(i*=Na),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=g}}function dr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function mr(n,t){function e(n,t){var e=oa(oa(t)-Ea)u;u++){for(;r>1&&Z(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function kr(n,t){return n[0]-t[0]||n[1]-t[1]}function Er(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Ar(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function Cr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Nr(){Jr(this),this.edge=this.site=this.circle=null}function Lr(n){var t=Jc.pop()||new Nr;return t.site=n,t}function zr(n){Or(n),$c.remove(n),Jc.push(n),Jr(n)}function qr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];zr(n);for(var c=i;c.circle&&oa(e-c.circle.x)l;++l)s=a[l],c=a[l-1],$r(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Vr(c.site,s.site,null,u),Fr(c),Fr(s)}function Tr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=Rr(a,o)-i,r>Aa)a=a.L;else{if(u=i-Dr(a,o),!(u>Aa)){r>-Aa?(t=a.P,e=a):u>-Aa?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Lr(n);if($c.insert(t,c),t||e){if(t===e)return Or(t),e=Lr(t.site),$c.insert(c,e),c.edge=e.edge=Vr(t.site,c.site),Fr(t),Fr(e),void 0;if(!e)return c.edge=Vr(t.site,c.site),void 0;Or(t),Or(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};$r(e.edge,s,p,M),c.edge=Vr(s,n,null,M),e.edge=Vr(n,p,null,M),Fr(t),Fr(e)}}function Rr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Dr(n,t){var e=n.N;if(e)return Rr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Pr(n){this.site=n,this.edges=[]}function Ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(oa(r-t)>Aa||oa(u-e)>Aa)&&(a.splice(o,0,new Br(Xr(i.site,l,oa(r-f)Aa?{x:f,y:oa(t-f)Aa?{x:oa(e-p)Aa?{x:h,y:oa(t-h)Aa?{x:oa(e-g)=-Ca)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new Hr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.yd||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.yr||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.yg){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.xr;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=su(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function fu(n,t){for(var e,r=Xo.interpolators.length;--r>=0&&!(e=Xo.interpolators[r](n,t)););return e}function hu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(fu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function gu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function pu(n){return function(t){return 1-n(1-t)}}function vu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function du(n){return n*n}function mu(n){return n*n*n}function yu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function xu(n){return function(t){return Math.pow(t,n)}}function Mu(n){return 1-Math.cos(n*Ea)}function _u(n){return Math.pow(2,10*(n-1))}function bu(n){return 1-Math.sqrt(1-n*n)}function wu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/ka*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*ka/t)}}function Su(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function ku(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Eu(n,t){n=Xo.hcl(n),t=Xo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return rt(e+i*n,r+o*n,u+a*n)+""}}function Au(n,t){n=Xo.hsl(n),t=Xo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return nt(e+i*n,r+o*n,u+a*n)+""}}function Cu(n,t){n=Xo.lab(n),t=Xo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ot(e+i*n,r+o*n,u+a*n)+""}}function Nu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Lu(n){var t=[n.a,n.b],e=[n.c,n.d],r=qu(t),u=zu(t,e),i=qu(Tu(e,t,-u))||0;t[0]*e[1]180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:su(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:su(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:su(g[0],p[0])},{i:e-2,x:su(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++ie;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ei(n){return n.reduce(ri,0)}function ri(n,t){return n+t[1]}function ui(n,t){return ii(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ii(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function oi(n){return[Xo.min(n),Xo.max(n)]}function ai(n,t){return n.parent==t.parent?1:2}function ci(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function si(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function li(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i0&&(n=r);return n}function fi(n,t){return n.x-t.x}function hi(n,t){return t.x-n.x}function gi(n,t){return n.depth-t.depth}function pi(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function di(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function mi(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function yi(n,t){return n.value-t.value}function xi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Mi(n,t){n._pack_next=t,t._pack_prev=n}function _i(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function bi(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(wi),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],Ei(r,u,i),t(i),xi(r,i),r._pack_prev=i,xi(i,u),u=r._pack_next,o=3;s>o;o++){Ei(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(_i(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!_i(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.ro;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Si)}}function wi(n){n._pack_next=n._pack_prev=n}function Si(n){delete n._pack_next,delete n._pack_prev}function ki(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++iu&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ti(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ri(n){return n.rangeExtent?n.rangeExtent():Ti(n.range())}function Di(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Pi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ls}function ji(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?ji:Di,c=r?Pu:Du;return o=u(n,t,c,e),a=u(t,n,c,fu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Nu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Ii(n,t)},i.tickFormat=function(t,e){return Zi(n,t,e)},i.nice=function(t){return Oi(n,t),u()},i.copy=function(){return Hi(n,t,e,r)},u()}function Fi(n,t){return Xo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Oi(n,t){return Pi(n,Ui(Yi(n,t)[2]))}function Yi(n,t){null==t&&(t=10);var e=Ti(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Ii(n,t){return Xo.range.apply(Xo,Yi(n,t))}function Zi(n,t,e){var r=Yi(n,t);return Xo.format(e?e.replace(Qa,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+Xi(l,r),l].join("")}):",."+Vi(r[2])+"f")}function Vi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Xi(n,t){var e=Vi(t[2]);return n in fs?Math.abs(e-Vi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function $i(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Pi(r.map(u),e?Math:gs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=Ti(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++0;h--)o.push(i(s)*h);for(s=0;o[s]c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return hs;arguments.length<2?t=hs:"function"!=typeof t&&(t=Xo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return $i(n.copy(),t,e,r)},Fi(o,n)}function Bi(n,t,e){function r(t){return n(u(t))}var u=Wi(t),i=Wi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Ii(e,n)},r.tickFormat=function(n,t){return Zi(e,n,t)},r.nice=function(n){return r.domain(Oi(e,n))},r.exponent=function(o){return arguments.length?(u=Wi(t=o),i=Wi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Bi(n.copy(),t,e)},Fi(r,n)}function Wi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Ji(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return Xo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++ae?[0/0,0/0]:[e>0?u[e-1]:n[0],et?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Ki(n,t,e)},u()}function Qi(n,t){function e(e){return e>=e?t[Xo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Qi(n,t)},e}function no(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Ii(n,t)},t.tickFormat=function(t,e){return Zi(n,t,e)},t.copy=function(){return no(n)},t}function to(n){return n.innerRadius}function eo(n){return n.outerRadius}function ro(n){return n.startAngle}function uo(n){return n.endAngle}function io(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=_t(e),p=_t(r);++f1&&u.push("H",r[0]),u.join("")}function so(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Eo(n){return n.length<3?oo(n):n[0]+po(n,ko(n))}function Ao(n){for(var t,e,r,u=-1,i=n.length;++ue?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),Xo.timer(function(){return p.c=c(r||1)?be:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ja,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function Ho(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Fo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Xo.bisect(js,u);return i==js.length?[t.year,Yi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/js[i-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Ti(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},Fi(r,n)}function Io(n){return new Date(n)}function Zo(n){return JSON.parse(n.responseText)}function Vo(n){var t=Wo.createRange();return t.selectNode(Wo.body),t.createContextualFragment(n.responseText)}var Xo={version:"3.4.1"};Date.now||(Date.now=function(){return+new Date});var $o=[].slice,Bo=function(n){return $o.call(n)},Wo=document,Jo=Wo.documentElement,Go=window;try{Bo(Jo.childNodes)[0].nodeType}catch(Ko){Bo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Wo.createElement("div").style.setProperty("opacity",0,"")}catch(Qo){var na=Go.Element.prototype,ta=na.setAttribute,ea=na.setAttributeNS,ra=Go.CSSStyleDeclaration.prototype,ua=ra.setProperty;na.setAttribute=function(n,t){ta.call(this,n,t+"")},na.setAttributeNS=function(n,t,e){ea.call(this,n,t,e+"")},ra.setProperty=function(n,t,e){ua.call(this,n,t+"",e)}}Xo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},Xo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Xo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ur&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ur&&(e=r)}return e},Xo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u=e);)e=void 0;for(;++ue&&(e=r)}else{for(;++u=e);)e=void 0;for(;++ue&&(e=r)}return e},Xo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i=e);)e=u=void 0;for(;++ir&&(e=r),r>u&&(u=r))}else{for(;++i=e);)e=void 0;for(;++ir&&(e=r),r>u&&(u=r))}return[e,u]},Xo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i1&&(t=t.map(e)),t=t.filter(n),t.length?Xo.quantile(t.sort(Xo.ascending),.5):void 0},Xo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)r;){var i=r+u>>>1;er?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Xo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=Xo.min(arguments,t),r=new Array(e);++n=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var oa=Math.abs;Xo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(oa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(Xo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},Xo.set=function(n){var t=new l;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(l,{has:i,add:function(n){return this[aa+n]=!0,n},remove:function(n){return n=aa+n,n in this&&delete this[n]},values:a,size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1))}}),Xo.behavior={},Xo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Xo.event=null,Xo.requote=function(n){return n.replace(la,"\\$&")};var la=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,fa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ha=function(n,t){return t.querySelector(n)},ga=function(n,t){return t.querySelectorAll(n)},pa=Jo[h(Jo,"matchesSelector")],va=function(n,t){return pa.call(n,t)};"function"==typeof Sizzle&&(ha=function(n,t){return Sizzle(n,t)[0]||null},ga=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},va=Sizzle.matchesSelector),Xo.selection=function(){return xa};var da=Xo.selection.prototype=[];da.select=function(n){var t,e,r,u,i=[];n=M(n);for(var o=-1,a=this.length;++o=0&&(e=n.substring(0,t),n=n.substring(t+1)),ma.hasOwnProperty(e)?{space:ma[e],local:n}:n}},da.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Xo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(b(t,n[t]));return this}return this.each(b(n,t))},da.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=k(n)).length,u=-1;if(t=e.classList){for(;++ur){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return Go.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(C(n,t,e))},da.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(N(t,n[t]));return this}return this.each(N(n,t))},da.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},da.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},da.append=function(n){return n=L(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},da.insert=function(n,t){return n=L(n),t=M(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},da.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},da.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++rr;++r)p[r]=z(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++oi;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return x(u)},da.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},da.sort=function(n){n=T.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},da.size=function(){var n=0;return this.each(function(){++n}),n};var ya=[];Xo.selection.enter=D,Xo.selection.enter.prototype=ya,ya.append=da.append,ya.empty=da.empty,ya.node=da.node,ya.call=da.call,ya.size=da.size,ya.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(j(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(j(n,t,e))};var Ma=Xo.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ma.forEach(function(n){"on"+n in Wo&&Ma.remove(n)});var _a="onselectstart"in Wo?null:h(Jo.style,"userSelect"),ba=0;Xo.mouse=function(n){return Y(n,m())};var wa=/WebKit/.test(Go.navigator.userAgent)?-1:0;Xo.touches=function(n,t){return arguments.length<2&&(t=m().touches),t?Bo(t).map(function(t){var e=Y(n,t);return e.identifier=t.identifier,e}):[]},Xo.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return Xo.event.changedTouches[0].identifier}function e(n,t){return Xo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&Xo.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=Xo.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=Xo.select(Go).on(e+"."+p,o).on(r+"."+p,a),y=O();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=y(n,"drag","dragstart","dragend"),i=null,o=r(g,Xo.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},Xo.rebind(n,u,"on")};var Sa=Math.PI,ka=2*Sa,Ea=Sa/2,Aa=1e-6,Ca=Aa*Aa,Na=Sa/180,La=180/Sa,za=Math.SQRT2,qa=2,Ta=4;Xo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=B(v),o=i/(qa*h)*(e*W(za*t+v)-$(v));return[r+o*s,u+o*l,i*e/B(za*t+v)]}return[r+n*s,u+n*l,i*Math.exp(za*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ta*f)/(2*i*qa*h),p=(c*c-i*i-Ta*f)/(2*c*qa*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/za;return e.duration=1e3*y,e},Xo.behavior.zoom=function(){function n(n){n.on(A,s).on(Pa+".zoom",f).on(C,h).on("dblclick.zoom",g).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u(Xo.mouse(r),g),a(i)}function e(){f.on(C,Go===r?h:null).on(N,null),p(l&&Xo.event.target===s),c(i)}var r=this,i=z.of(r,arguments),s=Xo.event.target,l=0,f=Xo.select(Go).on(C,n).on(N,e),g=t(Xo.mouse(r)),p=O();U.call(r),o(i)}function l(){function n(){var n=Xo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=Xo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=v[s.identifier];r(2*S.k),u(s,l),d(),a(p)}x=c}else if(o.length>1){var s=o[0],f=o[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function i(){for(var n,t,e,i,o=Xo.touches(g),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}x=null,u(n,t),a(p)}function f(){if(Xo.event.touches.length){for(var t=Xo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(p)}var h,g=this,p=z.of(g,arguments),v={},m=0,y=Xo.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=Xo.select(Go).on(M,i).on(_,f),w=Xo.select(g).on(A,null).on(L,e),k=O();U.call(g),e(),o(p)}function f(){var n=z.of(this,arguments);m?clearTimeout(m):(U.call(this),o(n)),m=setTimeout(function(){m=null,c(n)},50),d();var e=v||Xo.mouse(this);p||(p=t(e)),r(Math.pow(2,.002*Ra())*S.k),u(e,p),a(n)}function h(){p=null}function g(){var n=z.of(this,arguments),e=Xo.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Xo.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var p,v,m,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Da,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",z=y(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=z.of(this,arguments),t=S;ks?Xo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Xo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Da:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Xo.rebind(n,z,"on")};var Ra,Da=[0,1/0],Pa="onwheel"in Wo?(Ra=function(){return-Xo.event.deltaY*(Xo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Wo?(Ra=function(){return Xo.event.wheelDelta},"mousewheel"):(Ra=function(){return-Xo.event.detail},"MozMousePixelScroll");G.prototype.toString=function(){return this.rgb()+""},Xo.hsl=function(n,t,e){return 1===arguments.length?n instanceof Q?K(n.h,n.s,n.l):dt(""+n,mt,K):K(+n,+t,+e)};var Ua=Q.prototype=new G;Ua.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,this.l/n)},Ua.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,n*this.l)},Ua.rgb=function(){return nt(this.h,this.s,this.l)},Xo.hcl=function(n,t,e){return 1===arguments.length?n instanceof et?tt(n.h,n.c,n.l):n instanceof it?at(n.l,n.a,n.b):at((n=yt((n=Xo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):tt(+n,+t,+e)};var ja=et.prototype=new G;ja.brighter=function(n){return tt(this.h,this.c,Math.min(100,this.l+Ha*(arguments.length?n:1)))},ja.darker=function(n){return tt(this.h,this.c,Math.max(0,this.l-Ha*(arguments.length?n:1)))},ja.rgb=function(){return rt(this.h,this.c,this.l).rgb()},Xo.lab=function(n,t,e){return 1===arguments.length?n instanceof it?ut(n.l,n.a,n.b):n instanceof et?rt(n.l,n.c,n.h):yt((n=Xo.rgb(n)).r,n.g,n.b):ut(+n,+t,+e)};var Ha=18,Fa=.95047,Oa=1,Ya=1.08883,Ia=it.prototype=new G;Ia.brighter=function(n){return ut(Math.min(100,this.l+Ha*(arguments.length?n:1)),this.a,this.b)},Ia.darker=function(n){return ut(Math.max(0,this.l-Ha*(arguments.length?n:1)),this.a,this.b)},Ia.rgb=function(){return ot(this.l,this.a,this.b)},Xo.rgb=function(n,t,e){return 1===arguments.length?n instanceof pt?gt(n.r,n.g,n.b):dt(""+n,gt,nt):gt(~~n,~~t,~~e)};var Za=pt.prototype=new G;Za.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),gt(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):gt(u,u,u)},Za.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),gt(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Za.hsl=function(){return mt(this.r,this.g,this.b)},Za.toString=function(){return"#"+vt(this.r)+vt(this.g)+vt(this.b)};var Va=Xo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Va.forEach(function(n,t){Va.set(n,ft(t))}),Xo.functor=_t,Xo.xhr=wt(bt),Xo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=St(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new l,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Xo.csv=Xo.dsv(",","text/csv"),Xo.tsv=Xo.dsv(" ","text/tab-separated-values");var Xa,$a,Ba,Wa,Ja,Ga=Go[h(Go,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Xo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};$a?$a.n=i:Xa=i,$a=i,Ba||(Wa=clearTimeout(Wa),Ba=1,Ga(Et))},Xo.timer.flush=function(){At(),Ct()},Xo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ka=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Lt);Xo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Xo.round(n,Nt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Ka[8+e/3]};var Qa=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,nc=Xo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Xo.round(n,Nt(n,t))).toFixed(Math.max(0,Math.min(20,Nt(n*(1+1e-15),t))))}}),tc=Xo.time={},ec=Date;Tt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){rc.setUTCDate.apply(this._,arguments)},setDay:function(){rc.setUTCDay.apply(this._,arguments)},setFullYear:function(){rc.setUTCFullYear.apply(this._,arguments)},setHours:function(){rc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){rc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){rc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){rc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){rc.setUTCSeconds.apply(this._,arguments)},setTime:function(){rc.setTime.apply(this._,arguments)}};var rc=Date.prototype;tc.year=Rt(function(n){return n=tc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),tc.years=tc.year.range,tc.years.utc=tc.year.utc.range,tc.day=Rt(function(n){var t=new ec(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),tc.days=tc.day.range,tc.days.utc=tc.day.utc.range,tc.dayOfYear=function(n){var t=tc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=tc[n]=Rt(function(n){return(n=tc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});tc[n+"s"]=e.range,tc[n+"s"].utc=e.utc.range,tc[n+"OfYear"]=function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)}}),tc.week=tc.sunday,tc.weeks=tc.sunday.range,tc.weeks.utc=tc.sunday.utc.range,tc.weekOfYear=tc.sundayOfYear;var uc={"-":"",_:" ",0:"0"},ic=/^\s*\d+/,oc=/^%/;Xo.locale=function(n){return{numberFormat:zt(n),timeFormat:Pt(n)}};var ac=Xo.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Xo.format=ac.numberFormat,Xo.geo={},re.prototype={s:0,t:0,add:function(n){ue(n,this.t,cc),ue(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new re;Xo.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):ie(n,t)};var sc={Feature:function(n,t){ie(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++rn?4*Sa+n:n,gc.lineStart=gc.lineEnd=gc.point=g}};Xo.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=se([t*Na,e*Na]);if(m){var u=fe(m,r),i=[u[1],-u[0],0],o=fe(i,u);pe(o),o=ve(o);var c=t-p,s=c>0?1:-1,v=o[0]*La*s,d=oa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*La;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*La;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=oa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),oa(y)>Aa&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nhc?(l=-(h=180),f=-(g=90)):y>Aa?g=90:-Aa>y&&(f=-90),M[0]=l,M[1]=h -}};return function(n){g=h=-(l=f=1/0),x=[],Xo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Xo.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Ca>u&&(t=xc,e=Mc,r=_c,Aa>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Ca>u)?[0/0,0/0]:[Math.atan2(e,t)*La,X(r/Math.sqrt(u))*La]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:g,point:me,lineStart:xe,lineEnd:Me,polygonStart:function(){kc.lineStart=_e},polygonEnd:function(){kc.lineStart=xe}},Ec=Ee(be,ze,Te,[-Sa,-Sa/2]),Ac=1e9;Xo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Pe(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Xo.geo.conicEqualArea=function(){return je(He)}).raw=He,Xo.geo.albers=function(){return Xo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Xo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Xo.geo.albers(),o=Xo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Xo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Aa,f+.12*s+Aa],[l-.214*s-Aa,f+.234*s-Aa]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Aa,f+.166*s+Aa],[l-.115*s-Aa,f+.234*s-Aa]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,zc,qc,Tc,Rc={point:g,lineStart:g,lineEnd:g,polygonStart:function(){Nc=0,Rc.lineStart=Fe},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=g,Cc+=oa(Nc/2)}},Dc={point:Oe,lineStart:g,lineEnd:g,polygonStart:g,polygonEnd:g},Pc={point:Ze,lineStart:Ve,lineEnd:Xe,polygonStart:function(){Pc.lineStart=$e},polygonEnd:function(){Pc.point=Ze,Pc.lineStart=Ve,Pc.lineEnd=Xe}};Xo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Xo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,Xo.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=Tc=-(Lc=zc=1/0),Xo.geo.stream(n,u(Dc)),[[Lc,zc],[qc,Tc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Je(n):bt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ye:new Be(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Xo.geo.albersUsa()).context(null)},Xo.geo.transform=function(n){return{stream:function(t){var e=new Ge(t);for(var r in n)e[r]=n[r];return e}}},Ge.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Xo.geo.projection=Qe,Xo.geo.projectionMutator=nr,(Xo.geo.equirectangular=function(){return Qe(er)}).raw=er.invert=er,Xo.geo.rotation=function(n){function t(t){return t=n(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t}return n=ur(n[0]%360*Na,n[1]*Na,n.length>2?n[2]*Na:0),t.invert=function(t){return t=n.invert(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t},t},rr.invert=er,Xo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=ur(-n[0]*Na,-n[1]*Na,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=La,n[1]*=La}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=cr((t=+r)*Na,u*Na),n):t},n.precision=function(r){return arguments.length?(e=cr(t*Na,(u=+r)*Na),n):u},n.angle(90)},Xo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Na,u=n[1]*Na,i=t[1]*Na,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Xo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Xo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Xo.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Xo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return oa(n%d)>Aa}).map(l)).concat(Xo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return oa(n%m)>Aa}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=lr(a,o,90),f=fr(r,e,y),h=lr(s,c,90),g=fr(i,u,y),n):y},n.majorExtent([[-180,-90+Aa],[180,90-Aa]]).minorExtent([[-180,-80-Aa],[180,80+Aa]])},Xo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=hr,u=gr;return n.distance=function(){return Xo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Xo.geo.interpolate=function(n,t){return pr(n[0]*Na,n[1]*Na,t[0]*Na,t[1]*Na)},Xo.geo.length=function(n){return Uc=0,Xo.geo.stream(n,jc),Uc};var Uc,jc={sphere:g,point:g,lineStart:vr,lineEnd:g,polygonStart:g,polygonEnd:g},Hc=dr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Xo.geo.azimuthalEqualArea=function(){return Qe(Hc)}).raw=Hc;var Fc=dr(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},bt);(Xo.geo.azimuthalEquidistant=function(){return Qe(Fc)}).raw=Fc,(Xo.geo.conicConformal=function(){return je(mr)}).raw=mr,(Xo.geo.conicEquidistant=function(){return je(yr)}).raw=yr;var Oc=dr(function(n){return 1/n},Math.atan);(Xo.geo.gnomonic=function(){return Qe(Oc)}).raw=Oc,xr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ea]},(Xo.geo.mercator=function(){return Mr(xr)}).raw=xr;var Yc=dr(function(){return 1},Math.asin);(Xo.geo.orthographic=function(){return Qe(Yc)}).raw=Yc;var Ic=dr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Xo.geo.stereographic=function(){return Qe(Ic)}).raw=Ic,_r.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ea]},(Xo.geo.transverseMercator=function(){var n=Mr(_r),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[-n[1],n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},n.rotate([0,0])}).raw=_r,Xo.geom={},Xo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=_t(e),i=_t(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(kr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var s=Sr(a),l=Sr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t>=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Aa)*Aa,y:Math.round(o(n,t)/Aa)*Aa,i:t}})}var r=br,u=wr,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return nu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return nu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(jr),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=iu()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=_t(a),M=_t(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.xm&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=iu();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){ou(n,k,v,d,m,y)},g=-1,null==t){for(;++g=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||bt,gu(r(e.apply(null,$o.call(arguments,1))))},Xo.interpolateHcl=Eu,Xo.interpolateHsl=Au,Xo.interpolateLab=Cu,Xo.interpolateRound=Nu,Xo.transform=function(n){var t=Wo.createElementNS(Xo.ns.prefix.svg,"g");return(Xo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Lu(e?e.matrix:rs)})(n)},Lu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};Xo.interpolateTransform=Ru,Xo.layout={},Xo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/d){if(p>c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&&c&&p>c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Xo.event.x,n.py=Xo.event.y,a.resume()}var e,r,u,i,o,a={},c=Xo.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=os,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Zu(t=Xo.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Xo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++at;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Xo.behavior.drag().origin(bt).on("dragstart.force",Fu).on("drag.force",t).on("dragend.force",Ou)),arguments.length?(this.on("mouseover.force",Yu).on("mouseout.force",Iu).call(e),void 0):e},Xo.rebind(a,c,"on")};var us=20,is=1,os=1/0;Xo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++fg;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=bt,e=Qu,r=ni,u=Ku,i=Ju,o=Gu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:cs.get(t)||Qu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:ss.get(t)||ni,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var cs=Xo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(ti),i=n.map(ei),o=Xo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Xo.range(n.length).reverse()},"default":Qu}),ss=Xo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ni});Xo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i0)for(i=-1;++i=l[0]&&a<=l[1]&&(o=c[Xo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=oi,u=ui;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=_t(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return ii(n,t)}:_t(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Xo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h0&&(di(mi(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!si(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!ci(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];pi(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=li(l,hi),h=li(l,fi),g=li(l,gi),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return pi(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,pi(a,function(n){n.r=+l(n.value)}),pi(a,bi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;pi(a,function(n){n.r+=f}),pi(a,bi),pi(a,function(n){n.r-=f})}return ki(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Xo.layout.hierarchy().sort(yi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Vu(n,e)},Xo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;pi(c,function(n){var t=n.children;t&&t.length?(n.x=Ci(t),n.y=Ai(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ni(c),f=Li(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return pi(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++ut?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++oe&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++ie.dx)&&(l=e.dx);++ie&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Xo.random.normal.apply(Xo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Xo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Xo.scale={};var ls={floor:bt,ceil:bt};Xo.scale.linear=function(){return Hi([0,1],[0,1],fu,!1)};var fs={s:1,g:1,p:1,r:1,e:1};Xo.scale.log=function(){return $i(Xo.scale.linear().domain([0,1]),10,!0,[1,10])};var hs=Xo.format(".0e"),gs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Xo.scale.pow=function(){return Bi(Xo.scale.linear(),1,[0,1])},Xo.scale.sqrt=function(){return Xo.scale.pow().exponent(.5)},Xo.scale.ordinal=function(){return Ji([],{t:"range",a:[[]]})},Xo.scale.category10=function(){return Xo.scale.ordinal().range(ps)},Xo.scale.category20=function(){return Xo.scale.ordinal().range(vs)},Xo.scale.category20b=function(){return Xo.scale.ordinal().range(ds)},Xo.scale.category20c=function(){return Xo.scale.ordinal().range(ms)};var ps=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ht),vs=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ht),ds=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ht),ms=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ht);Xo.scale.quantile=function(){return Gi([],[]) -},Xo.scale.quantize=function(){return Ki(0,1,[0,1])},Xo.scale.threshold=function(){return Qi([.5],[0,1])},Xo.scale.identity=function(){return no([0,1])},Xo.svg={},Xo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ys,a=u.apply(this,arguments)+ys,c=(o>a&&(c=o,o=a,a=c),a-o),s=Sa>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=xs?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=to,e=eo,r=ro,u=uo;return n.innerRadius=function(e){return arguments.length?(t=_t(e),n):t},n.outerRadius=function(t){return arguments.length?(e=_t(t),n):e},n.startAngle=function(t){return arguments.length?(r=_t(t),n):r},n.endAngle=function(t){return arguments.length?(u=_t(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ys;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ys=-Ea,xs=ka-Aa;Xo.svg.line=function(){return io(bt)};var Ms=Xo.map({linear:oo,"linear-closed":ao,step:co,"step-before":so,"step-after":lo,basis:mo,"basis-open":yo,"basis-closed":xo,bundle:Mo,cardinal:go,"cardinal-open":fo,"cardinal-closed":ho,monotone:Eo});Ms.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var _s=[0,2/3,1/3,0],bs=[0,1/3,2/3,0],ws=[0,1/6,2/3,1/6];Xo.svg.line.radial=function(){var n=io(Ao);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},so.reverse=lo,lo.reverse=so,Xo.svg.area=function(){return Co(bt)},Xo.svg.area.radial=function(){var n=Co(Ao);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Xo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ys,l=s.call(n,u,r)+ys;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Sa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=hr,o=gr,a=No,c=ro,s=uo;return n.radius=function(t){return arguments.length?(a=_t(t),n):a},n.source=function(t){return arguments.length?(i=_t(t),n):i},n.target=function(t){return arguments.length?(o=_t(t),n):o},n.startAngle=function(t){return arguments.length?(c=_t(t),n):c},n.endAngle=function(t){return arguments.length?(s=_t(t),n):s},n},Xo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=hr,e=gr,r=Lo;return n.source=function(e){return arguments.length?(t=_t(e),n):t},n.target=function(t){return arguments.length?(e=_t(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Xo.svg.diagonal.radial=function(){var n=Xo.svg.diagonal(),t=Lo,e=n.projection;return n.projection=function(n){return arguments.length?e(zo(t=n)):t},n},Xo.svg.symbol=function(){function n(n,r){return(Ss.get(t.call(this,n,r))||Ro)(e.call(this,n,r))}var t=To,e=qo;return n.type=function(e){return arguments.length?(t=_t(e),n):t},n.size=function(t){return arguments.length?(e=_t(t),n):e},n};var Ss=Xo.map({circle:Ro,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cs)),e=t*Cs;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Xo.svg.symbolTypes=Ss.keys();var ks,Es,As=Math.sqrt(3),Cs=Math.tan(30*Na),Ns=[],Ls=0;Ns.call=da.call,Ns.empty=da.empty,Ns.node=da.node,Ns.size=da.size,Xo.transition=function(n){return arguments.length?ks?n.transition():n:xa.transition()},Xo.transition.prototype=Ns,Ns.select=function(n){var t,e,r,u=this.id,i=[];n=M(n);for(var o=-1,a=this.length;++oi;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Do(u,this.id)},Ns.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):R(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Ns.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Ru:fu,a=Xo.ns.qualify(n);return Po(this,"attr."+n,t,a.local?i:u)},Ns.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Xo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Ns.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Go.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=fu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Po(this,"style."+n,t,u)},Ns.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Go.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Ns.text=function(n){return Po(this,"text",n,Uo)},Ns.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Ns.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Xo.ease.apply(Xo,arguments)),R(this,function(e){e.__transition__[t].ease=n}))},Ns.delay=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Ns.duration=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Ns.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Es,u=ks;ks=e,R(this,function(t,r,u){Es=t.__transition__[e],n.call(t,t.__data__,r,u)}),Es=r,ks=u}else R(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Xo.dispatch("start","end"))).on(n,t)});return this},Ns.transition=function(){for(var n,t,e,r,u=this.id,i=++Ls,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,jo(e,s,i,r)),n.push(e)}return Do(o,i)},Xo.svg.axis=function(){function n(n){n.each(function(){var n,s=Xo.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):bt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Aa),d=Xo.transition(p.exit()).style("opacity",Aa).remove(),m=Xo.transition(p).style("opacity",1),y=Ri(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Xo.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=Ho,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Ho,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Fo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Fo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Xo.scale.linear(),r=zs,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in qs?t+"":zs,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var zs="bottom",qs={top:1,right:1,bottom:1,left:1};Xo.svg.brush=function(){function n(i){i.each(function(){var i=Xo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,bt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return Ts[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=Xo.transition(i),h=Xo.transition(o);c&&(l=Ri(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=Ri(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Xo.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=f[1],C=2),d())}function p(){32==Xo.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=f[1],C=0,d())}function v(){var n=Xo.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(Xo.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),L[0]=l[+(n[0]p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function y(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Xo.select("body").style("cursor",null),z.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=Xo.select(Xo.event.target),w=a.of(_,arguments),S=Xo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=O(),L=Xo.mouse(_),z=Xo.select(Go).on("keydown.brush",u).on("keyup.brush",p);if(Xo.event.changedTouches?z.on("touchmove.brush",v).on("touchend.brush",y):z.on("mousemove.brush",v).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=f[0]-L[1];else if(k){var q=+/w$/.test(k),T=+/^n/.test(k);M=[l[1-q]-L[0],f[1-T]-L[1]],L[0]=l[q],L[1]=f[T]}else Xo.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Xo.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=y(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=Rs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,ks?Xo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=hu(l,t.x),r=hu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Rs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=Rs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&&(g=!!t),n):c&&s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),s&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(h=u,u=a,a=h))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&f[0]==f[1]},Xo.rebind(n,a,"on")};var Ts={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Rs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Ds=tc.format=ac.timeFormat,Ps=Ds.utc,Us=Ps("%Y-%m-%dT%H:%M:%S.%LZ");Ds.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:Us,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=Us.toString,tc.second=Rt(function(n){return new ec(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),tc.seconds=tc.second.range,tc.seconds.utc=tc.second.utc.range,tc.minute=Rt(function(n){return new ec(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),tc.minutes=tc.minute.range,tc.minutes.utc=tc.minute.utc.range,tc.hour=Rt(function(n){var t=n.getTimezoneOffset()/60;return new ec(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),tc.hours=tc.hour.range,tc.hours.utc=tc.hour.utc.range,tc.month=Rt(function(n){return n=tc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),tc.months=tc.month.range,tc.months.utc=tc.month.utc.range;var js=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Hs=[[tc.second,1],[tc.second,5],[tc.second,15],[tc.second,30],[tc.minute,1],[tc.minute,5],[tc.minute,15],[tc.minute,30],[tc.hour,1],[tc.hour,3],[tc.hour,6],[tc.hour,12],[tc.day,1],[tc.day,2],[tc.week,1],[tc.month,1],[tc.month,3],[tc.year,1]],Fs=Ds.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",be]]),Os={range:function(n,t,e){return Xo.range(+n,+t,e).map(Io)},floor:bt,ceil:bt};Hs.year=tc.year,tc.scale=function(){return Yo(Xo.scale.linear(),Hs,Fs)};var Ys=Hs.map(function(n){return[n[0].utc,n[1]]}),Is=Ps.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",be]]);Ys.year=tc.year.utc,tc.scale.utc=function(){return Yo(Xo.scale.linear(),Ys,Is)},Xo.text=wt(function(n){return n.responseText}),Xo.json=function(n,t){return St(n,"application/json",Zo,t)},Xo.html=function(n,t){return St(n,"text/html",Vo,t)},Xo.xml=wt(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Xo):"object"==typeof module&&module.exports?module.exports=Xo:this.d3=Xo}(); \ No newline at end of file diff --git a/beer_contracts_with_stubs/js/dracula.min.js b/beer_contracts_with_stubs/js/dracula.min.js deleted file mode 100644 index 43310d460..000000000 --- a/beer_contracts_with_stubs/js/dracula.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Dracula=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o=lower?number:lower}}return number}module.exports=baseClamp},{}],34:[function(require,module,exports){var baseForOwn=require("./_baseForOwn"),createBaseEach=require("./_createBaseEach");var baseEach=createBaseEach(baseForOwn);module.exports=baseEach},{"./_baseForOwn":41,"./_createBaseEach":87}],35:[function(require,module,exports){var baseForOwnRight=require("./_baseForOwnRight"),createBaseEach=require("./_createBaseEach");var baseEachRight=createBaseEach(baseForOwnRight,true);module.exports=baseEachRight},{"./_baseForOwnRight":42,"./_createBaseEach":87}],36:[function(require,module,exports){var baseEach=require("./_baseEach");function baseEvery(collection,predicate){var result=true;baseEach(collection,function(value,index,collection){result=!!predicate(value,index,collection);return result});return result}module.exports=baseEvery},{"./_baseEach":34}],37:[function(require,module,exports){var baseEach=require("./_baseEach");function baseFilter(collection,predicate){var result=[];baseEach(collection,function(value,index,collection){if(predicate(value,index,collection)){result.push(value)}});return result}module.exports=baseFilter},{"./_baseEach":34}],38:[function(require,module,exports){function baseFindIndex(array,predicate,fromIndex,fromRight){var length=array.length,index=fromIndex+(fromRight?1:-1);while(fromRight?index--:++index0&&predicate(value)){if(depth>1){baseFlatten(value,depth-1,predicate,isStrict,result)}else{arrayPush(result,value)}}else if(!isStrict){result[result.length]=value}}return result}module.exports=baseFlatten},{"./_arrayPush":22,"./_isFlattenable":110}],40:[function(require,module,exports){var createBaseFor=require("./_createBaseFor");var baseFor=createBaseFor();module.exports=baseFor},{"./_createBaseFor":88}],41:[function(require,module,exports){var baseFor=require("./_baseFor"),keys=require("./keys");function baseForOwn(object,iteratee){return object&&baseFor(object,iteratee,keys)}module.exports=baseForOwn},{"./_baseFor":40,"./keys":191}],42:[function(require,module,exports){var baseForRight=require("./_baseForRight"),keys=require("./keys");function baseForOwnRight(object,iteratee){return object&&baseForRight(object,iteratee,keys)}module.exports=baseForOwnRight},{"./_baseForRight":43,"./keys":191}],43:[function(require,module,exports){var createBaseFor=require("./_createBaseFor");var baseForRight=createBaseFor(true);module.exports=baseForRight},{"./_createBaseFor":88}],44:[function(require,module,exports){var castPath=require("./_castPath"),toKey=require("./_toKey");function baseGet(object,path){path=castPath(path,object);var index=0,length=path.length;while(object!=null&&indexlength?0:length+start}end=end>length?length:end;if(end<0){end+=length}length=start>end?0:end-start>>>0;start>>>=0;var result=Array(length);while(++indexother||valIsSymbol&&othIsDefined&&othIsReflexive&&!othIsNull&&!othIsSymbol||valIsNull&&othIsDefined&&othIsReflexive||!valIsDefined&&othIsReflexive||!valIsReflexive){return 1}if(!valIsNull&&!valIsSymbol&&!othIsSymbol&&value=ordersLength){return result}var order=orders[index];return result*(order=="desc"?-1:1)}}return object.index-other.index}module.exports=compareMultiple},{"./_compareAscending":82}],84:[function(require,module,exports){function copyArray(source,array){var index=-1,length=source.length;array||(array=Array(length));while(++index-1?iterable[iteratee?collection[index]:index]:undefined}}module.exports=createFind},{"./_baseIteratee":57,"./isArrayLike":181,"./keys":191}],90:[function(require,module,exports){var getNative=require("./_getNative");var defineProperty=function(){try{var func=getNative(Object,"defineProperty");func({},"",{});return func}catch(e){}}();module.exports=defineProperty},{"./_getNative":98}],91:[function(require,module,exports){var SetCache=require("./_SetCache"),arraySome=require("./_arraySome"),cacheHas=require("./_cacheHas");var COMPARE_PARTIAL_FLAG=1,COMPARE_UNORDERED_FLAG=2;function equalArrays(array,other,bitmask,customizer,equalFunc,stack){var isPartial=bitmask&COMPARE_PARTIAL_FLAG,arrLength=array.length,othLength=other.length;if(arrLength!=othLength&&!(isPartial&&othLength>arrLength)){return false}var stacked=stack.get(array);if(stacked&&stack.get(other)){return stacked==other}var index=-1,result=true,seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache:undefined;stack.set(array,other);stack.set(other,array);while(++index-1&&value%1==0&&value-1}module.exports=listCacheHas},{"./_assocIndexOf":30}],122:[function(require,module,exports){var assocIndexOf=require("./_assocIndexOf");function listCacheSet(key,value){var data=this.__data__,index=assocIndexOf(data,key);if(index<0){++this.size;data.push([key,value])}else{data[index][1]=value}return this}module.exports=listCacheSet},{"./_assocIndexOf":30}],123:[function(require,module,exports){var Hash=require("./_Hash"),ListCache=require("./_ListCache"),Map=require("./_Map");function mapCacheClear(){this.size=0;this.__data__={hash:new Hash,map:new(Map||ListCache),string:new Hash}}module.exports=mapCacheClear},{"./_Hash":3,"./_ListCache":4,"./_Map":5}],124:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheDelete(key){var result=getMapData(this,key)["delete"](key);this.size-=result?1:0;return result}module.exports=mapCacheDelete},{"./_getMapData":96}],125:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheGet(key){return getMapData(this,key).get(key)}module.exports=mapCacheGet},{"./_getMapData":96}],126:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheHas(key){return getMapData(this,key).has(key)}module.exports=mapCacheHas},{"./_getMapData":96}],127:[function(require,module,exports){var getMapData=require("./_getMapData");function mapCacheSet(key,value){var data=getMapData(this,key),size=data.size;data.set(key,value);this.size+=data.size==size?0:1;return this}module.exports=mapCacheSet},{"./_getMapData":96}],128:[function(require,module,exports){function mapToArray(map){var index=-1,result=Array(map.size);map.forEach(function(value,key){result[++index]=[key,value]});return result}module.exports=mapToArray},{}],129:[function(require,module,exports){function matchesStrictComparable(key,srcValue){return function(object){if(object==null){return false}return object[key]===srcValue&&(srcValue!==undefined||key in Object(object))}}module.exports=matchesStrictComparable},{}],130:[function(require,module,exports){var memoize=require("./memoize");var MAX_MEMOIZE_SIZE=500;function memoizeCapped(func){var result=memoize(func,function(key){if(cache.size===MAX_MEMOIZE_SIZE){cache.clear()}return key});var cache=result.cache;return result}module.exports=memoizeCapped},{"./memoize":194}],131:[function(require,module,exports){var getNative=require("./_getNative");var nativeCreate=getNative(Object,"create");module.exports=nativeCreate},{"./_getNative":98}],132:[function(require,module,exports){var overArg=require("./_overArg");var nativeKeys=overArg(Object.keys,Object);module.exports=nativeKeys},{"./_overArg":135}],133:[function(require,module,exports){var freeGlobal=require("./_freeGlobal");var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module;var moduleExports=freeModule&&freeModule.exports===freeExports;var freeProcess=moduleExports&&freeGlobal.process;var nodeUtil=function(){try{return freeProcess&&freeProcess.binding&&freeProcess.binding("util")}catch(e){}}();module.exports=nodeUtil},{"./_freeGlobal":94}],134:[function(require,module,exports){var objectProto=Object.prototype;var nativeObjectToString=objectProto.toString;function objectToString(value){return nativeObjectToString.call(value)}module.exports=objectToString},{}],135:[function(require,module,exports){function overArg(func,transform){return function(arg){return func(transform(arg))}}module.exports=overArg},{}],136:[function(require,module,exports){var apply=require("./_apply");var nativeMax=Math.max;function overRest(func,start,transform){start=nativeMax(start===undefined?func.length-1:start,0);return function(){var args=arguments,index=-1,length=nativeMax(args.length-start,0),array=Array(length);while(++index0){if(++count>=HOT_COUNT){return arguments[0]}}else{count=0}return func.apply(undefined,arguments)}}module.exports=shortOut},{}],144:[function(require,module,exports){var baseRandom=require("./_baseRandom");function shuffleSelf(array,size){var index=-1,length=array.length,lastIndex=length-1;size=size===undefined?length:size;while(++index-1:!!length&&baseIndexOf(collection,value,fromIndex)>-1}module.exports=includes},{"./_baseIndexOf":48,"./isArrayLike":181,"./isString":187,"./toInteger":211,"./values":214}],178:[function(require,module,exports){var apply=require("./_apply"),baseEach=require("./_baseEach"),baseInvoke=require("./_baseInvoke"),baseRest=require("./_baseRest"),isArrayLike=require("./isArrayLike");var invokeMap=baseRest(function(collection,path,args){var index=-1,isFunc=typeof path=="function",result=isArrayLike(collection)?Array(collection.length):[];baseEach(collection,function(value){result[++index]=isFunc?apply(path,value,args):baseInvoke(value,path,args)});return result});module.exports=invokeMap},{"./_apply":14,"./_baseEach":34,"./_baseInvoke":49,"./_baseRest":67,"./isArrayLike":181}],179:[function(require,module,exports){var baseIsArguments=require("./_baseIsArguments"),isObjectLike=require("./isObjectLike");var objectProto=Object.prototype;var hasOwnProperty=objectProto.hasOwnProperty;var propertyIsEnumerable=objectProto.propertyIsEnumerable;var isArguments=baseIsArguments(function(){return arguments}())?baseIsArguments:function(value){return isObjectLike(value)&&hasOwnProperty.call(value,"callee")&&!propertyIsEnumerable.call(value,"callee")};module.exports=isArguments},{"./_baseIsArguments":50,"./isObjectLike":186}],180:[function(require,module,exports){var isArray=Array.isArray;module.exports=isArray},{}],181:[function(require,module,exports){var isFunction=require("./isFunction"),isLength=require("./isLength");function isArrayLike(value){return value!=null&&isLength(value.length)&&!isFunction(value)}module.exports=isArrayLike},{"./isFunction":183,"./isLength":184}],182:[function(require,module,exports){var root=require("./_root"),stubFalse=require("./stubFalse");var freeExports=typeof exports=="object"&&exports&&!exports.nodeType&&exports;var freeModule=freeExports&&typeof module=="object"&&module&&!module.nodeType&&module;var moduleExports=freeModule&&freeModule.exports===freeExports;var Buffer=moduleExports?root.Buffer:undefined;var nativeIsBuffer=Buffer?Buffer.isBuffer:undefined;var isBuffer=nativeIsBuffer||stubFalse;module.exports=isBuffer},{"./_root":138,"./stubFalse":209}],183:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isObject=require("./isObject");var asyncTag="[object AsyncFunction]",funcTag="[object Function]",genTag="[object GeneratorFunction]",proxyTag="[object Proxy]";function isFunction(value){if(!isObject(value)){return false}var tag=baseGetTag(value);return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag}module.exports=isFunction},{"./_baseGetTag":46,"./isObject":185}],184:[function(require,module,exports){var MAX_SAFE_INTEGER=9007199254740991;function isLength(value){return typeof value=="number"&&value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER}module.exports=isLength},{}],185:[function(require,module,exports){function isObject(value){var type=typeof value;return value!=null&&(type=="object"||type=="function")}module.exports=isObject},{}],186:[function(require,module,exports){function isObjectLike(value){return value!=null&&typeof value=="object"}module.exports=isObjectLike},{}],187:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isArray=require("./isArray"),isObjectLike=require("./isObjectLike");var stringTag="[object String]";function isString(value){return typeof value=="string"||!isArray(value)&&isObjectLike(value)&&baseGetTag(value)==stringTag}module.exports=isString},{"./_baseGetTag":46,"./isArray":180,"./isObjectLike":186}],188:[function(require,module,exports){var baseGetTag=require("./_baseGetTag"),isObjectLike=require("./isObjectLike");var symbolTag="[object Symbol]";function isSymbol(value){return typeof value=="symbol"||isObjectLike(value)&&baseGetTag(value)==symbolTag}module.exports=isSymbol},{"./_baseGetTag":46,"./isObjectLike":186}],189:[function(require,module,exports){var baseIsTypedArray=require("./_baseIsTypedArray"),baseUnary=require("./_baseUnary"),nodeUtil=require("./_nodeUtil");var nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;module.exports=isTypedArray},{"./_baseIsTypedArray":56,"./_baseUnary":77,"./_nodeUtil":133}],190:[function(require,module,exports){var baseAssignValue=require("./_baseAssignValue"),createAggregator=require("./_createAggregator");var keyBy=createAggregator(function(result,value,key){baseAssignValue(result,key,value)});module.exports=keyBy},{"./_baseAssignValue":32,"./_createAggregator":86}],191:[function(require,module,exports){var arrayLikeKeys=require("./_arrayLikeKeys"),baseKeys=require("./_baseKeys"),isArrayLike=require("./isArrayLike");function keys(object){return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object)}module.exports=keys},{"./_arrayLikeKeys":20,"./_baseKeys":58,"./isArrayLike":181}],192:[function(require,module,exports){function last(array){var length=array==null?0:array.length;return length?array[length-1]:undefined}module.exports=last},{}],193:[function(require,module,exports){var arrayMap=require("./_arrayMap"),baseIteratee=require("./_baseIteratee"),baseMap=require("./_baseMap"),isArray=require("./isArray");function map(collection,iteratee){var func=isArray(collection)?arrayMap:baseMap;return func(collection,baseIteratee(iteratee,3))}module.exports=map},{"./_arrayMap":21,"./_baseIteratee":57,"./_baseMap":59,"./isArray":180}],194:[function(require,module,exports){var MapCache=require("./_MapCache");var FUNC_ERROR_TEXT="Expected a function";function memoize(func,resolver){if(typeof func!="function"||resolver!=null&&typeof resolver!="function"){throw new TypeError(FUNC_ERROR_TEXT)}var memoized=function(){var args=arguments,key=resolver?resolver.apply(this,args):args[0],cache=memoized.cache;if(cache.has(key)){return cache.get(key)}var result=func.apply(this,args);memoized.cache=cache.set(key,result)||cache;return result};memoized.cache=new(memoize.Cache||MapCache);return memoized}memoize.Cache=MapCache;module.exports=memoize},{"./_MapCache":6}],195:[function(require,module,exports){var FUNC_ERROR_TEXT="Expected a function";function negate(predicate){if(typeof predicate!="function"){throw new TypeError(FUNC_ERROR_TEXT)}return function(){var args=arguments;switch(args.length){case 0:return!predicate.call(this);case 1:return!predicate.call(this,args[0]);case 2:return!predicate.call(this,args[0],args[1]);case 3:return!predicate.call(this,args[0],args[1],args[2])}return!predicate.apply(this,args)}}module.exports=negate},{}],196:[function(require,module,exports){var baseOrderBy=require("./_baseOrderBy"),isArray=require("./isArray");function orderBy(collection,iteratees,orders,guard){if(collection==null){return[]}if(!isArray(iteratees)){iteratees=iteratees==null?[]:[iteratees]}orders=guard?undefined:orders;if(!isArray(orders)){orders=orders==null?[]:[orders]}return baseOrderBy(collection,iteratees,orders)}module.exports=orderBy},{"./_baseOrderBy":62,"./isArray":180}],197:[function(require,module,exports){var createAggregator=require("./_createAggregator");var partition=createAggregator(function(result,value,key){result[key?0:1].push(value)},function(){return[[],[]]});module.exports=partition},{"./_createAggregator":86}],198:[function(require,module,exports){var baseProperty=require("./_baseProperty"),basePropertyDeep=require("./_basePropertyDeep"),isKey=require("./_isKey"),toKey=require("./_toKey");function property(path){return isKey(path)?baseProperty(toKey(path)):basePropertyDeep(path)}module.exports=property},{"./_baseProperty":63,"./_basePropertyDeep":64,"./_isKey":113,"./_toKey":153}],199:[function(require,module,exports){var arrayReduce=require("./_arrayReduce"),baseEach=require("./_baseEach"),baseIteratee=require("./_baseIteratee"),baseReduce=require("./_baseReduce"),isArray=require("./isArray");function reduce(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduce:baseReduce,initAccum=arguments.length<3;return func(collection,baseIteratee(iteratee,4),accumulator,initAccum,baseEach)}module.exports=reduce},{"./_arrayReduce":23,"./_baseEach":34,"./_baseIteratee":57,"./_baseReduce":66,"./isArray":180}],200:[function(require,module,exports){var arrayReduceRight=require("./_arrayReduceRight"),baseEachRight=require("./_baseEachRight"),baseIteratee=require("./_baseIteratee"),baseReduce=require("./_baseReduce"),isArray=require("./isArray");function reduceRight(collection,iteratee,accumulator){var func=isArray(collection)?arrayReduceRight:baseReduce,initAccum=arguments.length<3;return func(collection,baseIteratee(iteratee,4),accumulator,initAccum,baseEachRight)}module.exports=reduceRight},{"./_arrayReduceRight":24,"./_baseEachRight":35,"./_baseIteratee":57,"./_baseReduce":66,"./isArray":180}],201:[function(require,module,exports){var arrayFilter=require("./_arrayFilter"),baseFilter=require("./_baseFilter"),baseIteratee=require("./_baseIteratee"),isArray=require("./isArray"),negate=require("./negate");function reject(collection,predicate){var func=isArray(collection)?arrayFilter:baseFilter;return func(collection,negate(baseIteratee(predicate,3)))}module.exports=reject},{"./_arrayFilter":19,"./_baseFilter":37,"./_baseIteratee":57,"./isArray":180,"./negate":195}],202:[function(require,module,exports){var arraySample=require("./_arraySample"),baseSample=require("./_baseSample"),isArray=require("./isArray");function sample(collection){var func=isArray(collection)?arraySample:baseSample;return func(collection)}module.exports=sample},{"./_arraySample":25,"./_baseSample":68,"./isArray":180}],203:[function(require,module,exports){var arraySampleSize=require("./_arraySampleSize"),baseSampleSize=require("./_baseSampleSize"),isArray=require("./isArray"),isIterateeCall=require("./_isIterateeCall"),toInteger=require("./toInteger");function sampleSize(collection,n,guard){if(guard?isIterateeCall(collection,n,guard):n===undefined){n=1}else{n=toInteger(n)}var func=isArray(collection)?arraySampleSize:baseSampleSize;return func(collection,n)}module.exports=sampleSize},{"./_arraySampleSize":26,"./_baseSampleSize":69,"./_isIterateeCall":112,"./isArray":180,"./toInteger":211}],204:[function(require,module,exports){var arrayShuffle=require("./_arrayShuffle"),baseShuffle=require("./_baseShuffle"),isArray=require("./isArray");function shuffle(collection){var func=isArray(collection)?arrayShuffle:baseShuffle;return func(collection)}module.exports=shuffle},{"./_arrayShuffle":27,"./_baseShuffle":71,"./isArray":180}],205:[function(require,module,exports){var baseKeys=require("./_baseKeys"),getTag=require("./_getTag"),isArrayLike=require("./isArrayLike"),isString=require("./isString"),stringSize=require("./_stringSize");var mapTag="[object Map]",setTag="[object Set]";function size(collection){if(collection==null){return 0}if(isArrayLike(collection)){return isString(collection)?stringSize(collection):collection.length}var tag=getTag(collection);if(tag==mapTag||tag==setTag){return collection.size}return baseKeys(collection).length}module.exports=size},{"./_baseKeys":58,"./_getTag":101,"./_stringSize":151,"./isArrayLike":181,"./isString":187}],206:[function(require,module,exports){var arraySome=require("./_arraySome"),baseIteratee=require("./_baseIteratee"),baseSome=require("./_baseSome"),isArray=require("./isArray"),isIterateeCall=require("./_isIterateeCall");function some(collection,predicate,guard){var func=isArray(collection)?arraySome:baseSome;if(guard&&isIterateeCall(collection,predicate,guard)){predicate=undefined}return func(collection,baseIteratee(predicate,3))}module.exports=some},{"./_arraySome":28,"./_baseIteratee":57,"./_baseSome":73,"./_isIterateeCall":112,"./isArray":180}],207:[function(require,module,exports){var baseFlatten=require("./_baseFlatten"),baseOrderBy=require("./_baseOrderBy"),baseRest=require("./_baseRest"),isIterateeCall=require("./_isIterateeCall");var sortBy=baseRest(function(collection,iteratees){if(collection==null){return[]}var length=iteratees.length;if(length>1&&isIterateeCall(collection,iteratees[0],iteratees[1])){iteratees=[]}else if(length>2&&isIterateeCall(iteratees[0],iteratees[1],iteratees[2])){iteratees=[iteratees[0]]}return baseOrderBy(collection,baseFlatten(iteratees,1),[])});module.exports=sortBy},{"./_baseFlatten":39,"./_baseOrderBy":62,"./_baseRest":67,"./_isIterateeCall":112}],208:[function(require,module,exports){function stubArray(){return[]}module.exports=stubArray},{}],209:[function(require,module,exports){function stubFalse(){return false}module.exports=stubFalse},{}],210:[function(require,module,exports){var toNumber=require("./toNumber");var INFINITY=1/0,MAX_INTEGER=1.7976931348623157e308;function toFinite(value){if(!value){return value===0?value:0}value=toNumber(value);if(value===INFINITY||value===-INFINITY){var sign=value<0?-1:1;return sign*MAX_INTEGER}return value===value?value:0}module.exports=toFinite},{"./toNumber":212}],211:[function(require,module,exports){var toFinite=require("./toFinite");function toInteger(value){var result=toFinite(value),remainder=result%1;return result===result?remainder?result-remainder:result:0}module.exports=toInteger},{"./toFinite":210}],212:[function(require,module,exports){var isObject=require("./isObject"),isSymbol=require("./isSymbol");var NAN=0/0;var reTrim=/^\s+|\s+$/g;var reIsBadHex=/^[-+]0x[0-9a-f]+$/i;var reIsBinary=/^0b[01]+$/i;var reIsOctal=/^0o[0-7]+$/i;var freeParseInt=parseInt;function toNumber(value){if(typeof value=="number"){return value}if(isSymbol(value)){return NAN}if(isObject(value)){var other=typeof value.valueOf=="function"?value.valueOf():value;value=isObject(other)?other+"":other}if(typeof value!="string"){return value===0?value:+value}value=value.replace(reTrim,"");var isBinary=reIsBinary.test(value);return isBinary||reIsOctal.test(value)?freeParseInt(value.slice(2),isBinary?2:8):reIsBadHex.test(value)?NAN:+value}module.exports=toNumber},{"./isObject":185,"./isSymbol":188}],213:[function(require,module,exports){var baseToString=require("./_baseToString");function toString(value){return value==null?"":baseToString(value)}module.exports=toString},{"./_baseToString":76}],214:[function(require,module,exports){var baseValues=require("./_baseValues"),keys=require("./keys");function values(object){return object==null?[]:baseValues(object,keys(object))}module.exports=values},{"./_baseValues":78,"./keys":191}],215:[function(require,module,exports){var v1=require("./v1");var v4=require("./v4");var uuid=v4;uuid.v1=v1;uuid.v4=v4;module.exports=uuid},{"./v1":218,"./v4":219}],216:[function(require,module,exports){var byteToHex=[];for(var i=0;i<256;++i){byteToHex[i]=(i+256).toString(16).substr(1)}function bytesToUuid(buf,offset){var i=offset||0;var bth=byteToHex;return bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+"-"+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]+bth[buf[i++]]}module.exports=bytesToUuid},{}],217:[function(require,module,exports){(function(global){var rng;var crypto=global.crypto||global.msCrypto;if(crypto&&crypto.getRandomValues){var rnds8=new Uint8Array(16);rng=function whatwgRNG(){crypto.getRandomValues(rnds8);return rnds8}}if(!rng){var rnds=new Array(16);rng=function(){for(var i=0,r;i<16;i++){if((i&3)===0)r=Math.random()*4294967296;rnds[i]=r>>>((i&3)<<3)&255}return rnds}}module.exports=rng}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],218:[function(require,module,exports){var rng=require("./lib/rng");var bytesToUuid=require("./lib/bytesToUuid");var _seedBytes=rng();var _nodeId=[_seedBytes[0]|1,_seedBytes[1],_seedBytes[2],_seedBytes[3],_seedBytes[4],_seedBytes[5]];var _clockseq=(_seedBytes[6]<<8|_seedBytes[7])&16383;var _lastMSecs=0,_lastNSecs=0;function v1(options,buf,offset){var i=buf&&offset||0;var b=buf||[];options=options||{};var clockseq=options.clockseq!==undefined?options.clockseq:_clockseq;var msecs=options.msecs!==undefined?options.msecs:(new Date).getTime();var nsecs=options.nsecs!==undefined?options.nsecs:_lastNSecs+1;var dt=msecs-_lastMSecs+(nsecs-_lastNSecs)/1e4;if(dt<0&&options.clockseq===undefined){clockseq=clockseq+1&16383}if((dt<0||msecs>_lastMSecs)&&options.nsecs===undefined){nsecs=0}if(nsecs>=1e4){throw new Error("uuid.v1(): Can't create more than 10M uuids/sec")}_lastMSecs=msecs;_lastNSecs=nsecs;_clockseq=clockseq;msecs+=122192928e5;var tl=((msecs&268435455)*1e4+nsecs)%4294967296;b[i++]=tl>>>24&255;b[i++]=tl>>>16&255;b[i++]=tl>>>8&255;b[i++]=tl&255;var tmh=msecs/4294967296*1e4&268435455;b[i++]=tmh>>>8&255;b[i++]=tmh&255;b[i++]=tmh>>>24&15|16;b[i++]=tmh>>>16&255;b[i++]=clockseq>>>8|128;b[i++]=clockseq&255;var node=options.node||_nodeId;for(var n=0;n<6;++n){b[i+n]=node[n]}return buf?buf:bytesToUuid(b)}module.exports=v1},{"./lib/bytesToUuid":216,"./lib/rng":217}],219:[function(require,module,exports){var rng=require("./lib/rng");var bytesToUuid=require("./lib/bytesToUuid");function v4(options,buf,offset){var i=buf&&offset||0;if(typeof options=="string"){buf=options=="binary"?new Array(16):null;options=null}options=options||{};var rnds=options.random||(options.rng||rng)();rnds[6]=rnds[6]&15|64;rnds[8]=rnds[8]&63|128;if(buf){for(var ii=0;ii<16;++ii){buf[i+ii]=rnds[ii]}}return buf||bytesToUuid(rnds)}module.exports=v4},{"./lib/bytesToUuid":216,"./lib/rng":217}],220:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i2&&arguments[2]!==undefined?arguments[2]:{};var source=this.addNode(sourceNode);var target=this.addNode(targetNode);var style=opts.style||opts;var edge={style:style,source:source,target:target};this.edges.push(edge);source.edges.push(edge);target.edges.push(edge);return edge}},{key:"removeNode",value:function removeNode(node){var _this=this;var id=isId(node)?node:node.id;node=this.nodes[id];delete this.nodes[id];this.edges.forEach(function(edge){if(edge.source===node||edge.target===node){_this.removeEdge(edge)}});return node}},{key:"removeEdge",value:function removeEdge(source,target){var found=void 0;if(!target){target=source.target;source=source.source}if(isId(source))source={id:source};if(isId(target))target={id:target};this.edges=this.edges.filter(function(edge){if(edge.source.id===source.id&&edge.target.id===target.id){found=edge;return false}return true});if(found){found.source.edges=found.source.edges.filter(function(edge){return edge!==found});found.target.edges=found.target.edges.filter(function(edge){return edge!==found})}return found}},{key:"toJSON",value:function toJSON(){return{nodes:this.nodes,edges:this.edges}}}],[{key:"create",value:function create(){return new Dracula}}]);return Dracula}();exports.default=Dracula},{uuid:215}],221:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;imaxx)maxx=x;if(xmaxy)maxy=y;if(ymax)xmove=max;if(xmove<-max)xmove=-max;if(ymove>max)ymove=max;if(ymove<-max)ymove=-max;node.layoutPosX+=xmove;node.layoutPosY+=ymove;node.layoutForceX=0;node.layoutForceY=0})}},{key:"layoutRepulsive",value:function layoutRepulsive(node1,node2){if(!node1||!node2){return}var dx=node2.layoutPosX-node1.layoutPosX;var dy=node2.layoutPosY-node1.layoutPosY;var d2=dx*dx+dy*dy;if(d2<.01){dx=.1*Math.random()+.1;dy=.1*Math.random()+.1;d2=dx*dx+dy*dy}var d=Math.sqrt(d2);if(dthis.maxRepulsiveForceDistance){d=this.maxRepulsiveForceDistance;d2=d*d}var attractiveForce=(d2-this.k*this.k)/this.k;if(!edge.attraction)edge.attraction=1;attractiveForce*=Math.log(edge.attraction)*.5+1;node2.layoutForceX-=attractiveForce*dx/d;node2.layoutForceY-=attractiveForce*dy/d;node1.layoutForceX+=attractiveForce*dx/d;node1.layoutForceY+=attractiveForce*dy/d}}],[{key:"create",value:function create(){for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}return new(Function.prototype.bind.apply(this,[null].concat(args)))}}]);return Spring}(_layout2.default);exports.default=Spring},{"./layout":221,"lodash/collection":156}],224:[function(require,module,exports){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;ir.width-20?newX-r.width+20:0);var clientY=y-(newY<20?newY-20:newY>r.height-20?newY-r.height+20:0);this.set.translate(clientX-Math.round(dx),clientY-Math.round(dy));shape.connections.forEach(function(connection){connection.draw()});this.set.ox=clientX;this.set.oy=clientY},function dragEnter(x,y){this.set.ox=x;this.set.oy=y;this.animate({"fill-opacity":.2},500)},function dragOut(){this.animate({"fill-opacity":0},500)})})};var RaphaelRenderer=function(_Renderer){_inherits(RaphaelRenderer,_Renderer);function RaphaelRenderer(element,graph,width,height){_classCallCheck(this,RaphaelRenderer);var _this=_possibleConstructorReturn(this,(RaphaelRenderer.__proto__||Object.getPrototypeOf(RaphaelRenderer)).call(this,element,graph,width,height));_this.canvas=Raphael(_this.element,_this.width,_this.height);_this.lineStyle={stroke:"#443399","stroke-width":"2px"};return _this}_createClass(RaphaelRenderer,[{key:"drawNode",value:function drawNode(node){var color=Raphael.getColor();if(node.render){node.shape=node.render(this.canvas,node)}else{node.shape=this.canvas.set();node.shape.push(this.canvas.ellipse(0,0,30,20).attr({stroke:color,"stroke-width":2,fill:color,"fill-opacity":0})).push(this.canvas.text(0,30,node.label||node.id))}node.shape.translate(node.point[0],node.point[1]);node.shape.connections=[];dragify(node.shape)}},{key:"drawEdge",value:function drawEdge(edge){if(!edge.shape){edge.shape=this.canvas.connection(edge.source.shape,edge.target.shape,edge.style);edge.source.shape.connections.push(edge.shape);edge.target.shape.connections.push(edge.shape)}}}]);return RaphaelRenderer}(_renderer2.default);exports.default=RaphaelRenderer;var getConnectionPoints=function getConnectionPoints(obj1,obj2){var bb1=obj1.getBBox();var bb2=obj2.getBBox();var off1=0;var off2=0;return[{x:bb1.x+bb1.width/2,y:bb1.y-off1},{x:bb1.x+bb1.width/2,y:bb1.y+bb1.height+off1},{x:bb1.x-off1,y:bb1.y+bb1.height/2},{x:bb1.x+bb1.width+off1,y:bb1.y+bb1.height/2},{x:bb2.x+bb2.width/2,y:bb2.y-off2},{x:bb2.x+bb2.width/2,y:bb2.y+bb2.height+off2},{x:bb2.x-off2,y:bb2.y+bb2.height/2},{x:bb2.x+bb2.width+off2,y:bb2.y+bb2.height/2}]};Raphael.fn.connection=function Connection(obj1,obj2,style){var self=this;var edge={draw:function draw(){var p=getConnectionPoints(obj1,obj2);var d={};var dis=[];var dx=void 0;var dy=void 0;for(var i=0;i<4;i++){for(var j=4;j<8;j++){dx=Math.abs(p[i].x-p[j].x);dy=Math.abs(p[i].y-p[j].y);if(i===j-4||(i!==3&&j!==6||p[i].xp[j].x)&&(i!==0&&j!==5||p[i].y>p[j].y)&&(i!==1&&j!==4||p[i].y p[j].x) && ((i != 0 && j != 5) || p[i].y > p[j].y) && ((i != 1 && j != 4) || p[i].y < p[j].y))) { - dis.push(dx + dy); - d[dis[dis.length - 1]] = [i, j]; - } - } - } - var res = dis.length == 0 ? res = [0, 4] : d[Math.min.apply(Math, dis)]; - /* bezier path */ - var x1 = p[res[0]].x, - y1 = p[res[0]].y, - x4 = p[res[1]].x, - y4 = p[res[1]].y, - dx = Math.max(Math.abs(x1 - x4) / 2, 10), - dy = Math.max(Math.abs(y1 - y4) / 2, 10), - x2 = [x1, x1, x1 - dx, x1 + dx][res[0]].toFixed(3), - y2 = [y1 - dy, y1 + dy, y1, y1][res[0]].toFixed(3), - x3 = [0, 0, 0, 0, x4, x4, x4 - dx, x4 + dx][res[1]].toFixed(3), - y3 = [0, 0, 0, 0, y1 + dy, y1 - dy, y4, y4][res[1]].toFixed(3); - /* assemble path and arrow */ - var path = ["M", x1.toFixed(3), y1.toFixed(3), "C", x2, y2, x3, y3, x4.toFixed(3), y4.toFixed(3)].join(","); - /* arrow */ - if(style && style.directed) { - /* magnitude, length of the last path vector */ - var mag = Math.sqrt((y4 - y3) * (y4 - y3) + (x4 - x3) * (x4 - x3)); - /* vector normalisation to specified length */ - var norm = function(x,l){return (-x*(l||5)/mag);}; - /* calculate array coordinates (two lines orthogonal to the path vector) */ - var arr = [ - {x:(norm(x4-x3)+norm(y4-y3)+x4).toFixed(3), y:(norm(y4-y3)+norm(x4-x3)+y4).toFixed(3)}, - {x:(norm(x4-x3)-norm(y4-y3)+x4).toFixed(3), y:(norm(y4-y3)-norm(x4-x3)+y4).toFixed(3)} - ]; - path = path + ",M"+arr[0].x+","+arr[0].y+",L"+x4+","+y4+",L"+arr[1].x+","+arr[1].y; - } - - // applying path - edge.fg && edge.fg.attr({path:path}) - || (edge.fg = selfRef.path(path).attr({stroke: color, fill: "none"}).toBack()); - edge.bg && edge.bg.attr({path:path}) - || style && style.bg && (edge.bg = style.bg.split && selfRef.path(path).attr({stroke: style.bg.split("|")[0], fill: "none", "stroke-width": style.bg.split("|")[1] || 3}).toBack()); - } - } - edge.draw(); - return edge; -}; diff --git a/beer_contracts_with_stubs/js/graph.js b/beer_contracts_with_stubs/js/graph.js deleted file mode 100644 index d0f12db95..000000000 --- a/beer_contracts_with_stubs/js/graph.js +++ /dev/null @@ -1,303 +0,0 @@ -/* Graph JavaScript framework, version 0.0.1 - * (c) 2006 Aslak Hellesoy - * (c) 2006 Dave Hoover - * - * Ported from Graph::Layouter::Spring in - * https://search.cpan.org/~pasky/Graph-Layderer-0.02/ - * The algorithm is based on a spring-style layouter of a Java-based social - * network tracker PieSpy written by Paul Mutton Epaul@jibble.orgE. - * - * Adopted by Philipp Strathausen to support Raphael JS - * for rendering, dragging and much more. See https://blog.ameisenbar.de/ - * - * Graph is freely distributable under the terms of an MIT-style license. - * For details, see the Graph web site: https://dev.buildpatternd.com/trac - * - * Links: - * - * Demo of the original applet: - * https://redsquirrel.com/dave/work/webdep/ - * - * Mirrored original source code at snipplr: - * https://snipplr.com/view/1950/graph-javascript-framework-version-001/ - * - * Original usage example: - * http://ajaxian.com/archives/new-javascriptcanvas-graph-library - * -/*--------------------------------------------------------------------------*/ - -/* - * Graph - */ -var Graph = function() { - this.nodes = []; - this.edges = []; -}; -Graph.prototype = { - addNode: function(id, content) { - /* testing if node is already existing in the graph */ - var new_node = this.nodes[id]; - if(new_node == undefined) { - new_node = new Graph.Node(id, content||{"id":id}); - this.nodes[id] = new_node; - this.nodes.push(new_node); // TODO get rid of the array - } - return new_node; - }, - - addEdge: function(source, target, style) { - var s = this.addNode(source); - var t = this.addNode(target); - var color; - var colorbg; - var directed; - if(style) { color = style.color; colorbg = style.colorbg; directed = style.directed } - var edge = { source: s, target: t, color: color, colorbg: colorbg, directed: directed }; - this.edges.push(edge); - } -}; - -/* - * Node - */ -Graph.Node = function(id, value){ - this.id = id; - this.content = value; -}; -Graph.Node.prototype = { -}; -Graph.Renderer = {}; -Graph.Renderer.Raphael = function(element, graph, width, height) { - this.width = width||400; - this.height = height||400; - var selfRef = this; - this.r = Raphael(element, this.width, this.height); - this.radius = 40; /* max dimension of a node */ - this.graph = graph; - this.mouse_in = false; - - /* - * Dragging - */ - this.isDrag = false; - this.dragger = function (e) { - this.dx = e.clientX; - this.dy = e.clientY; - selfRef.isDrag = this; - this.animate({"fill-opacity": .2}, 500); - e.preventDefault && e.preventDefault(); - }; - - document.onmousemove = function (e) { - e = e || window.event; - if (selfRef.isDrag) { - var newX = e.clientX - selfRef.isDrag.dx + (selfRef.isDrag.attrs.cx == null ? (selfRef.isDrag.attrs.x + selfRef.isDrag.attrs.width / 2) : selfRef.isDrag.attrs.cx); - var newY = e.clientY - selfRef.isDrag.dy + (selfRef.isDrag.attrs.cy == null ? (selfRef.isDrag.attrs.y + selfRef.isDrag.attrs.height / 2) : selfRef.isDrag.attrs.cy); - /* prevent shapes from being dragged out of the canvas */ - var clientX = e.clientX - (newX < 20 ? newX - 20 : newX > selfRef.width - 20 ? newX - selfRef.width + 20 : 0); - var clientY = e.clientY - (newY < 20 ? newY - 20 : newY > selfRef.height - 20 ? newY - selfRef.height + 20 : 0); - selfRef.isDrag.translate(clientX - selfRef.isDrag.dx, clientY - selfRef.isDrag.dy); - selfRef.isDrag.label.translate(clientX - selfRef.isDrag.dx, clientY - selfRef.isDrag.dy); - for (var i in selfRef.graph.edges) { - selfRef.graph.edges[i].connection.draw(); - } - //selfRef.r.safari(); - selfRef.isDrag.dx = clientX; - selfRef.isDrag.dy = clientY; - } - }; - document.onmouseup = function () { - selfRef.isDrag && selfRef.isDrag.animate({"fill-opacity": 0}, 500); - selfRef.isDrag = false; - }; -}; - -/* - * Renderer using RaphaelJS - */ -Graph.Renderer.Raphael.prototype = { - translate: function(point) { - return [ - (point[0] - this.graph.layoutMinX) * this.factorX + this.radius, - (point[1] - this.graph.layoutMinY) * this.factorY + this.radius - ]; - }, - - rotate: function(point, length, angle) { - var dx = length * Math.cos(angle); - var dy = length * Math.sin(angle); - return [point[0]+dx, point[1]+dy]; - }, - - draw: function() { - this.factorX = (width - 2 * this.radius) / (this.graph.layoutMaxX - this.graph.layoutMinX); - this.factorY = (height - 2 * this.radius) / (this.graph.layoutMaxY - this.graph.layoutMinY); - for (var i = 0; i < this.graph.nodes.length; i++) { - this.drawNode(this.graph.nodes[i]); - } - for (var i = 0; i < this.graph.edges.length; i++) { - this.drawEdge(this.graph.edges[i]); - } - }, - drawNode: function(node) { - var point = this.translate([node.layoutPosX, node.layoutPosY]); - node.point = point; - - /* if node has already been drawn, move the nodes */ - if(node.shape) { -// console.log(node.shape.attrs ); - var opoint = [ node.shape.attrs.cx || node.shape.attrs.x + node.shape.attrs.width / 2 , node.shape.attrs.cy || node.shape.attrs.y + node.shape.attrs.height / 2 + 15 ]; - node.shape.translate(point[0]-opoint[0], point[1]-opoint[1]); - node.shape.label.translate(point[0]-opoint[0], point[1]-opoint[1]); - this.r.safari(); - return; - } - var shape; - if(node.content.getShape) { - shape = node.content.getShape(this.r, point[0], point[1]); - shape.attr({"fill-opacity": 0}); - } else { - shape = this.r.ellipse(point[0], point[1], 30, 20); - var color = Raphael.getColor(); - shape.attr({fill: color, stroke: color, "fill-opacity": 0, "stroke-width": 2}) - } - shape.mousedown(this.dragger); - shape.node.style.cursor = "move"; - shape.label = this.r.text(point[0], point[1] + 30, node.content.label || node.id); // Beware: operator || also considers values like -1, 0, ... - node.shape = shape; - }, - drawEdge: function(edge) { - /* if edge already has been drawn, only refresh the edge */ - edge.connection && edge.connection.draw(); - if(!edge.connection) - edge.connection = this.r.connection(edge.source.shape, edge.target.shape, { fg: edge.color, bg: edge.colorbg, directed: edge.directed }); - } -}; -Graph.Layout = {}; -Graph.Layout.Spring = function(graph) { - this.graph = graph; - this.iterations = 500; - this.maxRepulsiveForceDistance = 6; - this.k = 2; - this.c = 0.01; - this.maxVertexMovement = 0.5; - }; -Graph.Layout.Spring.prototype = { - layout: function() { - this.layoutPrepare(); - for (var i = 0; i < this.iterations; i++) { - this.layoutIteration(); - } - this.layoutCalcBounds(); - }, - - layoutPrepare: function() { - for (var i = 0; i < this.graph.nodes.length; i++) { - var node = this.graph.nodes[i]; - node.layoutPosX = 0; - node.layoutPosY = 0; - node.layoutForceX = 0; - node.layoutForceY = 0; - } - - }, - - layoutCalcBounds: function() { - var minx = Infinity, maxx = -Infinity, miny = Infinity, maxy = -Infinity; - - for (var i = 0; i < this.graph.nodes.length; i++) { - var x = this.graph.nodes[i].layoutPosX; - var y = this.graph.nodes[i].layoutPosY; - - if(x > maxx) maxx = x; - if(x < minx) minx = x; - if(y > maxy) maxy = y; - if(y < miny) miny = y; - } - - this.graph.layoutMinX = minx; - this.graph.layoutMaxX = maxx; - this.graph.layoutMinY = miny; - this.graph.layoutMaxY = maxy; - }, - - layoutIteration: function() { - // Forces on nodes due to node-node repulsions - for (var i = 0; i < this.graph.nodes.length; i++) { - var node1 = this.graph.nodes[i]; - for (var j = i + 1; j < this.graph.nodes.length; j++) { - var node2 = this.graph.nodes[j]; - this.layoutRepulsive(node1, node2); - } - } - // Forces on nodes due to edge attractions - for (var i = 0; i < this.graph.edges.length; i++) { - var edge = this.graph.edges[i]; - this.layoutAttractive(edge); - } - - // Move by the given force - for (var i = 0; i < this.graph.nodes.length; i++) { - var node = this.graph.nodes[i]; - var xmove = this.c * node.layoutForceX; - var ymove = this.c * node.layoutForceY; - - var max = this.maxVertexMovement; - if(xmove > max) xmove = max; - if(xmove < -max) xmove = -max; - if(ymove > max) ymove = max; - if(ymove < -max) ymove = -max; - - node.layoutPosX += xmove; - node.layoutPosY += ymove; - node.layoutForceX = 0; - node.layoutForceY = 0; - } - }, - - layoutRepulsive: function(node1, node2) { - var dx = node2.layoutPosX - node1.layoutPosX; - var dy = node2.layoutPosY - node1.layoutPosY; - var d2 = dx * dx + dy * dy; - if(d2 < 0.01) { - dx = 0.1 * Math.random() + 0.1; - dy = 0.1 * Math.random() + 0.1; - var d2 = dx * dx + dy * dy; - } - var d = Math.sqrt(d2); - if(d < this.maxRepulsiveForceDistance) { - var repulsiveForce = this.k * this.k / d; - node2.layoutForceX += repulsiveForce * dx / d; - node2.layoutForceY += repulsiveForce * dy / d; - node1.layoutForceX -= repulsiveForce * dx / d; - node1.layoutForceY -= repulsiveForce * dy / d; - } - }, - - layoutAttractive: function(edge) { - var node1 = edge.source; - var node2 = edge.target; - - var dx = node2.layoutPosX - node1.layoutPosX; - var dy = node2.layoutPosY - node1.layoutPosY; - var d2 = dx * dx + dy * dy; - if(d2 < 0.01) { - dx = 0.1 * Math.random() + 0.1; - dy = 0.1 * Math.random() + 0.1; - var d2 = dx * dx + dy * dy; - } - var d = Math.sqrt(d2); - if(d > this.maxRepulsiveForceDistance) { - d = this.maxRepulsiveForceDistance; - d2 = d * d; - } - var attractiveForce = (d2 - this.k * this.k) / this.k; - if(edge.weight == undefined || edge.weight < 1) edge.weight = 1; - attractiveForce *= Math.log(edge.weight) * 0.5 + 1; - - node2.layoutForceX -= attractiveForce * dx / d; - node2.layoutForceY -= attractiveForce * dy / d; - node1.layoutForceX += attractiveForce * dx / d; - node1.layoutForceY += attractiveForce * dy / d; - } -}; diff --git a/beer_contracts_with_stubs/js/raphael-min.js b/beer_contracts_with_stubs/js/raphael-min.js deleted file mode 100644 index 7b1ae8584..000000000 --- a/beer_contracts_with_stubs/js/raphael-min.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Raphael 1.3.1 - JavaScript Vector Library - * - * Copyright (c) 2008 - 2009 Dmitry Baranovskiy (https://raphaeljs.com) - * Licensed under the MIT (https://www.opensource.org/licenses/mit-license.php) license. - */ -Raphael=(function(){var a=/[, ]+/,aO=/^(circle|rect|path|ellipse|text|image)$/,L=document,au=window,l={was:"Raphael" in au,is:au.Raphael},an=function(){if(an.is(arguments[0],"array")){var d=arguments[0],e=w[aW](an,d.splice(0,3+an.is(d[0],al))),S=e.set();for(var R=0,a0=d[m];R

";if(ag.childNodes[m]!=2){return null;}}an.svg=!(an.vml=an.type=="VML");aT[aY]=an[aY];an._id=0;an._oid=0;an.fn={};an.is=function(e,d){d=aZ.call(d);return((d=="object"||d=="undefined")&&typeof e==d)||(e==null&&d=="null")||aZ.call(aw.call(e).slice(8,-1))==d;};an.setWindow=function(d){au=d;L=au.document;};var aD=function(e){if(an.vml){var d=/^\s+|\s+$/g;aD=aj(function(R){var S;R=(R+at)[aP](d,at);try{var a0=new ActiveXObject("htmlfile");a0.write("");a0.close();S=a0.body;}catch(a2){S=createPopup().document.body;}var i=S.createTextRange();try{S.style.color=R;var a1=i.queryCommandValue("ForeColor");a1=((a1&255)<<16)|(a1&65280)|((a1&16711680)>>>16);return"#"+("000000"+a1[aA](16)).slice(-6);}catch(a2){return"none";}});}else{var E=L.createElement("i");E.title="Rapha\xebl Colour Picker";E.style.display="none";L.body[aL](E);aD=aj(function(i){E.style.color=i;return L.defaultView.getComputedStyle(E,at).getPropertyValue("color");});}return aD(e);};an.hsb2rgb=aj(function(a3,a1,a7){if(an.is(a3,"object")&&"h" in a3&&"s" in a3&&"b" in a3){a7=a3.b;a1=a3.s;a3=a3.h;}var R,S,a8;if(a7==0){return{r:0,g:0,b:0,hex:"#000"};}if(a3>1||a1>1||a7>1){a3/=255;a1/=255;a7/=255;}var a0=~~(a3*6),a4=(a3*6)-a0,E=a7*(1-a1),e=a7*(1-(a1*a4)),a9=a7*(1-(a1*(1-a4)));R=[a7,e,E,E,a9,a7,a7][a0];S=[a9,a7,a7,e,E,E,a9][a0];a8=[E,E,a9,a7,a7,e,E][a0];R*=255;S*=255;a8*=255;var a5={r:R,g:S,b:a8},d=(~~R)[aA](16),a2=(~~S)[aA](16),a6=(~~a8)[aA](16);d=d[aP](aU,"0");a2=a2[aP](aU,"0");a6=a6[aP](aU,"0");a5.hex="#"+d+a2+a6;return a5;},an);an.rgb2hsb=aj(function(d,e,a1){if(an.is(d,"object")&&"r" in d&&"g" in d&&"b" in d){a1=d.b;e=d.g;d=d.r;}if(an.is(d,"string")){var a3=an.getRGB(d);d=a3.r;e=a3.g;a1=a3.b;}if(d>1||e>1||a1>1){d/=255;e/=255;a1/=255;}var a0=g(d,e,a1),i=aI(d,e,a1),R,E,S=a0;if(i==a0){return{h:0,s:0,b:a0};}else{var a2=(a0-i);E=a2/a0;if(d==a0){R=(e-a1)/a2;}else{if(e==a0){R=2+((a1-d)/a2);}else{R=4+((d-e)/a2);}}R/=6;R<0&&R++;R>1&&R--;}return{h:R,s:E,b:S};},an);var aE=/,?([achlmqrstvxz]),?/gi;an._path2string=function(){return this.join(",")[aP](aE,"$1");};function aj(E,e,d){function i(){var R=Array[aY].slice.call(arguments,0),a0=R[az]("\u25ba"),S=i.cache=i.cache||{},a1=i.count=i.count||[];if(S[Q](a0)){return d?d(S[a0]):S[a0];}a1[m]>=1000&&delete S[a1.shift()];a1[f](a0);S[a0]=E[aW](e,R);return d?d(S[a0]):S[a0];}return i;}an.getRGB=aj(function(d){if(!d||!!((d=d+at).indexOf("-")+1)){return{r:-1,g:-1,b:-1,hex:"none",error:1};}if(d=="none"){return{r:-1,g:-1,b:-1,hex:"none"};}!(({hs:1,rg:1})[Q](d.substring(0,2))||d.charAt()=="#")&&(d=aD(d));var S,i,E,a2,a3,a0=d.match(x);if(a0){if(a0[2]){a2=G(a0[2].substring(5),16);E=G(a0[2].substring(3,5),16);i=G(a0[2].substring(1,3),16);}if(a0[3]){a2=G((a3=a0[3].charAt(3))+a3,16);E=G((a3=a0[3].charAt(2))+a3,16);i=G((a3=a0[3].charAt(1))+a3,16);}if(a0[4]){a0=a0[4][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);}if(a0[5]){a0=a0[5][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;}if(a0[6]){a0=a0[6][z](/\s*,\s*/);i=W(a0[0]);E=W(a0[1]);a2=W(a0[2]);return an.hsb2rgb(i,E,a2);}if(a0[7]){a0=a0[7][z](/\s*,\s*/);i=W(a0[0])*2.55;E=W(a0[1])*2.55;a2=W(a0[2])*2.55;return an.hsb2rgb(i,E,a2);}a0={r:i,g:E,b:a2};var e=(~~i)[aA](16),R=(~~E)[aA](16),a1=(~~a2)[aA](16);e=e[aP](aU,"0");R=R[aP](aU,"0");a1=a1[aP](aU,"0");a0.hex="#"+e+R+a1;return a0;}return{r:-1,g:-1,b:-1,hex:"none",error:1};},an);an.getColor=function(e){var i=this.getColor.start=this.getColor.start||{h:0,s:1,b:e||0.75},d=this.hsb2rgb(i.h,i.s,i.b);i.h+=0.075;if(i.h>1){i.h=0;i.s-=0.2;i.s<=0&&(this.getColor.start={h:0,s:1,b:i.b});}return d.hex;};an.getColor.reset=function(){delete this.start;};an.parsePathString=aj(function(d){if(!d){return null;}var i={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},e=[];if(an.is(d,"array")&&an.is(d[0],"array")){e=av(d);}if(!e[m]){(d+at)[aP](/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,function(R,E,a1){var a0=[],S=aZ.call(E);a1[aP](/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,function(a3,a2){a2&&a0[f](+a2);});while(a0[m]>=i[S]){e[f]([E][aS](a0.splice(0,i[S])));if(!i[S]){break;}}});}e[aA]=an._path2string;return e;});an.findDotsAtSegment=function(e,d,be,bc,a0,R,a2,a1,a8){var a6=1-a8,a5=aM(a6,3)*e+aM(a6,2)*3*a8*be+a6*3*a8*a8*a0+aM(a8,3)*a2,a3=aM(a6,3)*d+aM(a6,2)*3*a8*bc+a6*3*a8*a8*R+aM(a8,3)*a1,ba=e+2*a8*(be-e)+a8*a8*(a0-2*be+e),a9=d+2*a8*(bc-d)+a8*a8*(R-2*bc+d),bd=be+2*a8*(a0-be)+a8*a8*(a2-2*a0+be),bb=bc+2*a8*(R-bc)+a8*a8*(a1-2*R+bc),a7=(1-a8)*e+a8*be,a4=(1-a8)*d+a8*bc,E=(1-a8)*a0+a8*a2,i=(1-a8)*R+a8*a1,S=(90-ab.atan((ba-bd)/(a9-bb))*180/ab.PI);(ba>bd||a91){bi=ab.sqrt(by)*bi;bg=ab.sqrt(by)*bg;}var E=bi*bi,br=bg*bg,bt=(a4==S?-1:1)*ab.sqrt(ab.abs((E*br-E*bn*bn-br*bo*bo)/(E*bn*bn+br*bo*bo))),bd=bt*bi*bn/bg+(a9+a8)/2,bc=bt*-bg*bo/bi+(bE+bD)/2,a3=ab.asin(((bE-bc)/bg).toFixed(7)),a2=ab.asin(((bD-bc)/bg).toFixed(7));a3=a9a2){a3=a3-R*2;}if(!S&&a2>a3){a2=a2-R*2;}}else{a3=bb[0];a2=bb[1];bd=bb[2];bc=bb[3];}var a7=a2-a3;if(ab.abs(a7)>bf){var be=a2,bh=a8,a5=bD;a2=a3+bf*(S&&a2>a3?1:-1);a8=bd+bi*ab.cos(a2);bD=bc+bg*ab.sin(a2);bm=K(a8,bD,bi,bg,ba,0,S,bh,a5,[a2,be,bd,bc]);}a7=a2-a3;var a1=ab.cos(a3),bC=ab.sin(a3),a0=ab.cos(a2),bB=ab.sin(a2),bp=ab.tan(a7/4),bs=4/3*bi*bp,bq=4/3*bg*bp,bz=[a9,bE],bx=[a9+bs*bC,bE-bq*a1],bw=[a8+bs*bB,bD-bq*a0],bu=[a8,bD];bx[0]=2*bz[0]-bx[0];bx[1]=2*bz[1]-bx[1];if(bb){return[bx,bw,bu][aS](bm);}else{bm=[bx,bw,bu][aS](bm)[az]()[z](",");var bk=[];for(var bv=0,bl=bm[m];bv1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}a7=(a8-2*E+d)-(a2-2*a8+E);a4=2*(E-d)-2*(a8-E);a1=d-E;a0=(-a4+ab.sqrt(a4*a4-4*a7*a1))/2/a7;S=(-a4-ab.sqrt(a4*a4-4*a7*a1))/2/a7;ab.abs(a0)>1000000000000&&(a0=0.5);ab.abs(S)>1000000000000&&(S=0.5);if(a0>0&&a0<1){e=M(i,d,R,E,a9,a8,a5,a2,a0);a6[f](e.x);a3[f](e.y);}if(S>0&&S<1){e=M(i,d,R,E,a9,a8,a5,a2,S);a6[f](e.x);a3[f](e.y);}return{min:{x:aI[aW](0,a6),y:aI[aW](0,a3)},max:{x:g[aW](0,a6),y:g[aW](0,a3)}};}),H=aj(function(a9,a4){var R=r(a9),a5=a4&&r(a4),a6={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},d={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},a0=function(ba,bb){var i,bc;if(!ba){return["C",bb.x,bb.y,bb.x,bb.y,bb.x,bb.y];}!(ba[0] in {T:1,Q:1})&&(bb.qx=bb.qy=null);switch(ba[0]){case"M":bb.X=ba[1];bb.Y=ba[2];break;case"A":ba=["C"][aS](K[aW](0,[bb.x,bb.y][aS](ba.slice(1))));break;case"S":i=bb.x+(bb.x-(bb.bx||bb.x));bc=bb.y+(bb.y-(bb.by||bb.y));ba=["C",i,bc][aS](ba.slice(1));break;case"T":bb.qx=bb.x+(bb.x-(bb.qx||bb.x));bb.qy=bb.y+(bb.y-(bb.qy||bb.y));ba=["C"][aS](aK(bb.x,bb.y,bb.qx,bb.qy,ba[1],ba[2]));break;case"Q":bb.qx=ba[1];bb.qy=ba[2];ba=["C"][aS](aK(bb.x,bb.y,ba[1],ba[2],ba[3],ba[4]));break;case"L":ba=["C"][aS](aX(bb.x,bb.y,ba[1],ba[2]));break;case"H":ba=["C"][aS](aX(bb.x,bb.y,ba[1],bb.y));break;case"V":ba=["C"][aS](aX(bb.x,bb.y,bb.x,ba[1]));break;case"Z":ba=["C"][aS](aX(bb.x,bb.y,bb.X,bb.Y));break;}return ba;},e=function(ba,bb){if(ba[bb][m]>7){ba[bb].shift();var bc=ba[bb];while(bc[m]){ba.splice(bb++,0,["C"][aS](bc.splice(0,6)));}ba.splice(bb,1);a7=g(R[m],a5&&a5[m]||0);}},E=function(be,bd,bb,ba,bc){if(be&&bd&&be[bc][0]=="M"&&bd[bc][0]!="M"){bd.splice(bc,0,["M",ba.x,ba.y]);bb.bx=0;bb.by=0;bb.x=be[bc][1];bb.y=be[bc][2];a7=g(R[m],a5&&a5[m]||0);}};for(var a2=0,a7=g(R[m],a5&&a5[m]||0);a23){return{container:1,x:arguments[0],y:arguments[1],width:arguments[2],height:arguments[3]};}}},aG=function(d,i){var e=this;for(var E in i){if(i[Q](E)&&!(E in d)){switch(typeof i[E]){case"function":(function(R){d[E]=d===e?R:function(){return R[aW](e,arguments);};})(i[E]);break;case"object":d[E]=d[E]||{};aG.call(this,d[E],i[E]);break;default:d[E]=i[E];break;}}}},ak=function(d,e){d==e.top&&(e.top=d.prev);d==e.bottom&&(e.bottom=d.next);d.next&&(d.next.prev=d.prev);d.prev&&(d.prev.next=d.next);},Y=function(d,e){if(e.top===d){return;}ak(d,e);d.next=null;d.prev=e.top;e.top.next=d;e.top=d;},k=function(d,e){if(e.bottom===d){return;}ak(d,e);d.next=e.bottom;d.prev=null;e.bottom.prev=d;e.bottom=d;},A=function(e,d,i){ak(e,i);d==i.top&&(i.top=e);d.next&&(d.next.prev=e);e.next=d.next;e.prev=d;d.next=e;},aq=function(e,d,i){ak(e,i);d==i.bottom&&(i.bottom=e);d.prev&&(d.prev.next=e);e.prev=d.prev;d.prev=e;e.next=d;},s=function(d){return function(){throw new Error("Rapha\xebl: you are calling to method \u201c"+d+"\u201d of removed object");};},ar=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/;if(an.svg){aT[aY].svgns="http://www.w3.org/2000/svg";aT[aY].xlink="http://www.w3.org/1999/xlink";var O=function(d){return +d+(~~d===d)*0.5;},V=function(S){for(var e=0,E=S[m];e0.5)*2-1);aM(a1-0.5,2)+aM(S-0.5,2)>0.25&&(S=ab.sqrt(0.25-aM(a1-0.5,2))*ba+0.5)&&S!=0.5&&(S=S.toFixed(5)-0.00001*ba);}return at;});a7=a7[z](/\s*\-\s*/);if(a4=="linear"){var a0=a7.shift();a0=-W(a0);if(isNaN(a0)){return null;}var R=[0,0,ab.cos(a0*ab.PI/180),ab.sin(a0*ab.PI/180)],a6=1/(g(ab.abs(R[2]),ab.abs(R[3]))||1);R[2]*=a6;R[3]*=a6;if(R[2]<0){R[0]=-R[2];R[2]=0;}if(R[3]<0){R[1]=-R[3];R[3]=0;}}var a3=p(a7);if(!a3){return null;}var e=aJ(a4+"Gradient");e.id="r"+(an._id++)[aA](36);aJ(e,a4=="radial"?{fx:a1,fy:S}:{x1:R[0],y1:R[1],x2:R[2],y2:R[3]});d.defs[aL](e);for(var a2=0,a8=a3[m];a2a1.height)&&(a1.height=a0.y+a0.height-a1.y);(a0.x+a0.width-a1.x>a1.width)&&(a1.width=a0.x+a0.width-a1.x);}}E&&this.hide();return a1;};ax[aY].attr=function(){if(this.removed){return this;}if(arguments[m]==0){var R={};for(var E in this.attrs){if(this.attrs[Q](E)){R[E]=this.attrs[E];}}this._.rt.deg&&(R.rotation=this.rotate());(this._.sx!=1||this._.sy!=1)&&(R.scale=this.scale());R.gradient&&R.fill=="none"&&(R.fill=R.gradient)&&delete R.gradient;return R;}if(arguments[m]==1&&an.is(arguments[0],"string")){if(arguments[0]=="translation"){return t.call(this);}if(arguments[0]=="rotation"){return this.rotate();}if(arguments[0]=="scale"){return this.scale();}if(arguments[0]=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient){return this.attrs.gradient;}return this.attrs[arguments[0]];}if(arguments[m]==1&&an.is(arguments[0],"array")){var d={};for(var e in arguments[0]){if(arguments[0][Q](e)){d[arguments[0][e]]=this.attrs[arguments[0][e]];}}return d;}if(arguments[m]==2){var S={};S[arguments[0]]=arguments[1];aa(this,S);}else{if(arguments[m]==1&&an.is(arguments[0],"object")){aa(this,arguments[0]);}}return this;};ax[aY].toFront=function(){if(this.removed){return this;}this.node.parentNode[aL](this.node);var d=this.paper;d.top!=this&&Y(this,d);return this;};ax[aY].toBack=function(){if(this.removed){return this;}if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild);k(this,this.paper);var d=this.paper;}return this;};ax[aY].insertAfter=function(d){if(this.removed){return this;}var e=d.node;if(e.nextSibling){e.parentNode.insertBefore(this.node,e.nextSibling);}else{e.parentNode[aL](this.node);}A(this,d,this.paper);return this;};ax[aY].insertBefore=function(d){if(this.removed){return this;}var e=d.node;e.parentNode.insertBefore(this.node,e);aq(this,d,this.paper);return this;};var P=function(e,d,S,R){d=O(d);S=O(S);var E=aJ("circle");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:S,r:R,fill:"none",stroke:"#000"};i.type="circle";aJ(E,i.attrs);return i;};var aF=function(i,d,a1,e,S,a0){d=O(d);a1=O(a1);var R=aJ("rect");i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,r:a0||0,rx:a0||0,ry:a0||0,fill:"none",stroke:"#000"};E.type="rect";aJ(R,E.attrs);return E;};var ai=function(e,d,a0,S,R){d=O(d);a0=O(a0);var E=aJ("ellipse");e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={cx:d,cy:a0,rx:S,ry:R,fill:"none",stroke:"#000"};i.type="ellipse";aJ(E,i.attrs);return i;};var o=function(i,a0,d,a1,e,S){var R=aJ("image");aJ(R,{x:d,y:a1,width:e,height:S,preserveAspectRatio:"none"});R.setAttributeNS(i.xlink,"href",a0);i.canvas&&i.canvas[aL](R);var E=new ax(R,i);E.attrs={x:d,y:a1,width:e,height:S,src:a0};E.type="image";return E;};var X=function(e,d,S,R){var E=aJ("text");aJ(E,{x:d,y:S,"text-anchor":"middle"});e.canvas&&e.canvas[aL](E);var i=new ax(E,e);i.attrs={x:d,y:S,"text-anchor":"middle",text:R,font:j.font,stroke:"none",fill:"#000"};i.type="text";aa(i,i.attrs);return i;};var aV=function(e,d){this.width=e||this.width;this.height=d||this.height;this.canvas[v]("width",this.width);this.canvas[v]("height",this.height);return this;};var w=function(){var E=ao[aW](null,arguments),i=E&&E.container,e=E.x,a0=E.y,R=E.width,d=E.height;if(!i){throw new Error("SVG container not found.");}var S=aJ("svg");R=R||512;d=d||342;aJ(S,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:R,height:d});if(i==1){S.style.cssText="position:absolute;left:"+e+"px;top:"+a0+"px";L.body[aL](S);}else{if(i.firstChild){i.insertBefore(S,i.firstChild);}else{i[aL](S);}}i=new aT;i.width=R;i.height=d;i.canvas=S;aG.call(i,i,an.fn);i.clear();return i;};aT[aY].clear=function(){var d=this.canvas;while(d.firstChild){d.removeChild(d.firstChild);}this.bottom=this.top=null;(this.desc=aJ("desc"))[aL](L.createTextNode("Created with Rapha\xebl"));d[aL](this.desc);d[aL](this.defs=aJ("defs"));};aT[aY].remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if(an.vml){var aH=function(a8){var a5=/[ahqstv]/ig,a0=r;(a8+at).match(a5)&&(a0=H);a5=/[clmz]/g;if(a0==r&&!(a8+at).match(a5)){var e={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},R=/([clmz]),?([^clmz]*)/gi,S=/-?[^,\s-]+/g;var a4=(a8+at)[aP](R,function(a9,bb,i){var ba=[];i[aP](S,function(bc){ba[f](O(bc));});return e[bb]+ba;});return a4;}var a6=a0(a8),E,a4=[],d;for(var a2=0,a7=a6[m];a21&&(e=1);a7.opacity=e;}a8.fill&&(a7.on=true);if(a7.on==null||a8.fill=="none"){a7.on=false;}if(a7.on&&a8.fill){var i=a8.fill.match(c);if(i){a7.src=i[1];a7.type="tile";}else{a7.color=an.getRGB(a8.fill).hex;a7.src=at;a7.type="solid";if(an.getRGB(a8.fill).error&&(bd.type in {circle:1,ellipse:1}||(a8.fill+at).charAt()!="r")&&b(bd,a8.fill)){a9.fill="none";a9.gradient=a8.fill;}}}ba&&a6[aL](a7);var R=(a6.getElementsByTagName("stroke")&&a6.getElementsByTagName("stroke")[0]),bb=false;!R&&(bb=R=ah("stroke"));if((a8.stroke&&a8.stroke!="none")||a8["stroke-width"]||a8["stroke-opacity"]!=null||a8["stroke-dasharray"]||a8["stroke-miterlimit"]||a8["stroke-linejoin"]||a8["stroke-linecap"]){R.on=true;}(a8.stroke=="none"||R.on==null||a8.stroke==0||a8["stroke-width"]==0)&&(R.on=false);R.on&&a8.stroke&&(R.color=an.getRGB(a8.stroke).hex);var e=((+a9["stroke-opacity"]+1||2)-1)*((+a9.opacity+1||2)-1),a4=(W(a8["stroke-width"])||1)*0.75;e<0&&(e=0);e>1&&(e=1);a8["stroke-width"]==null&&(a4=a9["stroke-width"]);a8["stroke-width"]&&(R.weight=a4);a4&&a4<1&&(e*=a4)&&(R.weight=1);R.opacity=e;a8["stroke-linejoin"]&&(R.joinstyle=a8["stroke-linejoin"]||"miter");R.miterlimit=a8["stroke-miterlimit"]||8;a8["stroke-linecap"]&&(R.endcap=a8["stroke-linecap"]=="butt"?"flat":a8["stroke-linecap"]=="square"?"square":"round");if(a8["stroke-dasharray"]){var a5={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};R.dashstyle=a5[Q](a8["stroke-dasharray"])?a5[a8["stroke-dasharray"]]:at;}bb&&a6[aL](R);}if(bd.type=="text"){var a0=bd.paper.span.style;a9.font&&(a0.font=a9.font);a9["font-family"]&&(a0.fontFamily=a9["font-family"]);a9["font-size"]&&(a0.fontSize=a9["font-size"]);a9["font-weight"]&&(a0.fontWeight=a9["font-weight"]);a9["font-style"]&&(a0.fontStyle=a9["font-style"]);bd.node.string&&(bd.paper.span.innerHTML=(bd.node.string+at)[aP](/"));bd.W=a9.w=bd.paper.span.offsetWidth;bd.H=a9.h=bd.paper.span.offsetHeight;bd.X=a9.x;bd.Y=a9.y+O(bd.H/2);switch(a9["text-anchor"]){case"start":bd.node.style["v-text-align"]="left";bd.bbx=O(bd.W/2);break;case"end":bd.node.style["v-text-align"]="right";bd.bbx=-O(bd.W/2);break;default:bd.node.style["v-text-align"]="center";break;}}};var b=function(d,a1){d.attrs=d.attrs||{};var a2=d.attrs,a4=d.node.getElementsByTagName("fill"),S="linear",a0=".5 .5";d.attrs.gradient=a1;a1=(a1+at)[aP](ar,function(a6,a7,i){S="radial";if(a7&&i){a7=W(a7);i=W(i);aM(a7-0.5,2)+aM(i-0.5,2)>0.25&&(i=ab.sqrt(0.25-aM(a7-0.5,2))*((i>0.5)*2-1)+0.5);a0=a7+am+i;}return at;});a1=a1[z](/\s*\-\s*/);if(S=="linear"){var e=a1.shift();e=-W(e);if(isNaN(e)){return null;}}var R=p(a1);if(!R){return null;}d=d.shape||d.node;a4=a4[0]||ah("fill");if(R[m]){a4.on=true;a4.method="none";a4.type=(S=="radial")?"gradientradial":"gradient";a4.color=R[0].color;a4.color2=R[R[m]-1].color;var a5=[];for(var E=0,a3=R[m];E');};}catch(af){ah=function(d){return L.createElement("<"+d+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">');};}var w=function(){var i=ao[aW](null,arguments),d=i.container,a2=i.height,a3,e=i.width,a1=i.x,a0=i.y;if(!d){throw new Error("VML container not found.");}var R=new aT,S=R.canvas=L.createElement("div"),E=S.style;e=e||512;a2=a2||342;e==+e&&(e+="px");a2==+a2&&(a2+="px");R.width=1000;R.height=1000;R.coordsize="1000 1000";R.coordorigin="0 0";R.span=L.createElement("span");R.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";S[aL](R.span);E.cssText=an.format("width:{0};height:{1};position:absolute;clip:rect(0 {0} {1} 0);overflow:hidden",e,a2);if(d==1){L.body[aL](S);E.left=a1+"px";E.top=a0+"px";}else{d.style.width=e;d.style.height=a2;if(d.firstChild){d.insertBefore(S,d.firstChild);}else{d[aL](S);}}aG.call(R,R,an.fn);return R;};aT[aY].clear=function(){this.canvas.innerHTML=at;this.span=L.createElement("span");this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;";this.canvas[aL](this.span);this.bottom=this.top=null;};aT[aY].remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var d in this){this[d]=s(d);}};}if((/^Apple|^Google/).test(navigator.vendor)&&!(navigator.userAgent.indexOf("Version/4.0")+1)){aT[aY].safari=function(){var d=this.rect(-99,-99,this.width+99,this.height+99);setTimeout(function(){d.remove();});};}else{aT[aY].safari=function(){};}var ae=(function(){if(L.addEventListener){return function(R,i,e,d){var E=function(S){return e.call(d,S);};R.addEventListener(i,E,false);return function(){R.removeEventListener(i,E,false);return true;};};}else{if(L.attachEvent){return function(S,E,i,e){var R=function(a0){return i.call(e,a0||au.event);};S.attachEvent("on"+E,R);var d=function(){S.detachEvent("on"+E,R);return true;};return d;};}}})();for(var ac=F[m];ac--;){(function(d){ax[aY][d]=function(e){if(an.is(e,"function")){this.events=this.events||[];this.events.push({name:d,f:e,unbind:ae(this.shape||this.node,d,e,this)});}return this;};ax[aY]["un"+d]=function(E){var i=this.events,e=i[m];while(e--){if(i[e].name==d&&i[e].f==E){i[e].unbind();i.splice(e,1);!i.length&&delete this.events;return this;}}return this;};})(F[ac]);}ax[aY].hover=function(e,d){return this.mouseover(e).mouseout(d);};ax[aY].unhover=function(e,d){return this.unmouseover(e).unmouseout(d);};aT[aY].circle=function(d,i,e){return P(this,d||0,i||0,e||0);};aT[aY].rect=function(d,R,e,i,E){return aF(this,d||0,R||0,e||0,i||0,E||0);};aT[aY].ellipse=function(d,E,i,e){return ai(this,d||0,E||0,i||0,e||0);};aT[aY].path=function(d){d&&!an.is(d,"string")&&!an.is(d[0],"array")&&(d+=at);return q(an.format[aW](an,arguments),this);};aT[aY].image=function(E,d,R,e,i){return o(this,E||"about:blank",d||0,R||0,e||0,i||0);};aT[aY].text=function(d,i,e){return X(this,d||0,i||0,e||at);};aT[aY].set=function(d){arguments[m]>1&&(d=Array[aY].splice.call(arguments,0,arguments[m]));return new T(d);};aT[aY].setSize=aV;aT[aY].top=aT[aY].bottom=null;aT[aY].raphael=an;function u(){return this.x+am+this.y;}ax[aY].scale=function(a6,a5,E,e){if(a6==null&&a5==null){return{x:this._.sx,y:this._.sy,toString:u};}a5=a5||a6;!+a5&&(a5=a6);var ba,a8,a9,a7,bm=this.attrs;if(a6!=0){var a4=this.getBBox(),a1=a4.x+a4.width/2,R=a4.y+a4.height/2,bl=a6/this._.sx,bk=a5/this._.sy;E=(+E||E==0)?E:a1;e=(+e||e==0)?e:R;var a3=~~(a6/ab.abs(a6)),a0=~~(a5/ab.abs(a5)),be=this.node.style,bo=E+(a1-E)*bl,bn=e+(R-e)*bk;switch(this.type){case"rect":case"image":var a2=bm.width*a3*bl,bd=bm.height*a0*bk;this.attr({height:bd,r:bm.r*aI(a3*bl,a0*bk),width:a2,x:bo-a2/2,y:bn-bd/2});break;case"circle":case"ellipse":this.attr({rx:bm.rx*a3*bl,ry:bm.ry*a0*bk,r:bm.r*aI(a3*bl,a0*bk),cx:bo,cy:bn});break;case"path":var bg=ad(bm.path),bh=true;for(var bj=0,bc=bg[m];bjS){if(e&&!a8.start){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);R+=["C",a6.start.x,a6.start.y,a6.m.x,a6.m.y,a6.x,a6.y];if(a0){return R;}a8.start=R;R=["M",a6.x,a6.y+"C",a6.n.x,a6.n.y,a6.end.x,a6.end.y,E[5],E[6]][az]();a3+=a1;a5=+E[5];a4=+E[6];continue;}if(!d&&!e){a6=an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],(S-a3)/a1);return{x:a6.x,y:a6.y,alpha:a6.alpha};}}a3+=a1;a5=+E[5];a4=+E[6];}R+=E;}a8.end=R;a6=d?a3:e?a8:an.findDotsAtSegment(a5,a4,E[1],E[2],E[3],E[4],E[5],E[6],1);a6.alpha&&(a6={x:a6.x,y:a6.y,alpha:a6.alpha});return a6;};},n=aj(function(E,d,a0,S,a6,a5,a4,a3){var R={x:0,y:0},a2=0;for(var a1=0;a1<1.01;a1+=0.01){var e=M(E,d,a0,S,a6,a5,a4,a3,a1);a1&&(a2+=ab.sqrt(aM(R.x-e.x,2)+aM(R.y-e.y,2)));R=e;}return a2;});var ap=aB(1),C=aB(),J=aB(0,1);ax[aY].getTotalLength=function(){if(this.type!="path"){return;}return ap(this.attrs.path);};ax[aY].getPointAtLength=function(d){if(this.type!="path"){return;}return C(this.attrs.path,d);};ax[aY].getSubpath=function(i,e){if(this.type!="path"){return;}if(ab.abs(this.getTotalLength()-e)<0.000001){return J(this.attrs.path,i).end;}var d=J(this.attrs.path,e,1);return i?J(d,i).end:d;};an.easing_formulas={linear:function(d){return d;},"<":function(d){return aM(d,3);},">":function(d){return aM(d-1,3)+1;},"<>":function(d){d=d*2;if(d<1){return aM(d,3)/2;}d-=2;return(aM(d,3)+2)/2;},backIn:function(e){var d=1.70158;return e*e*((d+1)*e-d);},backOut:function(e){e=e-1;var d=1.70158;return e*e*((d+1)*e+d)+1;},elastic:function(i){if(i==0||i==1){return i;}var e=0.3,d=e/4;return aM(2,-10*i)*ab.sin((i-d)*(2*ab.PI)/e)+1;},bounce:function(E){var e=7.5625,i=2.75,d;if(E<(1/i)){d=e*E*E;}else{if(E<(2/i)){E-=(1.5/i);d=e*E*E+0.75;}else{if(E<(2.5/i)){E-=(2.25/i);d=e*E*E+0.9375;}else{E-=(2.625/i);d=e*E*E+0.984375;}}}return d;}};var I={length:0},aR=function(){var a2=+new Date;for(var be in I){if(be!="length"&&I[Q](be)){var bj=I[be];if(bj.stop){delete I[be];I[m]--;continue;}var a0=a2-bj.start,bb=bj.ms,ba=bj.easing,bf=bj.from,a7=bj.diff,E=bj.to,a6=bj.t,a9=bj.prev||0,a1=bj.el,R=bj.callback,a8={},d;if(a0255?255:(d<0?0:d);},t=function(d,i){if(d==null){return{x:this._.tx,y:this._.ty,toString:u};}this._.tx+=+d;this._.ty+=+i;switch(this.type){case"circle":case"ellipse":this.attr({cx:+d+this.attrs.cx,cy:+i+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+d+this.attrs.x,y:+i+this.attrs.y});break;case"path":var e=ad(this.attrs.path);e[0][1]+=+d;e[0][2]+=+i;this.attr({path:e});break;}return this;};ax[aY].animateWith=function(e,i,d,R,E){I[e.id]&&(i.start=I[e.id].start);return this.animate(i,d,R,E);};ax[aY].animateAlong=ay();ax[aY].animateAlongBack=ay(1);function ay(d){return function(E,i,e,S){var R={back:d};an.is(e,"function")?(S=e):(R.rot=e);E&&E.constructor==ax&&(E=E.attrs.path);E&&(R.along=E);return this.animate(R,i,S);};}ax[aY].onAnimation=function(d){this._run=d||0;return this;};ax[aY].animate=function(be,a5,a4,E){if(an.is(a4,"function")||!a4){E=a4||null;}var a9={},e={},a2={};for(var a6 in be){if(be[Q](a6)){if(Z[Q](a6)){a9[a6]=this.attr(a6);(a9[a6]==null)&&(a9[a6]=j[a6]);e[a6]=be[a6];switch(Z[a6]){case"along":var bc=ap(be[a6]),a7=C(be[a6],bc*!!be.back),R=this.getBBox();a2[a6]=bc/a5;a2.tx=R.x;a2.ty=R.y;a2.sx=a7.x;a2.sy=a7.y;e.rot=be.rot;e.back=be.back;e.len=bc;be.rot&&(a2.r=W(this.rotate())||0);break;case"number":a2[a6]=(e[a6]-a9[a6])/a5;break;case"colour":a9[a6]=an.getRGB(a9[a6]);var a8=an.getRGB(e[a6]);a2[a6]={r:(a8.r-a9[a6].r)/a5,g:(a8.g-a9[a6].g)/a5,b:(a8.b-a9[a6].b)/a5};break;case"path":var S=H(a9[a6],e[a6]);a9[a6]=S[0];var a3=S[1];a2[a6]=[];for(var bb=0,a1=a9[a6][m];bb4.0.0 com.example - beer-contracts + beer-contracts-with-stubs 0.0.1.BUILD-SNAPSHOT - Contracts - Contains all the contracts + Contracts with stubs + Contains all the contracts and stubs org.springframework.boot @@ -20,6 +20,8 @@ UTF-8 Greenwich.BUILD-SNAPSHOT + 2.1.3.BUILD-SNAPSHOT + true 1.8 3.1.0 @@ -58,46 +60,11 @@ - - org.apache.maven.plugins - maven-assembly-plugin - - - contracts - prepare-package - - single - - - true - - ${project.basedir}/src/assembly/contracts.xml - - - false - - - - - - maven-jar-plugin - ${maven-jar-plugin.version} - - - default-jar - none - - jar - - - - - - maven-surefire-plugin - - true - + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + true diff --git a/beer_contracts_with_stubs/relationships.js b/beer_contracts_with_stubs/relationships.js deleted file mode 100644 index 15772c4d7..000000000 --- a/beer_contracts_with_stubs/relationships.js +++ /dev/null @@ -1 +0,0 @@ -relationships = '[{"source":"com.example:beer-api-producer-external:1.0.0","target":"foo.bar:beer-api-consumer"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:barService"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:bazService"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"anotherConsumerOnly"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:consumerOnly"},{"source":"com.example:beer-api-producer-external:2.0.0","target":"foo.bar:fooService:1.2.3"},{"source":"foo.bar:barService","target":"yetAnotherConsumer"},{"source":"foo.bar:bazService","target":"bazConsumer1"}]' \ No newline at end of file diff --git a/beer_contracts_with_stubs/relationships_d3.html b/beer_contracts_with_stubs/relationships_d3.html deleted file mode 100644 index 1ef18117e..000000000 --- a/beer_contracts_with_stubs/relationships_d3.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/beer_contracts_with_stubs/relationships_dracula.html b/beer_contracts_with_stubs/relationships_dracula.html deleted file mode 100644 index 9211df492..000000000 --- a/beer_contracts_with_stubs/relationships_dracula.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - Dependency Graph - - - - - - - -

- - - \ No newline at end of file diff --git a/beer_contracts_with_stubs/src/assembly/contracts.xml b/beer_contracts_with_stubs/src/assembly/contracts.xml deleted file mode 100644 index 0b18a4b97..000000000 --- a/beer_contracts_with_stubs/src/assembly/contracts.xml +++ /dev/null @@ -1,28 +0,0 @@ - - project - - jar - - false - - - - ${project.basedir}/src/main/resources/contracts/ - - / - true - - - **/${project.build.directory}/** - **/mvnw - **/mvnw.cmd - **/.mvn/** - **/src/assembly/** - **/src/test/** - **/target/** - - - - diff --git a/beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java b/beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java deleted file mode 100644 index 68ebca6cf..000000000 --- a/beer_contracts_with_stubs/src/test/java/docs/GenerateAdocsFromContractsTests.java +++ /dev/null @@ -1,118 +0,0 @@ -package docs; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.contract.spec.Contract; -import org.springframework.cloud.contract.verifier.util.ContractVerifierDslConverter; -import org.springframework.core.io.Resource; -import org.springframework.test.context.junit4.SpringRunner; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.FileVisitResult; -import java.nio.file.FileVisitor; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.Collection; -import java.util.regex.Pattern; - -@RunWith(SpringRunner.class) -public class GenerateAdocsFromContractsTests { - - // TODO: Can be parametrized - @Value("classpath:contracts") Resource contracts; - private static String header = "= Application Contracts\n" + "\n" - + "In the following document you'll be able to see all the contracts that are present for this application.\n" - + "\n" + "== Contracts\n"; - - @Test public void should_convert_contracts_into_adoc() throws IOException { - final StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(header); - final Path rootDir = this.contracts.getFile().toPath(); - - Files.walkFileTree(rootDir, new FileVisitor() { - private Pattern pattern = Pattern.compile("^.*groovy$"); - - @Override - public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes atts) - throws IOException { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path path, BasicFileAttributes mainAtts) - throws IOException { - boolean matches = this.pattern.matcher(path.toString()).matches(); - if (matches) { - appendContract(stringBuilder, path); - } - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path path, IOException exc) - throws IOException { - return FileVisitResult.CONTINUE; - } - - @Override public FileVisitResult visitFileFailed(Path path, IOException exc) - throws IOException { - // If the root directory has failed it makes no sense to continue - return path.equals(rootDir) ? - FileVisitResult.TERMINATE : - FileVisitResult.CONTINUE; - } - }); - - //String outputAdoc = asciidoctor.convert(stringBuilder.toString(), new HashMap()); - String outputAdoc = stringBuilder.toString(); - // TODO: Can be parametrized - File outputDir = new File("target/generated-snippets"); - outputDir.mkdirs(); - // TODO: Can be parametrized - File outputFile = new File(outputDir, "contracts.adoc"); - if (outputFile.exists()) { - outputFile.delete(); - } - if (outputFile.createNewFile()) { - Files.write(outputFile.toPath(), outputAdoc.getBytes()); - } - } - - static StringBuilder appendContract(final StringBuilder stringBuilder, Path path) - throws IOException { - Collection contracts = ContractVerifierDslConverter.convertAsCollection(path.getParent().toFile(), path.toFile()); - // TODO: Can be parametrized - contracts.forEach(contract -> { - stringBuilder.append("### ") - .append(path.getFileName().toString()) - .append("\n\n") - .append(contract.getDescription()) - .append("\n\n") - .append("#### Contract structure") - .append("\n\n") - .append("[source,java,indent=0]") - .append("\n") - .append("----") - .append("\n") - .append(fileAsString(path)) - .append("\n") - .append("----") - .append("\n\n"); - }); - return stringBuilder; - } - - static String fileAsString(Path path) { - try { - byte[] encoded = Files.readAllBytes(path); - return new String(encoded, StandardCharsets.UTF_8); - } - catch (IOException e) { - throw new RuntimeException(e); - } - } -} \ No newline at end of file diff --git a/beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java b/beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java deleted file mode 100644 index 5f668eaac..000000000 --- a/beer_contracts_with_stubs/src/test/java/docs/GenerateGraphFromContractsTests.java +++ /dev/null @@ -1,206 +0,0 @@ -package docs; - -import java.io.File; -import java.io.IOException; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.Resource; -import org.springframework.test.context.junit4.SpringRunner; - -/** - * Generates a JSON file that will be used to sketch - * the dependencies between projects - * - * @author Marcin Grzejszczak - */ -@RunWith(SpringRunner.class) -public class GenerateGraphFromContractsTests { - private final ObjectMapper mapper = new ObjectMapper(); - - @Value("classpath:contracts") Resource contracts; - - @Test - public void should_build_a_list_of_relationships() throws IOException { - Path root = Paths.get(this.contracts.getURI()); - DependencyWalker dependencyWalker = new DependencyWalker(root); - - Files.walkFileTree(root, dependencyWalker); - - File outputFile = new File("relationships.js"); - String relationships = this.mapper.writeValueAsString(dependencyWalker.relationships()); - outputFile.createNewFile(); - Files.write(outputFile.toPath(), ("relationships = '" + relationships + "'").getBytes()); - } -} - -class Relationship { - public String source; - public String target; - - public Relationship(String source, String target) { - this.source = source; - this.target = target; - } -} - -class DependencyWalker extends SimpleFileVisitor { - - private static final Logger log = LoggerFactory.getLogger(DependencyWalker.class); - private static final Pattern SEMVER = Pattern.compile("^(\\d+\\.)?(\\d+\\.)?(\\*|\\d+)$"); - private static final List SKIPPED_FOLDERS = Arrays.asList("mvn", "target", "build", ".mvn", ".gradle", ".idea", "eclipse"); - - private final List foundProducers = new ArrayList<>(); - private final List foundConsumers = new ArrayList<>(); - private final List relationships = new ArrayList<>(); - private final Path root; - - DependencyWalker(Path root) { - this.root = root; - } - - List foundProducers() { - return this.foundProducers; - } - - List foundConsumers() { - // TODO: print which consumers are not matched - return this.foundConsumers; - } - - List relationships() { - // parent has always group and artifact but a child not necessarily - // we need to assume that if a child has just artifact id then we'll match it against - // the first parent - // TODO: Add an option to explicitly match it (or just document to use groupid.artifactid.version_with_underscores) - this.relationships.forEach(relationship -> { - this.foundProducers.stream() - .filter(s -> relationship.target.equals(artifactId(s))) - .findFirst() - .ifPresent(s -> relationship.target = s); - }); - return this.relationships; - } - - private String artifactId(String name) { - if (name.contains(".")) { - String[] split = name.split(":"); - // [foo],[bar],[bazService],[1.2.3] - String potentialVersion = split[split.length - 1]; - if (isSemver(potentialVersion)) { - // bazService - return split[split.length - 2]; - } - // [foo],[bar],[bazService] - return potentialVersion; - } - // bazService - return name; - } - - @Override public FileVisitResult preVisitDirectory(Path dir, - BasicFileAttributes attrs) throws IOException { - File producer = dir.toFile(); - boolean pomExists = new File(producer, "pom.xml").exists(); - boolean gradleExists = new File(producer, "build.gradle").exists(); - // in this case we don't know explicitly who the consumers are - boolean producerContracts = new File(producer, ".producer_contracts").exists(); - if (pomExists || gradleExists) { - // com/example/producer/1.0.0 -> com/example - // com/example/producer -> com/example - boolean isSemVerDir = isSemver(dir.getFileName().toString()); - Path artifactId = isSemVerDir ? dir.getParent() : dir; - Path artifactIdParent = artifactId.getParent(); - String version = isSemVerDir ? dir.getFileName().toString() : ""; - Path relativePath = this.root.relativize(artifactIdParent); - // com/example -> com.example - String relativeGroupId = relativePath.toString().replace(File.separator, "."); - String producerName = artifactId.getFileName().toString(); - // com.example:producer - // com.example:producer:1.0.0 - String gav = relativeGroupId + ":" + producerName + (isSemVerDir ? ":" + version : ""); - File[] consumers = new File[0]; - List consumerForProducer = new ArrayList<>(); - if (!producerContracts) { - consumers = producer.listFiles(File::isDirectory); - if (consumers != null && consumers.length > 0) { - Arrays.stream(consumers) - .filter(file -> !SKIPPED_FOLDERS.contains(file.getName())) - .forEach(file -> { - String consumerName = folderToGav(file); - consumerForProducer.add(consumerName); - this.foundConsumers.add(consumerName); - this.relationships.add(new Relationship(gav, consumerName)); - }); - } - } - log.info("Found [" + gav + "] producer with consumers " + consumerForProducer); - this.foundProducers.add(gav); - return FileVisitResult.SKIP_SUBTREE; - } - return super.preVisitDirectory(dir, attrs); - } - - private boolean isSemver(String name) { - //TODO: Consider adding some file like .version for non semver - return SEMVER.matcher(name).matches(); - } - - private String folderToGav(File file) { - String fileName = file.getName(); - // (1) bazService - // (2) foo.bar.bazService - // (3) foo.bar.bazService.1_2_3 - if (fileName.contains(".")) { - String[] split = fileName.split("\\."); - // (2) [foo],[bar],[bazService] - // (3) [foo],[bar],[bazService],[1.2.3] - String potentialVersion = split[split.length - 1].replace("_", "."); - if (isSemver(potentialVersion)) { - // 1.2.3 - String version = potentialVersion; - // bazService - String artifactId = split[split.length - 2]; - StringBuilder group = new StringBuilder(); - for (int i = 0; i < split.length - 2; i++) { - group.append(split[i]); - if (i + 1 < split.length - 2) { - group.append("."); - } - } - // foo.bar - String groupId = group.toString(); - // (3) foo.bar:bazService:1.2.3 - return groupId + ":" + artifactId + ":" + version; - } - // (2) foo.bar.bazService -> foo.bar:bazService - return replaceLast(fileName, ".", ":"); - } - // (3) bazService - return fileName; - } - - private String replaceLast(String string, String substring, String replacement) { - int index = string.lastIndexOf(substring); - if (index == -1) { - return string; - } - return string.substring(0, index) + replacement + string - .substring(index + substring.length()); - } - -} \ No newline at end of file diff --git a/beer_contracts_with_stubs/src/main/resources/.gitignore b/beer_contracts_with_stubs/src/test/resources/.gitignore similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/.gitignore rename to beer_contracts_with_stubs/src/test/resources/.gitignore diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/messaging/shouldSendAcceptedVerification.groovy diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/messaging/shouldSendRejectedVerification.groovy diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/response.json b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/response.json similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/response.json rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/response.json diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnough.groovy diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/shouldGrantABeerIfOldEnoughFromFile.groovy diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/beer-api-consumer/rest/shouldRejectABeerIfTooYoung.groovy diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/pom.xml b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/pom.xml similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/1.0.0/pom.xml rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/1.0.0/pom.xml diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/anotherConsumerOnly/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/anotherConsumerOnly/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/anotherConsumerOnly/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/anotherConsumerOnly/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/barService/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/barService/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/barService/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/barService/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.bazService/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/foo.bar.bazService/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.bazService/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/foo.bar.bazService/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.consumerOnly/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/foo.bar.consumerOnly/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.consumerOnly/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/foo.bar.consumerOnly/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.fooService.1_2_3/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/foo.bar.fooService.1_2_3/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/foo.bar.fooService.1_2_3/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/foo.bar.fooService.1_2_3/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/pom.xml b/beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/pom.xml similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/com/example/beer-api-producer-external/2.0.0/pom.xml rename to beer_contracts_with_stubs/src/test/resources/contracts/com/example/beer-api-producer-external-classpath/2.0.0/pom.xml diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/pom.xml b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/barService/pom.xml similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/pom.xml rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/barService/pom.xml diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/barService/yetAnotherConsumer/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/bazService/bazConsumer1/rest/shouldSayHello.groovy diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/pom.xml b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/bazService/pom.xml similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/bazService/pom.xml rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/bazService/pom.xml diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/.producer_contracts diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/messaging/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/pom.xml b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/pom.xml similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/pom.xml rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/pom.xml diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/beer-api-consumer/rest/.gitkeep diff --git a/beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/fooService/1.2.3/pom.xml b/beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/fooService/1.2.3/pom.xml similarity index 100% rename from beer_contracts_with_stubs/src/main/resources/contracts/foo/bar/fooService/1.2.3/pom.xml rename to beer_contracts_with_stubs/src/test/resources/contracts/foo/bar/fooService/1.2.3/pom.xml diff --git a/pom-external-classpath.xml b/pom-external-classpath.xml new file mode 100644 index 000000000..697c8b875 --- /dev/null +++ b/pom-external-classpath.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + com.example + spring-cloud-contract-samples + pom + 0.0.1.BUILD-SNAPSHOT + + Spring Cloud Contract Samples + Spring Cloud Contract Samples + + + + + maven-deploy-plugin + + true + + + + + + + + default + + true + + + beer_contracts_with_stubs + producer_with_external_contracts_classpath + + + + + diff --git a/producer_with_external_contracts_classpath/pom.xml b/producer_with_external_contracts_classpath/pom.xml index d9ef054e4..9e8c7a363 100644 --- a/producer_with_external_contracts_classpath/pom.xml +++ b/producer_with_external_contracts_classpath/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.example - beer-api-producer-external + beer-api-producer-external-classpath 0.0.1.BUILD-SNAPSHOT jar @@ -64,6 +64,15 @@ + + + + org.springframework.cloud + spring-cloud-contract-maven-plugin + ${spring-cloud-contract.version} + + + org.springframework.boot @@ -82,7 +91,7 @@ org.springframework.cloud spring-cloud-contract-maven-plugin ${spring-cloud-contract.version} - true + false @@ -97,10 +106,11 @@ com.example - beer-contracts + beer-contracts-with-stubs + stubs - LOCAL + CLASSPATH com.example @@ -111,6 +121,12 @@ spring-cloud-contract-verifier ${spring-cloud-contract.version} + + com.example + beer-contracts-with-stubs + stubs + 0.0.1.BUILD-SNAPSHOT +