corda/settings.gradle

130 lines
4.5 KiB
Groovy
Raw Normal View History

pluginManagement {
ext.artifactory_contextUrl = 'https://software.r3.com/artifactory'
ext.publicArtifactURL = 'https://download.corda.net/maven'
repositories {
// Use system environment to activate caching with Artifactory,
// because it is actually easier to pass that during parallel build.
// NOTE: it has to be a name of a virtual repository with all
// required remote or local repositories!
if (System.getenv("CORDA_USE_CACHE")) {
maven {
name "R3 Maven remote repositories"
url "${artifactory_contextUrl}/${System.getenv("CORDA_USE_CACHE")}"
authentication {
basic(BasicAuthentication)
}
credentials {
username = System.getenv('CORDA_ARTIFACTORY_USERNAME')
password = System.getenv('CORDA_ARTIFACTORY_PASSWORD')
}
}
} else {
mavenLocal()
gradlePluginPortal()
maven { url "${publicArtifactURL}/corda-dependencies" }
Upgrade to gradle 7.6, kotlin 1.8 and jdk 17 Major changes due to JDK 17: 1. JDK17 JCE Provider now has built-in support for eddsas, corda uses the bouncycastle (i2p) implementation. This PR removes the conflicting algorithms from the built-in JCE provider. 2. JavaScript scripting has been removed from the JDK, the corda log4j config was using scripting to conditionally output additional diagnostic info if the MDC was populated. This PR has removed the scripting. 3. The artifactory plug-ins used are now deprecated, this PR has removed them and uses the same code as Corda 5 for publishing to artifactory. 4. Javadoc generation has been modified to use the latest dokka plug-ins. 5. Gradle 7.6 has implemented an incredibly annoying change where transitive dependencies are not put on the compile classpath, so that they have to be explicitly added as dependencies to projects. 6. Mockito has been updated, which sadly meant that quite a few source files have to changes to use the new (org.mockito.kotlin) package name. This makes this PR appear much larger than it is. 7. A number of tests have been marked as ignored to get a green, broadly they fall into 3 classes. The first is related to crypto keypair tests, it appears some logic in the JDK prefers to use the SunJCE implementation and we prefer to use bouncycastle. I believe this issue can be fixed with better test setup. The second group is related to our use of a method called "uncheckedCast(..)", the purpose of this method was to get rid of the annoying unchecked cast compiler warning that would otherwise exist. It looks like the Kotlin 1.9 compiler type inference differs and at runtime sometimes the type it infers is "Void" which causes an exception at runtime. The simplest solution is to use an explicit cast instead of unchecked cast, Corda 5 have removed unchecked cast from their codebase. The third class are a number of ActiveMQ tests which appear to have a memory leak somewhere.
2023-03-08 12:19:05 +00:00
maven { url "${publicArtifactURL}/corda-dependencies-dev" }
}
}
Upgrade to gradle 7.6, kotlin 1.8 and jdk 17 Major changes due to JDK 17: 1. JDK17 JCE Provider now has built-in support for eddsas, corda uses the bouncycastle (i2p) implementation. This PR removes the conflicting algorithms from the built-in JCE provider. 2. JavaScript scripting has been removed from the JDK, the corda log4j config was using scripting to conditionally output additional diagnostic info if the MDC was populated. This PR has removed the scripting. 3. The artifactory plug-ins used are now deprecated, this PR has removed them and uses the same code as Corda 5 for publishing to artifactory. 4. Javadoc generation has been modified to use the latest dokka plug-ins. 5. Gradle 7.6 has implemented an incredibly annoying change where transitive dependencies are not put on the compile classpath, so that they have to be explicitly added as dependencies to projects. 6. Mockito has been updated, which sadly meant that quite a few source files have to changes to use the new (org.mockito.kotlin) package name. This makes this PR appear much larger than it is. 7. A number of tests have been marked as ignored to get a green, broadly they fall into 3 classes. The first is related to crypto keypair tests, it appears some logic in the JDK prefers to use the SunJCE implementation and we prefer to use bouncycastle. I believe this issue can be fixed with better test setup. The second group is related to our use of a method called "uncheckedCast(..)", the purpose of this method was to get rid of the annoying unchecked cast compiler warning that would otherwise exist. It looks like the Kotlin 1.9 compiler type inference differs and at runtime sometimes the type it infers is "Void" which causes an exception at runtime. The simplest solution is to use an explicit cast instead of unchecked cast, Corda 5 have removed unchecked cast from their codebase. The third class are a number of ActiveMQ tests which appear to have a memory leak somewhere.
2023-03-08 12:19:05 +00:00
plugins {
id 'org.jetbrains.kotlin.jvm' version kotlin_version
id 'org.jetbrains.kotlin.plugin.allopen' version kotlin_version
id 'org.jetbrains.kotlin.plugin.jpa' version kotlin_version
}
}
// The project is named 'corda-project' and not 'corda' because if this is named the same as the
// output JAR from the capsule then the buildCordaJAR task goes into an infinite loop.
rootProject.name = 'corda-project'
include 'opentelemetry'
include 'opentelemetry:opentelemetry-driver'
include 'confidential-identities'
include 'finance:contracts'
include 'finance:workflows'
include 'core'
include 'core-tests'
include 'docs'
include 'node-api'
include 'node-api-tests'
2016-06-22 13:02:50 +00:00
include 'node'
include 'node:capsule'
ENT-11055: Basic external verification (#7545) * ENT-11055: Basic external verification Introduction of the external transaction verifier, a separate JVM process for verifying `SignedTransaction`s. The end goal is for this verifier to be built with Kotlin 1.2 so that it creates a compatible verification environment for transactions with 4.11 contracts. For now however the verifier is built against Kotlin 1.8, same as the node. External verification is enabled when the the system property `net.corda.node.verification.external` is set to `true`. When enabled, all verification requests made via `SignedTransaction.verify` are sent to the external verifier, regardless of the transaction content. It will do the vast bulk of the verification and then send the result back, namely if an exception occurred. If it did, then it's re-thrown in the node. The external verifier is a stateless process, with no connection to the node's database. All transaction resolution information needed to create the relevant ledger transaction object are made to the node, which waits in a loop servicing these requests until it receives the result. The verifier Jar is embedded in the Corda node Jar, and is extracted and run when needed for the first time. The node opens up a local port for the verifier to communicate with, which is specified to the verifier in the process command line. This all means there is no extra configuration or deployment required to support external verification. The existing code had some initial attempts and abstractions to support a future external verification feature. However, they were either incorrect or didn't quite fit. One such example was `TransactionVerifierService`. It incorrectly operated on the `LedgerTransaction` level, which doesn't work since the transaction needs to be first serialised. Instead a new abstraction, `VerificationSupport` has been introduced, which represents all the operations needed to resolve and verify a `SignedTransaction`, essentially replacing `ServicesForResolution` (a lot of the changes are due to this). The external verifier implements this with a simple RPC mechanism, whilst the node needed a new (internal) `ServiceHub` abstraction, `VerifyingServiceHub`. `ServicesForResolution` hasn't been deleted since it's public API, however all classes implementing it must also implement `VerifyingServiceHub`. This is possible to do without breaking compatibility since `ServicesForResolution` is annotated with `@DoNotImplement`. Changes to `api-current.txt` were made due to the removal of `TransactionVerifierService`, which was clearly indicated as an internal class, and returning `TransactionBuilder.toLedgerTransactionWithContext` back to an internal method. * Address review comments * One bulk load states method * Merge fix
2023-12-07 11:29:27 +00:00
include 'verifier'
include 'client:jackson'
include 'client:jfx'
include 'client:mock'
include 'client:rpc'
include 'docker'
Upgrade to gradle 7.6, kotlin 1.8 and jdk 17 Major changes due to JDK 17: 1. JDK17 JCE Provider now has built-in support for eddsas, corda uses the bouncycastle (i2p) implementation. This PR removes the conflicting algorithms from the built-in JCE provider. 2. JavaScript scripting has been removed from the JDK, the corda log4j config was using scripting to conditionally output additional diagnostic info if the MDC was populated. This PR has removed the scripting. 3. The artifactory plug-ins used are now deprecated, this PR has removed them and uses the same code as Corda 5 for publishing to artifactory. 4. Javadoc generation has been modified to use the latest dokka plug-ins. 5. Gradle 7.6 has implemented an incredibly annoying change where transitive dependencies are not put on the compile classpath, so that they have to be explicitly added as dependencies to projects. 6. Mockito has been updated, which sadly meant that quite a few source files have to changes to use the new (org.mockito.kotlin) package name. This makes this PR appear much larger than it is. 7. A number of tests have been marked as ignored to get a green, broadly they fall into 3 classes. The first is related to crypto keypair tests, it appears some logic in the JDK prefers to use the SunJCE implementation and we prefer to use bouncycastle. I believe this issue can be fixed with better test setup. The second group is related to our use of a method called "uncheckedCast(..)", the purpose of this method was to get rid of the annoying unchecked cast compiler warning that would otherwise exist. It looks like the Kotlin 1.9 compiler type inference differs and at runtime sometimes the type it infers is "Void" which causes an exception at runtime. The simplest solution is to use an explicit cast instead of unchecked cast, Corda 5 have removed unchecked cast from their codebase. The third class are a number of ActiveMQ tests which appear to have a memory leak somewhere.
2023-03-08 12:19:05 +00:00
include 'testing:client-rpc'
include 'testing:testserver'
include 'testing:testserver:testcapsule:'
2016-06-22 13:02:50 +00:00
include 'experimental'
include 'experimental:avalanche'
include 'experimental:blobwriter'
2017-05-11 10:13:18 +00:00
include 'experimental:quasar-hook'
include 'experimental:corda-utils'
include 'experimental:nodeinfo'
include 'experimental:netparams'
include 'test-common'
include 'test-cli'
include 'test-utils'
include 'test-db'
include 'smoke-test-utils'
include 'node-driver'
include 'core-test-utils'
// Avoid making 'testing' a project, and allow build.gradle files to refer to these by their simple names:
['test-common', 'core-test-utils', 'test-utils', 'test-cli', 'test-db', 'smoke-test-utils', 'node-driver'].each {
project(":$it").projectDir = new File("$settingsDir/testing/$it")
}
include 'tools:explorer'
Merge DemoBench into Corda. (#380) * Add basic spec for the demobench tool. * Initial commit: Creating new tabs whenever the "Add Node" button is pressed. These tabs currently contain the bash shell only. * Refactor shutdown code, although AWT is still misbehaving. * Remove duplicate libpty native objects. * Add initial form for configuring new nodes. * Update to Corda 0.8-SNAPSHOT * Patch JediTerm to allow the application to shutdown cleanly. * Write configuration parameters into node.conf, and then run corda.jar in its own directory. * The first node now becomes the session's Network Map service used by all other nodes. Force nodes to be created one-by-one. * Trim node name and nearest city values. * Fix logging location of corda.jar * legalName field can be val. * Allow configuration of extra network services. * Launch DB viewer for node. * Small tidy-up. * Allow services to be loaded as a resources as well as a file. * Include native artifacts in distribution. * Add cash and issuer services to DemoBench. * Configure Node and DemoBench to use same version of H2 database. * Implement launching "Node Explorer" for each node. * Create a capsule for Node Explorer, and allow login via command line parameters to bypass login screen. * Simplify Kotlin objects. * Include issuer for CHF (Swiss Francs) * Fix SLF4J logging. * Display simple statistics about the node on each tab. * Add new RPC operation getCashBalances() to Node. * Ensure demobench is built after explorer:capsule. * Grant permissions to the Node's user, and install BanfOfCorda plugin for cash issuers. * Initial inclusion of Corda and BankOfCorda JARs in distribution. * Fix DemoBench distribution target. * Add SLF4J binding for Log4J 2.x * First batch of code review changes. * More changes from review. * Remove ".exe" from Java executable path, because Windows doesn't need it. * Remove superfluous lamba parameter names. * Better usage of Paths vs File API. * Simplify the configuration object. * Ensure a DemoBench installation is relocatable. * Ensure that Node Explorer can write into its working directory. * Disable Node Explorer and Database Viewer buttons until the node has launched and is responding to RPC. * Only allow the first node to run notary services. And validate port numbers more strongly. * Force all chosen port numbers to be different. * Initial javapackager task: currently builds RPMs. * Ensure JavaPackager task finds custom resources on the classpath. * Move demobench.log into the user's demobench directory. * Upgrade to Logback 1.1.10 * Make the javapackage task "more gradle" and "less ant". * Display "0" balance for a node which has no cash balances at all. * CORPRIV-665: Ensure tab closes if the node exits. * CORPRIV-665: Protect against NPE * CORPRIV-665: Protect harder against NPE * CORPRIV-665: Protect NodeTerminalView from being destroyed twice. * Initial custom resource script for Windows bundle. * Take java executable from JRE. * Allow Node Explorer to be relaunched. * CORPRIV-658: Add gradle parameter "packageType" for javapackage task. * Replace R3 logo with Corda logo. * CORPRIV-658: Add icon file for Windows installer. * CORPRIV-658: Add BAT file to create unsigned DemoBench.exe. * CORPRIV-659: Add icon file for DMG package. * Improve packaging information. * CORPRIV-660: Allow user to launch Web server for each node. * Tidy up gradle usage. * Document provenance of jediterm-terminal-2.5.jar. * Use "safe" casting operator. * CORPRIV-659: Add bin/java to minimal JRE. * CORPRIV-659: Basic shell script to package DemoBench as DMG. * Add utility function for creating SLF4J loggers, and close unused I/O streams from forked processes. * Switch from Runtime.exec() to ProcessBuilder. * CORPRIV-660: Display Web server's port number on launch button. * CORPRIV-661: Allow profiles to be loaded into DemoBench. * Upgrade to TornadoFX 1.6.2. * CORPRIV-661: Implement saving profiles. * CORPRIV-661: Refactor code for guaranteeing a .zip extension. * CORRIV-658: Add icon for Windows installer. * CORPRIV-659: Update installer script and icons for DMG. * CORPRIV-659: Tweak post-image script for DMG. * CORPRIV-658: I've wasted enough time on this - Windows rejects this BMP as invalid, and I have no idea why!? * CORPRIV-658: Add external manifest for DemoBench.exe that declares it incapable of native HiDPI support. * CORPRIV-661: Ensure that we can rewrite saved profiles correctly. * Fix terminal resizing. * CORPRIV-659: Fix DMG installer. * CORPRIV-659: Better validation for JAVA_HOME. * Downgrade JDK requirement to 8u102, for consistency with capsules. * Comment how JediTerm is not available via Maven. * CORPRIV-658: Rename packaging script. * CORPRIV-659: Renaming packaging script. * Comment file copying vs file filtering during packaging. * Fixes from code review. * CORPRIV-661: Ensure that nodes loaded from a profile have the correct network map service. * Break textfield definitions out into separate functions. * Fixes from code review. * Code review tweaks. * More code review tweaks. * Another simple code review tweak. * Replace companion object with a BiPredicate lambda. * CORPRIV-664: Implement saving/loading of Cordapps with profiles. * CORPRIV-664: Refactor saving/loading plugins. * CORPRIV-664: Add initial unit tests for model. * CORPRIV-664: Add simple unit tests for NodeController. * CORPRIV-664: Unit test enhancements, e.g. configure JUL properly. * CORPRIV-664: Use Suite instead of abstract test class. * CORPRIV-664: Allow Cordapps to be loaded when each Node is configured. * CORPRIV-664: Document which checked Java exceptions are thrown. * Write JavaPackager output into build/javapackage directory. * CORPRIV-664: Document more checked Java exceptions. * Refactor Web and Explorer classes into their own packages. * Declare WebServer and Explorer constructors as "internal". * Update packaging scripts: tell user where the installer is! * CORPRIV-659: Set "system menu bar" property for MacOSX. * CORPRIV-661: Use "*.profile" for profile files. * Remove unnecessary <children/> elements, as they are defaults. * Fix build breakage when on Windows. * Tweaks for EXE packaging script. * Change function to extension function. * Merged in corpriv-702 (pull request #25) CORPRIV-702: Sign the DMG with a 'Developer ID Application' certificate. * CORPRIV-702: Sign the DMG with a 'Mac Developer' certificate. * CORPRIV-702: Use "Developer ID Application" certificate instead. And now JavaPackager signs the application, which means that we only need to resign our embedded JVM. * CORPRIV-702: Update comment better to explain why JRE must be resigned. Approved-by: Mike Hearn * Exclude old version of Javassist in favour of Hibernate's version from Node. (#320) * Exclude old version of Javassist in favour of Hibernate's version. * Comment why we are excluding javassist:javassist, and add TODO for when junit-quickcheck 0.8 is released. * CORDA-265: Implement "ALL" permission for RPC users. (#306) * CORDA-265: Implement "ALL" permission for RPC users. Users with this permission in node.conf can use any flow. * CORDA-265: Ensure that we always close the RPC proxy object after each test. * CORDA-265: Refactor construction of dummy RPC client into an abstract base class. * CORDA-265: Document RPC "ALL" permission. * CORDA-266: Update DemoBench to be compatible with 0.10-SNAPSHOT. * CORDA-268: Reimplement to work on both JDK8 and JDK9 (for now). * CORDA-268: Copy java from $JAVA_HOME/bin as this also works on JDK > 8. * Code review fixes. * Use SLF4J's version of the commons-logging bindings. Only include SLF4J's Log4J back-end for actual applications, e.g. Node. (#350) * Update with SLF4J change. * CORDA-266: Update to latest node.conf format. * Upgrade to H2 1.4.194. (#389) - Timezone related fixes. - A Turkish case canonicalisation bug. - Fixes for some scary threading related bugs.
2017-03-21 14:24:13 +00:00
include 'tools:explorer:capsule'
Upgrade to gradle 7.6, kotlin 1.8 and jdk 17 Major changes due to JDK 17: 1. JDK17 JCE Provider now has built-in support for eddsas, corda uses the bouncycastle (i2p) implementation. This PR removes the conflicting algorithms from the built-in JCE provider. 2. JavaScript scripting has been removed from the JDK, the corda log4j config was using scripting to conditionally output additional diagnostic info if the MDC was populated. This PR has removed the scripting. 3. The artifactory plug-ins used are now deprecated, this PR has removed them and uses the same code as Corda 5 for publishing to artifactory. 4. Javadoc generation has been modified to use the latest dokka plug-ins. 5. Gradle 7.6 has implemented an incredibly annoying change where transitive dependencies are not put on the compile classpath, so that they have to be explicitly added as dependencies to projects. 6. Mockito has been updated, which sadly meant that quite a few source files have to changes to use the new (org.mockito.kotlin) package name. This makes this PR appear much larger than it is. 7. A number of tests have been marked as ignored to get a green, broadly they fall into 3 classes. The first is related to crypto keypair tests, it appears some logic in the JDK prefers to use the SunJCE implementation and we prefer to use bouncycastle. I believe this issue can be fixed with better test setup. The second group is related to our use of a method called "uncheckedCast(..)", the purpose of this method was to get rid of the annoying unchecked cast compiler warning that would otherwise exist. It looks like the Kotlin 1.9 compiler type inference differs and at runtime sometimes the type it infers is "Void" which causes an exception at runtime. The simplest solution is to use an explicit cast instead of unchecked cast, Corda 5 have removed unchecked cast from their codebase. The third class are a number of ActiveMQ tests which appear to have a memory leak somewhere.
2023-03-08 12:19:05 +00:00
//include 'tools:demobench'
2016-10-17 16:50:33 +00:00
include 'tools:loadtest'
include 'tools:graphs'
include 'tools:bootstrapper'
include 'tools:blobinspector'
include 'tools:network-builder'
include 'tools:cliutils'
include 'tools:worldmap'
include 'tools:checkpoint-agent'
include 'samples:attachment-demo:contracts'
include 'samples:attachment-demo:workflows'
include 'samples:trader-demo:workflows-trader'
// include 'samples:irs-demo'
// include 'samples:irs-demo:cordapp:contracts-irs'
// include 'samples:irs-demo:cordapp:workflows-irs'
// include 'samples:irs-demo:web'
include 'samples:simm-valuation-demo'
include 'samples:simm-valuation-demo:flows'
include 'samples:simm-valuation-demo:contracts-states'
include 'samples:notary-demo:contracts'
include 'samples:notary-demo:workflows'
include 'samples:bank-of-corda-demo'
include 'samples:cordapp-configuration:workflows'
include 'samples:network-verifier:contracts'
include 'samples:network-verifier:workflows'
include 'serialization'
include 'serialization-tests'
include 'testing:cordapps:dbfailure:dbfcontracts'
include 'testing:cordapps:dbfailure:dbfworkflows'
include 'testing:cordapps:missingmigration'
include 'testing:cordapps:sleeping'
include 'testing:cordapps:cashobservers'
// Common libraries - start
include 'common-validation'
project(":common-validation").projectDir = new File("$settingsDir/common/validation")
include 'common-configuration-parsing'
project(":common-configuration-parsing").projectDir = new File("$settingsDir/common/configuration-parsing")
include 'common-logging'
project(":common-logging").projectDir = new File("$settingsDir/common/logging")
// Common libraries - end
CORDA-1509 Configure and enable Gradle Build Cache (#3908) * Fix to enable gradle build caching of test runs. * Configure gradle build caching to be enabled. * Generate dependency report and graph: 1) ./gradlew htmlDependencyReport 2) ./gradlew generateDependencyGraphCorda * Strip out all Jacoco references to prevent Gradle Build Cache error: "Caching disabled for task ':<module>:test': 'JaCoCo agent configured with `append = true`' satisfied" * Revert jacoco back into jarFilter gradle build file. Disable building deterministic modules (including jarFilter). * Added Gradle build scan plugin. * Set file encoding to prevent incorrect Gradle build cache keys across different machines. https://guides.gradle.org/using-build-cache/#system_file_encoding * Apply gradle build cache settings to buildSrc. * Added targetted gradle build tasks to leverage cache. * Updated URL's of several different test Gradle Cache instances. * Updated CI batch build scripts. * Updated script perms to be executable. * Added CI smoke tests batch script. * Use TestDev Labs gradle cache. * Echo URL of Gradle Build Repository. Echo exit status of each Gradle build command. * Use environment variables to define Gradle Build Cache usage and URL. * Customisation through parameters. * Remove dependency graph generation plugin. Align build cache settings across project and buildSrc gradle files. * Remove buildSrc gradle build cache config. * Revert definition of gradle build cache variables back to settings.gradle. * Fix incorrect path. * Aligned gradle build cache configuration across buildSrc and project. * Minor updates to test scope. * Minor updates to test scope. * Update scripts to use GRADLE_HOME * Exit on unset GRADLE_HOME * Remove duplication following rebase from master. * Remove fine-grained build task scripts. * Added back Jacoco reporting. * Revert jdk8u-deterministic module. * Incorporating changes from PR review feedback. * Workaround Jacoco issue associated with Gradle Build Cache test task. * Update init script. * Remove redundant build-scan declarations. * Updates from PR review feedback. * Remove GRADLE_HOME as no longer needed - everything is driven via gradle wrapper. * Use CORDA prefix in system environment variable.
2018-09-26 12:38:23 +00:00
apply from: 'buildCacheSettings.gradle'
include 'detekt-plugins'
[EG-440] Add some error codes and the error resource generation tool (#6192) * [EG-438] First commit of error code interface * [EG-438] Implement error reporter and a few error codes * [EG-438] Add unit tests and default properties files * [EG-438] Add the error table builder * [EG-438] Update initial properties files * [EG-438] Add some Irish tests and the build.gradle * [EG-438] Fall back for aliases and use different resource strategy * [EG-438] Define the URL using a project-specific context * [EG-438] Tidy up initialization code * [EG-438] Add testing to generator and tidy up * [EG-438] Remove direct dependency on core and add own logging config * [EG-438] Fix compiler warnings and tidy up logging * [EG-438] Fix detekt warnings * [EG-438] Improve error messages * [EG-438] Address first set of review comments * [EG-438] Use enums and a builder for the reporter * [EG-438] Address first set of review comments * [EG-438] Use enums and a builder for the reporter * [EG-438] Add kdocs for error resource static methods * [EG-440] Add error code for duplicate CorDapp loading * [EG-438] Handle enums defined with underscores * [EG-440] Add errors for some CorDapp loading scenarios * [EG-440] Finish adding errors for CorDapp loading * [EG-440] Fix up errors in properties files * [EG-440] Start change to error code definition * [EG-440] Update error code definition and add resource generation tool * [EG-440] Tidy up error resource generation tool frontend * [EG-440] Small refactorings and add kdocs * [EG-440] Generate all missing resources * [EG-440] Some refactoring and start writing a test * [EG-440] Update unit test for resource generator * [EG-440] Renaming of various parts of the error tool * [EG-440] Add testing for errors and fix an issue in resource generation * [EG-440] Add a kdoc for context provider API * [EG-440] Remove old code from repository * [EG-440] Address some review comments
2020-04-29 10:21:50 +00:00
include 'tools:error-tool'