diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..520d2a04af --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://editorconfig.org + +root = true + +[*.php] +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.bat] +end_of_line = crlf diff --git a/.gitignore b/.gitignore index 6735850e2b..1ace7a7039 100644 --- a/.gitignore +++ b/.gitignore @@ -441,3 +441,6 @@ samples/features/sql-management-objects/src/out/CodeCoverage/CodeCoverage.config # Certificates *.pem *.p12 + +# Composer +/vendor/ diff --git a/README.md b/README.md index da39fe852b..a33290fd8d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -![](./media/solutions-microsoft-logo-small.png) +![](./media/solutions-microsoft-logo-small.png) -# SQL Server Samples Repository -This GitHub repository contains code samples that demonstrate how to use Microsoft's SQL products including SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. Each sample includes a README file that explains how to run and use the sample. +# Azure Data SQL Samples Repository +This GitHub repository contains code samples that demonstrate how to use Microsoft's Azure Data products including SQL Server, Azure SQL Database, Azure Synapse, and Azure SQL Edge. Each sample includes a README file that explains how to run and use the sample. Note that certain features like In-Memory OLTP are edition specific for SQL Server and would be possible to implement if the edition which supports that feature is being used to run the sample. diff --git a/composer.json b/composer.json new file mode 100644 index 0000000000..f5c8f0b3d5 --- /dev/null +++ b/composer.json @@ -0,0 +1,17 @@ +{ + "name": "microsoft/sql-server-samples", + "description": "Official Microsoft GitHub Repository containing code samples for SQL Server", + "type": "project", + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "squizlabs/php_codesniffer": "^3.5" + }, + "license": "MIT", + "minimum-stability": "stable", + "scripts": { + "cs-check": "phpcs -p --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1", + "cs-fix": "phpcbf -p --runtime-set ignore_errors_on_exit 1 --runtime-set ignore_warnings_on_exit 1" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000000..2a25733c91 --- /dev/null +++ b/composer.lock @@ -0,0 +1,72 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "49a34ccb792321ec81984328df884636", + "packages": [], + "packages-dev": [ + { + "name": "squizlabs/php_codesniffer", + "version": "3.5.5", + "source": { + "type": "git", + "url": "/~https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6", + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "/~https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "time": "2020-04-17T01:09:41+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=7.0.0" + }, + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/phpcs.xml.dist b/phpcs.xml.dist new file mode 100644 index 0000000000..b7ca31864a --- /dev/null +++ b/phpcs.xml.dist @@ -0,0 +1,52 @@ + + + The coding standard for MS SQL Server PHP Examples. + + + samples/tutorials/php + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/databases/wide-world-importers/sample-scripts/polybase/DemonstratePolybase.sql b/samples/databases/wide-world-importers/sample-scripts/polybase/DemonstratePolybase.sql deleted file mode 100644 index 2675074f8c..0000000000 --- a/samples/databases/wide-world-importers/sample-scripts/polybase/DemonstratePolybase.sql +++ /dev/null @@ -1,139 +0,0 @@ --- Demonstrate WorldWideImporters Polybase connections --- Requires PolyBase to be installed. - -USE WideWorldImportersDW; -GO - --- WideWorldImporters have customers in a variety of cities but feel they are likely missing --- other important cities. They have decided to try to find other cities have a growth rate of more --- than 20% over the last 3 years, and where they do not have existing customers. --- They have obtained census data (a CSV file) and have loaded it into an Azure storage account. --- They want to combine that data with other data in their main OLTP database to work out where --- they should try to find new customers. - --- First, let's apply Polybase connectivity and set up an external table to point to the data --- in the Azure storage account. - -EXEC [Application].Configuration_ApplyPolybase; -GO - --- In Object Explorer, refresh the WideWorldImporters database, then expand the Tables node. --- Note that SQL Server 2016 added a new entry here for External Tables. Expand that node. --- Expand the dbo.CityPopulationStatistics table, expand the list of columns and note the --- values that are contained. Let's look at the data: - -SELECT CityID, StateProvinceCode, CityName, YearNumber, LatestRecordedPopulation FROM dbo.CityPopulationStatistics; -GO - --- How did that work? First the procedure created an external data source like this: -/* - -CREATE EXTERNAL DATA SOURCE AzureStorage -WITH -( - TYPE=HADOOP, LOCATION = 'wasbs://data@sqldwdatasets.blob.core.windows.net' -); - -*/ --- This shows how to connect to AzureStorage. Next the procedure created an --- external file format to describe the layout of the CSV file: -/* - -CREATE EXTERNAL FILE FORMAT CommaDelimitedTextFileFormat -WITH -( - FORMAT_TYPE = DELIMITEDTEXT, - FORMAT_OPTIONS - ( - FIELD_TERMINATOR = ',' - ) -); - -*/ --- Finally the external table was defined like this: -/* - -CREATE EXTERNAL TABLE dbo.CityPopulationStatistics -( - CityID int NOT NULL, - StateProvinceCode nvarchar(5) NOT NULL, - CityName nvarchar(50) NOT NULL, - YearNumber int NOT NULL, - LatestRecordedPopulation bigint NULL -) -WITH -( - LOCATION = '/', - DATA_SOURCE = AzureStorage, - FILE_FORMAT = CommaDelimitedTextFileFormat, - REJECT_TYPE = VALUE, - REJECT_VALUE = 4 -- skipping 1 header row per file -); - -*/ --- From that point onwards, the external table can be used like a local table. Let's run that --- query that they wanted to use to find out which cities they should be finding new customers --- in. We'll start building the query by grouping the cities from the external table --- and finding those with more than a 20% growth rate for the period: - -WITH PotentialCities -AS -( - SELECT cps.CityName, - cps.StateProvinceCode, - MAX(cps.LatestRecordedPopulation) AS PopulationIn2016, - (MAX(cps.LatestRecordedPopulation) - MIN(cps.LatestRecordedPopulation)) * 100.0 - / MIN(cps.LatestRecordedPopulation) AS GrowthRate - FROM dbo.CityPopulationStatistics AS cps - WHERE cps.LatestRecordedPopulation IS NOT NULL - AND cps.LatestRecordedPopulation <> 0 - GROUP BY cps.CityName, cps.StateProvinceCode -) -SELECT CityName, StateProvinceCode, PopulationIn2016, GrowthRate -FROM PotentialCities -WHERE GrowthRate > 2.0; -GO - --- Now let's combine that with our local city and sales data to exclude those where we already --- have customers. We'll find the 100 most interesting cities based upon population. - -WITH PotentialCities -AS -( - SELECT cps.CityName, - cps.StateProvinceCode, - MAX(cps.LatestRecordedPopulation) AS PopulationIn2016, - (MAX(cps.LatestRecordedPopulation) - MIN(cps.LatestRecordedPopulation)) * 100.0 - / MIN(cps.LatestRecordedPopulation) AS GrowthRate - FROM dbo.CityPopulationStatistics AS cps - WHERE cps.LatestRecordedPopulation IS NOT NULL - AND cps.LatestRecordedPopulation <> 0 - GROUP BY cps.CityName, cps.StateProvinceCode -), -InterestingCities -AS -( - SELECT DISTINCT pc.CityName, - pc.StateProvinceCode, - pc.PopulationIn2016, - FLOOR(pc.GrowthRate) AS GrowthRate - FROM PotentialCities AS pc - INNER JOIN Dimension.City AS c - ON pc.CityName = c.City - WHERE GrowthRate > 2.0 - AND NOT EXISTS (SELECT 1 FROM Fact.Sale AS s WHERE s.[City Key] = c.[City Key]) -) -SELECT TOP(100) CityName, StateProvinceCode, PopulationIn2016, GrowthRate -FROM InterestingCities -ORDER BY PopulationIn2016 DESC; -GO - --- Clean up if required -/* -DROP EXTERNAL TABLE dbo.CityPopulationStatistics; -GO -DROP EXTERNAL FILE FORMAT CommaDelimitedTextFileFormat; -GO -DROP EXTERNAL DATA SOURCE AzureStorage; -GO -*/ diff --git a/samples/databases/wide-world-importers/sample-scripts/polybase/README.md b/samples/databases/wide-world-importers/sample-scripts/polybase/README.md deleted file mode 100644 index ed632cce62..0000000000 --- a/samples/databases/wide-world-importers/sample-scripts/polybase/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Sample Querying of External Data Source in WideWorldImportersDW - -This script demonstrates the use of PolyBase to query an external data source. - -Demographics data is available in Azure blob storage. This data is joined with sales data recorded in the local database to determine which would be good candidates for future expansion of the business. - -### Contents - -[About this sample](#about-this-sample)
-[Before you begin](#before-you-begin)
-[Running the sample](#run-this-sample)
-[Sample details](#sample-details)
-[Disclaimers](#disclaimers)
-[Related links](#related-links)
- - - - -## About this sample - - -1. **Applies to:** SQL Server 2016 (or higher), Azure SQL Database -1. **Key features:** PolyBase -1. **Workload:** Analytics -1. **Programming Language:** T-SQL -1. **Authors:** Greg Low, Jos de Bruijn -1. **Update history:** 26 May 2016 - initial revision - - - -## Before you begin - -To run this sample, you need the following prerequisites. - -**Software prerequisites:** - - -1. SQL Server 2016 (or higher) with PolyBase, connected to the internet. -2. SQL Server Management Studio -3. The WideWorldImportersDW database (Full version). - - - -## Running the sample - -1. Execute the sample script. - -2. Inspect external tables in the database. - -3. Review query results. - -## Sample details - -The sample script performs a configuration and runs three queries: - -1. An external table `dbo.CitePopulationStatistics` is created in the database, pointing to a data set in Azure blob storage. - -2. The data in Azure storage is queried through Transact-SQL, showing all the data in the data source. - -3. Cities with a significant growth rate (>= 20%) are identified. - -4. Top cities for potential expansion are identified based on external data as well as sales data in the local database. - - - -## Disclaimers -The code included in this sample is not intended to be used for production purposes. - - - -## Related Links - -For more information, see these articles: -- [Get started with PolyBase](https://msdn.microsoft.com/library/mt163689.aspx) -- [PolyBase: Gaining insights from HDFS and relational data in SQL Server 2016 (video)](https://channel9.msdn.com/Events/DataDriven/SQLServer2016/PolyBase) diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitattributes b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitattributes new file mode 100644 index 0000000000..8c405ec384 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitattributes @@ -0,0 +1,10 @@ +* text eol=lf +*.gif -text +*.jpg -text +*.png -text +*.dll -text +*.exe -text +*.nupkg -text +ml/data/*.parquet binary +*.zip binary +*.dacpac binary \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitignore new file mode 100644 index 0000000000..31aa3f7b42 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/.gitignore @@ -0,0 +1,447 @@ +.DS_Store +temp/ + +# Created by https://www.gitignore.io/api/node,visualstudio,visualstudiocode +# Edit at https://www.gitignore.io/?templates=node,visualstudio,visualstudiocode + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history + +### VisualStudio ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from /~https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (/~https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (/~https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# End of https://www.gitignore.io/api/node,visualstudio,visualstudiocode \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/README.md new file mode 100644 index 0000000000..d18d404f50 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/README.md @@ -0,0 +1,468 @@ +# Azure SQL Edge Demo + +## Overview + +The Azure SQL Edge demo is based on a Contoso Renewable Energy, a wind turbine farm that leverages Azure SQL Edge for data processing onboard the generator. + +The demo will walk you through resolving an alert being raised due to wind turbulence being detected at the device. You will train a model and deploy it to SQL DB Edge that will correct the detected wind wake and ultimately optimize power output. + +We will also look at some of the security features available with Azure SQL Edge. + +## Wind Turbine Data Explanation for the Wake Detection model + +The data stored in the database table represents the following: + + +* **RecordId:** _Unique identifier for the entry._ +* **TurbineId:** _Unique identifier for the turbine in scope._ +* **GearboxOilLevel:** _Oil level recorded for the turbine gear box at the time of the reading._ +* **GearboxOilTemp:** _Oil temperature recorded for the turbine gear box at the time of the reading._ +* **GeneratorActivePower:** _Active Power recorded by the turbine generator._ +* **GeneratorSpeed:** _Speed recorded by the turbine generator._ +* **GeneratorTemp:** _Temperature recorded by the turbine generator._ +* **GeneratorTorque:** _Torque recorded by the turbine generator._ +* **GridFrequency:** _Frequency recorded in the grid for the specific wind turbine._ +* **GridVoltage:** _Voltage recorded in the grid for the specific wind turbine._ +* **HydraulicOilPressure:** _Current pressure of the hydraulic oil for the wind turbine._ +* **NacelleAngle:** _Angle of the nacelle at the time of the reading (the housing that contains all the generating components)._ +* **PitchAngle:** _Pitch angle of the blades against the oncoming air stream to obtain the optimal amount of energy._ +* **Vibration:** _Vibration of the wind turbine at the time of the reading._ +* **WindSpeedAverage:** _Average wind speed calculated from the last X records._ +* **Precipitation:** _Flag to represent if rain was present at the time of the reading._ +* **WindTempAverage:** _Average wind temperature calculated from the last X records._ +* **OverallWindDirection:** _Overall wind direction recorded at the time of the reading._ +* **TurbineWindDirection:** _Turbine wind direction recorded at the time of the reading._ +* **TurbineSpeedAverage:** _Average turbine speed calculated from the last X records._ +* **WindSpeedStdDev:** _Standard Deviation of the last X WindSpeedAverage records._ +* **TurbineSpeedStdDev:** _Standard Deviation of the last X TurbineSpeedAverage records._ + +The above dataset definition contains trends that will enable us to detect the existence of wake in a wind turbine. There are two main conditions that influence the presence of wind wake: + +1. Overall wind farm and turbine wind direction are both between 40° - 45° degrees. +1. TurbineSpeedStdDev and WindSpeedStdDev have been too far apart for greater than a minute. + +The wind turbine will experience wake when the turbine wind direction is between 40° - 45° degrees and the values of TurbineSpeedStdDev and WindSpeedStdDev are not similar. For example: +* Wake Present: + * TurbineWindDirection = 43.5° + * TurbineSpeedStdDev = 8.231 + * WindSpeedStdDev = 0.23 +* Wake Not Present: + * TurbineWindDirection = 23.5° + * TurbineSpeedStdDev = 0.921 + * WindSpeedStdDev = 0.213 + + + +## Azure Resource Deployment + +An Azure Resource Manager (ARM) template will be used to deploy all the required resources in the solution. Click on the link below to start the deployment. + +[![homepage](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/deploytoazure.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fzarmada.blob.core.windows.net%2Farm-deployments-public%2Farm-template-dbedge.json "Deploy template") + +TODO ^^ Need to update the ARM location + +### Deployment of resources + +Follow the steps to deploy the required Azure resources: + +**BASICS** + + - **Subscription**: Select the Subscription. + - **Resource group**: Click on 'Create new' and provide a unique name for the Resource Group + - **Location**: Select the Region where to deploy the resources. Keep in mind that all resources will be deployed to this region so make sure it supports all of the required services. The template has been confirmed to work in West US 2. + +1. Read and accept the `TERMS AND CONDITIONS` by checking the box. +1. Click the `Purchase` button and wait for the deployment to finish. + +## Post Deployment Configuration + +Some resources require some extra configuration. + +#### Upload SQL DACPAC + +The Edge Module will require access the DACPAC package in order to setup the database. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **Storage account** resource from the list. +1. Click the **Containers** option in the left menu under **Blob service**. +1. Click the **dacpac** container. +1. Click the **Upload** button. +1. Click the **Select a file** input and select the file under the project folder: `sql/turbine-sensor-db-dacpac.zip`. +1. Click the **Upload** button. +1. Once the file is uploaded, click on it. +1. Click **Generate SAS** tab. +1. Update the **Expiry** year to 2050. +1. Click **Generate SAS token and URL** +1. Copy the value in **Blob SAS URL** and save it for later in the setup. + + +##### SQL Security Setup Information + +As security settings were deployed as part of the DACPAC package, below is a **review** of the security setup within the database. + +1. Create users without a login for simpler testing: + ```sql + /* Create users using the logins created */ + CREATE USER OperatorUser WITHOUT LOGIN; + CREATE USER DataScientistUser WITHOUT LOGIN; + CREATE USER SecurityUser WITHOUT LOGIN; + CREATE USER TurbineUser WITHOUT LOGIN; + ``` + +1. Assigned permissions for each user: + ```sql + /* Grant permissions to users */ + GRANT SELECT ON RealtimeSensorRecord TO OperatorUser; + GRANT SELECT ON RealtimeSensorRecord TO DataScientistUser; + GRANT SELECT ON RealtimeSensorRecord TO SecurityUser; + GRANT SELECT, INSERT ON RealtimeSensorRecord TO TurbineUser; + ``` + > **Note**: All users can SELECT, however the TurbineUser can also INSERT to the table. + +1. For privacy reasons, mask the last 4 digits of the SensorId for the Data Scientist user: + ```sql + /*Mask the last four digits of the serial number (Sensor ID) for the Data Scientist User*/ + ALTER TABLE RealtimeSensorRecord + ALTER COLUMN SensorId varchar(50) MASKED WITH (FUNCTION = 'partial(34,"XXXX",0)'); + DENY UNMASK TO DataScientistUser; + GO + ``` + +1. Add a policy using a filter predicate and a function to manage access to data events: + * We updated the SensorType column as it is required in our function then created a new schema to store it. + + ```sql + /** + * Operator: Can see all events + * Data Scientist: Can see everything BUT Hatch Sensor events + * Security: Can ONLY see Hatch Sensor events + */ + ALTER TABLE RealtimeSensorRecord + ALTER COLUMN SensorType sysname + GO + + CREATE SCHEMA Security; + GO + ``` + * Add the function that will ensure each query is authorized based on Sensor Type/User. + + + ```sql + /** + * Operator: Can see all events + * Data Scientist: Can see everything BUT Hatch Sensor events + * Security: Can ONLY see Hatch Sensor events + */ + CREATE FUNCTION Security.fn_securitypredicate(@SensorType AS sysname) + RETURNS TABLE + WITH SCHEMABINDING + AS + RETURN SELECT 1 AS fn_securitypredicate_result + WHERE + USER_NAME() = 'OperatorUser' OR USER_NAME() = 'dbo' OR + (USER_NAME() = 'DataScientistUser' AND @SensorType <> 'HatchSensor') OR + (USER_NAME() = 'SecurityUser' AND @SensorType = 'HatchSensor'); + ``` + * Add a filter to to use the function. + + + ```sql + CREATE SECURITY POLICY SensorsDataFilter + ADD FILTER PREDICATE Security.fn_securitypredicate(SensorType) + ON dbo.RealtimeSensorRecord + WITH (STATE = ON); + ``` + + + +#### Notebook Setup + +In this section, we will setup our notebook with the required files for the generation of the wind adapt model. + +##### Upload training data file: + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **Storage account** resource. +1. Click the **Containers** option in the left menu under **Blob service**. +1. Click the **azureml-blobstore-GUID** container. +1. Click the **Upload** button in the top. +1. Click the **Select a file** input and select the `ml\data\TrainingDataset.parquet` from your repo. +1. Click the **Upload** button and wait for the upload to finish. + +##### Notebook files upload +1. Select **Azure Active Directory** option from the main navigation in the Azure Portal: + + ![Azure Active Directory Option](./images/azure-active-directory-option.png) +1. Copy the **Tenant Id** value from the overview as you will need this value later. +1. Go back to the **Resource Group** you created earlier. +1. Select the **Machine Learning** resource. +1. Take note of the following values to be used later in the deployment + * Resource Group + * Workspace Name + * Subscription ID + ![Machine Learning Resource](./images/machine-learning-resource.png) +1. Click the **Launch now** button to open the Machine Learning workspace. +1. Click the **Notebooks** option in the left menu under **Author**. +1. Click the **Create new folder** button at the top of the navigation panel. +1. Enter the name `scripts` for as the folder name and click the **Create** button. +1. Click the **Upload files** button at the top of the navigation panel. +1. Select the 2 files inside the `ml\scripts` folder: + * ml\scripts\train.py + * ml\scripts\utils.py +1. Select the newly created `scripts` folder from the target directory list. +1. Click the **Upload** button and wait for the upload to finish. +1. Click the **Upload files** button again. +1. Select the following 2 files inside the `ml` folder: + * ml\utils.py + * ml\wind-turbine-scikit.ipynb + > **Note**: The `utils.py` is a different file from the previous step. + +1. Select your username folder from the target directory list. +1. Click the **Upload** button. + +##### Notebook configuration + +We need configure values within the notebook before being able to execute it: + +1. Click the `wind-turbine-scikit.ipynb` in the **My files** navigation: +1. Click the **New Compute** button. +1. Enter the name `compute-{your-initials}`. +1. Select **CPU (Central Processing Unit)** from the **Virtual machine type** dropdown. +1. Select the virtual machine size **Standard_D12_v2**. +1. Click the **Create** button and wait for the compute to be created. + > **Note**: This process can take several minutes; wait until status of **compute** is `Running`. +1. Click the **Edit** dropdown and select the **Edit in Jupyter** option. + > **Note**: If required, login with your Azure credentials. +1. Replace the values within the **Setup Azure ML** cell with the values you obtained in the **Notebook files upload** section: + ``` + interactive_auth = InteractiveLoginAuthentication(tenant_id="") + # Get instance of the Workspace and write it to config file + ws = Workspace( + subscription_id = '', + resource_group = '', + workspace_name = '', + auth = interactive_auth) + ``` +1. Click **File** > **Save and Checkpoint** from the menu. +1. Select the **Install requirements** cell and click **Run** from the menu, wait for the script to execute before continuing. +1. Select the **Setup Azure ML** cell and click **Run** from the menu. + > **IMPORTANT**: Observe the output to **authenticate** via the URL provided (https://microsoft.com/devicelogin). + +1. From here, **Run** the remaining cells sequentially until you have executed the notebook. + > **IMPORTANT**: Remember to wait for each cell to execute before continuing. +1. Go back to the azure resource group and click the **Storage Account** resource. +1. Click the **Containers** option in the left menu. +1. Click the container in the list with a name like: `azureml-blobstore-{guid}`. +1. A new file with the name `windturbinewake.model.onnx` will be in the container. +1. Click the `windturbinewake.model.onnx` file +1. Click the **Generate SAS** tab option. +1. Change the **Expiry** Year to 2050. +1. Click the **Generate SAS token and URL** button and wait for the SAS to be generated. +1. Copy the **Blob SAS URL** value for later in the demo usage section. + + > **IMPORTANT**: As this process does take some time, once you have saved your model to blob storage, you will not be required to execute this every time you run through the demo. Showing the notebook flow may be adequate for demo purposes. You will just need the blob SAS for the **SQL DB Edge Demo Usage** section later in the document. + + +#### Device Setup + +In this section, we will set up an Edge device within our IoT Hub instance. + +##### Create a new Edge device + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **IoT Hub** resource. +1. Click on **IoT Edge** from the left navigation. +1. Click **+ Add an IoT Edge Device**. +1. Enter a **Device ID** and leave all other fields as default. +1. Click **Save**. +1. Once the device has been created, select the device and copy the **Primary Connection String** for later in this setup. + +##### Setup Edge device as a VM + +1. Click on the link below to start the deploy to Azure: + + [![homepage](https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/1-CONTRIBUTION-GUIDE/images/deploytoazure.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Fazure%2Fiotedge-vm-deploy%2Fmaster%2FedgeDeploy.json "Deploy device") + +1. On the newly launched window, fill in the available form fields: + + * **Subscription**: Your subscription. + * **Resource group**: Select the resource group you created earlier. + * **DNS Label Prefix**: Your initials and birth year. + * **Admin Username**: Enter `microsoft` as default. + * **Device Connection String**: The device connection string that you got from previous section. + * **VM Size**: The size of the virtual machine to be deployed. + * **Ubuntu OS Version**: The version of the Ubuntu OS to be installed on the base virtual machine. + * **Location**: The geographic region to deploy the virtual machine into, this value defaults to the location of the selected Resource Group. + * **Authentication Type**: Choose the **password** option. + * **Admin Password or Key**: Enter `M1cr0s0ft2020`. + +1. Accept the **Terms and Conditions**. +1. Select **Purchase** to begin the deployment. + +##### SSH into the VM - Optional +1. Once the deployment is complete, go back to the **Resource Group** you created earlier. +1. Select the **Virtual Machine** resource. + > **Note**: Take note of the machine name, this should be in the format vm-0000000000000. Also, take note of the associated DNS Name, which should be in the format `..cloudapp.azure.com`. + The DNS Name can be obtained from the Overview section of the newly deployed virtual machine within the Azure portal. + ![VM DNS Name](./images/iotedge-vm-dns-name.png) + + +1. If you want to SSH into this VM after setup, use the associated DNS Name with the command: `ssh @`. You can use the password you created in the previous step. + > **IMPORTANT**: There is an optional section at the end of this document showing some example commands. + + +##### Setup Visual Studio Code Development Environment + +1. Install [Visual Studio Code](https://code.visualstudio.com/Download) (VS Code). +1. Install [Docker Community Edition (CE)](https://docs.docker.com/install/#supported-platforms). Don't sign in to Docker Desktop after Docker CE is installed. +1. Install the following extensions for VS Code: + * [Azure Machine Learning](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.vscode-ai) ([Azure Account](https://marketplace.visualstudio.com/items?itemName=ms-vscode.azure-account) will be automatically installed) + * [Azure IoT Hub Toolkit](https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.azure-iot-toolkit) + * [Azure IoT Edge](https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.azure-iot-edge) + * [Docker Extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) +1. Restart VS Code. +1. Select **[View > Command Palette…]** to open the command palette box, then enter **[Python: Select Interpreter]** command in the command palette box to select your Python interpreter. +1. Enter **[Azure: Sign In]** command in the command palette box to sign in Azure account and select your subscription. + +##### Build and deploy container image to device + +1. Launch Visual Studio Code, and select File > Open Workspace... command to open the `edge\sensor-solution.code-workspace`. +1. Update the .env file with the values for your container registry. + - In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. + - Select the **Container Registry** resource. + - Select **Access Keys** from the left navigation. + - Update the following in `edge/SensorSolution/.env` with the following values from **Access Keys** within the Container Registry: + + CONTAINER_REGISTRY_NAME=`` (Ensure this is the login server and NOT the Registry Name) + + CONTAINER_REGISTRY_USER_NAME=`` + + CONTAINER_REGISTRY_PASSWORD=`` + + SQL_PACKAGE=`` (the one you obtained earlier in the setup) + + - Save the file. +1. Sign in to your Azure Container Registry by entering the following command in the Visual Studio Code integrated terminal (replace , , and with your container registry values set in the .env file IN THE PREVIOUS STEP). + + `docker login -u -p ` + + > **IMPORTANT**: Ensure you have `amd64` selected as the architecture in the bottom navigation bar of VS Code. + +1. Right-click on `edge/SensorSolution/deployment.debug.template.json` and select the **Build and Push IoT Edge Solution** command to generate a new `deployment.debug.amd64.json` file in the config folder, build a module image, and push the image to the specified ACR repository. + > **IMPORTANT:** If you have amended code in your module, you will need to increment the version number in `module.json` so the new version will get deployed to the device in the next steps. + + > **Note**: Some red warnings "/usr/bin/find: '/proc/XXX': No such file or directory" and "debconf: delaying package configuration, since apt-utils is not installed" displayed during the building process can be ignored. + +1. Ensure you have the correct Iot Hub selected in VS Code. + - In the Azure IoT Hub extension, click **Select IoT Hub** from the hamburger menu. (Alternatively, select `Azure IoT Hub: Select IoT Hub` from the **Command Palette**) + - Select your **Subscription**. + - Select the **IoT Hub** you created earlier in the setup. +1. Right-click `config\deployment.debug.amd64.json` and select **Create Deployment for a Single Device**. +1. Select the device you created earlier. +1. Wait for deployment to be completed. + +#### Web App Settings + +Follow the next steps to setup the required module twin connection string property. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **IoT Hub** resource. +1. Click the **IoT Edge** option in the left menu under **Automatic Device Management**. +1. Click the **device** you created earlier. +1. Click the **SensorModule** from the modules list. +1. Copy the **Connection string (primary key)** value and save for the next step. +1. Go back to your **Resource Group**. +1. Select the **App Service** resource. +1. Click the **Configuration** option in the left menu. +1. Under the **Application settings** find the `IoTHub:ModuleConnectionString` and click it. +1. Paste the module connection string that you got before to the `value` input field. +1. Click the **OK** button. +1. Click the **Save** button on the top to apply the change. + +## SQL DB Edge Demo Usage + +Open the Web App. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +1. Select the **App Service** resource. +1. Click **Browse** to go the application on a desktop machine. + +Investigate Turbine Issue +1. Click **view** on the alert. A query is ran against the SQL DB Edge instance. +1. Notice the Operator can't see the Security Alert due to as the permissions we set earlier. +1. You can notice a drop in the **Power Generated** chart. +1. Click the **Environmental** button. +1. You can notice the **Wind Speed and Direction** at the turbine is a lot more turbulent than the rest of the Wind Farm. This could indicate wind wake. + +Now we need to run our notebook in order to generate the Onnx model that we will use to resolve the alert. + +>**Important**: As mentioned earlier in the document, you can choose to run through executing the notebook cells in the `Notebook Setup` section again to obtain the model. Or you can use your Blob URL you created during the initial setup. + +Now we have our wind adapt model, lets update the module to correct the turbine. + +1. Go back to the azure resource group and click the **IoT Hub** resource. +1. Click the **Iot Edge** option in the left menu. +1. Click the created device from previous steps. +1. Click the **SensorModule** from the modules list. +1. Click the **Module Identity Twin** option in the top menu. +1. Find the `properties` section in the json. +1. Find the `desired` section in the json. +1. Find the `OnnxModelUrl` property and update the value with the model Blob URL from the previous section. +1. Click the **Save** button. +1. Go back to the **Web App**. +1. You will notice a notification indicating the alert has been resolved. +1. Click on the **Resfresh** button. +1. Notice the turbine **Wind Speed and Direction** has stabilized. +1. If you go back to the dashboard view. You will notice Unit 34 no longer has an alert. + + +#### Restart the demo + +This steps allows you to restart the demo. + +1. Go back to the azure resource group and click the **IoT Hub** resource. +1. Click the **Iot Edge** option in the left menu. +1. Click the created device from previous steps. +1. Click the **SensorModule** from the modules list. +1. Click the **Module Identity Twin** option in the top menu. +1. Find the `properties` section in the json. +1. Find the `desired` section in the json. +1. Find the `OnnxModelUrl` property set the value as empty. +> **Note**: Since the `Alert` property value was already in `start` we don't need to updated it but the module will set the reported property with this value. + +1. Click the **Save** button. +1. Go back to the **Web App** and refresh. +1. After a short time the alert will appear again. + +# Optional Steps + +This section describe steps that allow us to see extra features of the resources as a reference only. + +## Device VM access + +Here we will see how to run commands into to the device virtual machine from the terminal using SSH connection. + +1. In the [Azure portal](https://portal.azure.com/) select the **Resource Group** you created earlier. +2. Select the **Virtual machine** resource. +3. Copy the **DNS name** to use it for the connection. +4. In a terminal run the following command replacing the **DNS name**:` ssh microsoft@` + > **Note**: The above command is assuming that you use the default Admin username when deploying the VM. + +5. Enter the password to connect. + > **Note**: Default password is: `M1cr0s0ft2020` + +6. Run the following command to see the list of modules running: `sudo iotedge list` + > **Note**: You can should be able to see the `AzureSQLDatabaseEdge` and `SensorModule` we deployed earlier. + +7. Run the following command to see the logs of the **Sensor Module**: `sudo iotedge logs SensorModule` + * Following we will connect with the edge sql server to run a simple query by doing: + * Get the list of containers running with docker: `sudo docker container list`. + * Get the container ID of the `AzureSQLDatabaseEdge` docker image running. + * Connect to the container using the id that you got and the command: `sudo docker exec -it CONTAINERID /bin/sh`. + * Connect to the container using: `/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Microsoft2020$'`. + * Connect to the database using: `USE [turbine-sensor-db]` and then `go`. + * Query the number of records in the table using: `select count(*) from RealtimeSensorRecord` and `go`. + +# Troubleshooting +### Error when deploying ARM Template +We've seen issues with different subscription types: MSDN, AIRS, etc... not being able to deploy certain resources to certain regions. We've found that deploying to West US 2 works consistently. If you have a deployment error, try deploying to West US 2. The resources inherit their deployment region from the Resource Group location. diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/deployment/arm-template.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/deployment/arm-template.json new file mode 100644 index 0000000000..fe3b99e168 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/deployment/arm-template.json @@ -0,0 +1,383 @@ +{ + "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", + "contentVersion": "1.0.0.0", + "parameters": { + }, + "variables": { + "prefix": "sqldbedge", + "uniquePrefix": "[concat(variables('prefix'), substring(uniqueString(resourceGroup().id), 0, 6))]", + "registry": { + "name": "[concat(variables('uniquePrefix'), 'registry')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'registry'))]", + "vault": { + "name": "[concat(variables('uniquePrefix'), 'vault')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'vault'))]" + } + }, + "storage": { + "name": "[concat(variables('uniquePrefix'), 'storage')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'storage'))]" + }, + "ml": { + "name": "[concat(variables('uniquePrefix'), 'ml')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'ml'))]" + }, + "insights": { + "component": { + "name": "[concat(variables('uniquePrefix'), 'insightscomp')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'insightscomp'))]" + } + }, + "sqldbedgehub": { + "name": "[concat(variables('uniquePrefix'), 'sqldbedgehub')]", + "id": "[concat(resourceGroup().id,'/providers/','Microsoft.Storage/storageAccounts/', concat(variables('uniquePrefix'), 'sqldbedgehub'))]" + }, + "website": { + "name": "[concat(variables('uniquePrefix'), 'app')]", + "serverfarms": { + "name": "[concat(variables('uniquePrefix'), 'serverfarms')]" + } + } + }, + "resources": [ + { + "type": "Microsoft.ContainerRegistry/registries", + "apiVersion": "2019-12-01-preview", + "name": "[variables('registry').name]", + "location": "[resourceGroup().location]", + "sku": { + "name": "Basic", + "tier": "Basic" + }, + "properties": { + "adminUserEnabled": true, + "policies": { + "quarantinePolicy": { + "status": "disabled" + }, + "trustPolicy": { + "type": "Notary", + "status": "disabled" + }, + "retentionPolicy": { + "days": 7, + "status": "disabled" + } + }, + "encryption": { + "status": "disabled" + }, + "dataEndpointEnabled": false + } + }, + { + "type": "microsoft.insights/components", + "apiVersion": "2015-05-01", + "name": "[variables('insights').component.name]", + "location": "[resourceGroup().location]", + "kind": "web", + "properties": { + "Application_Type": "web" + } + }, + { + "type": "Microsoft.Storage/storageAccounts", + "apiVersion": "2019-06-01", + "name": "[variables('storage').name]", + "location": "[resourceGroup().location]", + "sku": { + "name": "Standard_LRS", + "tier": "Standard" + }, + "kind": "StorageV2", + "properties": { + "networkAcls": { + "bypass": "AzureServices", + "virtualNetworkRules": [], + "ipRules": [], + "defaultAction": "Allow" + }, + "supportsHttpsTrafficOnly": false, + "encryption": { + "services": { + "file": { + "keyType": "Account", + "enabled": true + }, + "blob": { + "keyType": "Account", + "enabled": true + } + }, + "keySource": "Microsoft.Storage" + } + } + }, + { + "type": "Microsoft.Storage/storageAccounts/blobServices", + "apiVersion": "2019-06-01", + "name": "[concat(variables('storage').name, '/default')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]" + ], + "sku": { + "name": "Standard_RAGRS", + "tier": "Standard" + }, + "properties": { + "cors": { + "corsRules": [] + }, + "deleteRetentionPolicy": { + "enabled": false + } + } + }, + { + "type": "Microsoft.Storage/storageAccounts/fileServices", + "apiVersion": "2019-06-01", + "name": "[concat(variables('storage').name, '/default')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]" + ], + "sku": { + "name": "Standard_RAGRS", + "tier": "Standard" + }, + "properties": { + "cors": { + "corsRules": [] + } + } + }, + { + "type": "Microsoft.Storage/storageAccounts/blobServices/containers", + "apiVersion": "2019-06-01", + "name": "[concat(variables('storage').name, '/default/dacpac')]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts/blobServices', variables('storage').name, 'default')]", + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]" + ], + "properties": { + "publicAccess": "None" + } + }, + { + "type": "Microsoft.KeyVault/vaults", + "apiVersion": "2018-02-14", + "name": "[variables('registry').vault.name]", + "location": "[resourceGroup().location]", + "properties": { + "tenantId": "[subscription().tenantId]", + "enabledForDeployment": true, + "enabledForDiskEncryption": true, + "enabledForTemplateDeployment": true, + "sku": { + "name": "standard", + "family": "A" + }, + "networkAcls": { + "defaultAction": "Allow", + "bypass": "AzureServices" + }, + "accessPolicies": [] + } + }, + { + "type": "Microsoft.MachineLearningServices/workspaces", + "apiVersion": "2018-11-19", + "name": "[variables('ml').name]", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]", + "[resourceId('Microsoft.ContainerRegistry/registries', variables('registry').name)]", + "[resourceId('Microsoft.KeyVault/vaults', variables('registry').vault.name)]", + "[resourceId('microsoft.insights/components', variables('insights').component.name)]" + ], + "sku": { + "name": "Basic", + "tier": "Basic" + }, + "identity": { + "type": "SystemAssigned" + }, + "properties": { + "storageAccount": "[resourceId('Microsoft.Storage/storageAccounts', variables('storage').name)]", + "containerRegistry": "[resourceId('Microsoft.ContainerRegistry/registries', variables('registry').name)]", + "keyVault": "[resourceId('Microsoft.KeyVault/vaults', variables('registry').vault.name)]", + "applicationInsights": "[resourceId('microsoft.insights/components', variables('insights').component.name)]", + "discoveryUrl": "[concat('https://', resourceGroup().location, '.experiments.azureml.net/discovery')]" + } + }, + { + "type": "Microsoft.Devices/IotHubs", + "apiVersion": "2019-11-04", + "name": "[variables('sqldbedgehub').name]", + "location": "[resourceGroup().location]", + "sku": { + "name": "S1", + "tier": "Standard", + "capacity": 1 + }, + "properties": { + "ipFilterRules": [], + "eventHubEndpoints": { + "events": { + "retentionTimeInDays": 1, + "partitionCount": 4 + } + }, + "routing": { + "endpoints": { + "serviceBusQueues": [], + "serviceBusTopics": [], + "eventHubs": [], + "storageContainers": [] + }, + "routes": [], + "fallbackRoute": { + "name": "$fallback", + "source": "DeviceMessages", + "condition": "true", + "endpointNames": [ + "events" + ], + "isEnabled": true + } + }, + "storageEndpoints": {}, + "messagingEndpoints": { + "fileNotifications": { + "lockDurationAsIso8601": "PT1M", + "ttlAsIso8601": "PT1H", + "maxDeliveryCount": 10 + } + }, + "enableFileUploadNotifications": false, + "cloudToDevice": { + "maxDeliveryCount": 10, + "defaultTtlAsIso8601": "PT1H", + "feedback": { + "lockDurationAsIso8601": "PT1M", + "ttlAsIso8601": "PT1H", + "maxDeliveryCount": 10 + } + }, + "features": "None" + } + }, + { + "type": "Microsoft.Web/serverfarms", + "apiVersion": "2018-02-01", + "name": "[variables('website').serverfarms.name]", + "location": "[resourceGroup().location]", + "dependsOn": [ + ], + "sku": { + "name": "D1", + "tier": "Shared", + "size": "D1", + "family": "D", + "capacity": 0 + }, + "kind": "app", + "properties": { + "perSiteScaling": false, + "maximumElasticWorkerCount": 1, + "isSpot": false, + "reserved": false, + "isXenon": false, + "hyperV": false, + "targetWorkerCount": 0, + "targetWorkerSizeId": 0 + } + }, + { + "apiVersion": "2018-02-01", + "name": "[variables('website').name]", + "type": "Microsoft.Web/sites", + "location": "[resourceGroup().location]", + "dependsOn": [ + "[resourceId('Microsoft.Web/serverfarms', variables('website').serverfarms.name)]" + ], + "tags": null, + "properties": { + "name": "[variables('website').name]", + "enabled": true, + "hostNameSslStates": [{ + "name": "[concat(variables('website').name, '.azurewebsites.net')]", + "sslState": "Disabled", + "hostType": "Standard" + }, + { + "name": "[concat(variables('website').name, '.scm.azurewebsites.net')]", + "sslState": "Disabled", + "hostType": "Repository" + } + ], + "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('website').serverfarms.name)]", + "siteConfig": { + "appSettings": [{ + "name": "ApplicationInsightsAgent_EXTENSION_VERSION", + "value": "~2" + }, + { + "name": "XDT_MicrosoftApplicationInsights_Mode", + "value": "default" + }, + { + "name": "DiagnosticServices_EXTENSION_VERSION", + "value": "disabled" + }, + { + "name": "APPINSIGHTS_PROFILERFEATURE_VERSION", + "value": "disabled" + }, + { + "name": "APPINSIGHTS_SNAPSHOTFEATURE_VERSION", + "value": "disabled" + }, + { + "name": "InstrumentationEngine_EXTENSION_VERSION", + "value": "disabled" + }, + { + "name": "SnapshotDebugger_EXTENSION_VERSION", + "value": "disabled" + }, + { + "name": "XDT_MicrosoftApplicationInsights_BaseExtensions", + "value": "disabled" + }, + { + "name": "IoTHub:ModuleConnectionString", + "value": "" + } + ], + "metadata": [{ + "name": "CURRENT_STACK", + "value": "dotnetcore" + }] + }, + "clientAffinityEnabled": true + }, + "resources": [{ + "name": "MSDeploy", + "type": "extensions", + "location": "[resourceGroup().location]", + "apiVersion": "2015-08-01", + "dependsOn": [ + "[concat('Microsoft.Web/sites/', variables('website').name)]" + ], + "tags": { + "displayName": "webDeploy" + }, + "properties": { + "packageUri": "https://zarmada.blob.core.windows.net/sqldbedge-shared/sqldbedgedemo.zip?sp=r&st=2020-04-21T03:07:20Z&se=2050-04-21T11:07:20Z&spr=https&sv=2019-02-02&sr=b&sig=veWrTqH9RqjDeceBszIBtg3ueQlyBxmLd4ZPVrpTXpg%3D", + "dbType": "None", + "connectionString": "" + } + }] + } + ] +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.env b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.env new file mode 100644 index 0000000000..0c5c3d16b3 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.env @@ -0,0 +1,4 @@ +CONTAINER_REGISTRY_NAME= +CONTAINER_REGISTRY_USER_NAME= +CONTAINER_REGISTRY_PASSWORD= +SQL_PACKAGE= \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/launch.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/launch.json new file mode 100644 index 0000000000..c082e01206 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/launch.json @@ -0,0 +1,43 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "SensorModule Remote Debug (.NET Core)", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickRemoteProcess}", + "pipeTransport": { + "pipeProgram": "docker", + "pipeArgs": [ + "exec", + "-i", + "SensorModule", + "sh", + "-c" + ], + "debuggerPath": "~/vsdbg/vsdbg", + "pipeCwd": "${workspaceFolder}", + "quoteArgs": true + }, + "sourceFileMap": { + "/app": "${workspaceFolder}/modules/SensorModule" + }, + "justMyCode": true + }, + { + "name": "SensorModule Local Debug (.NET Core)", + "type": "coreclr", + "request": "launch", + "program": "${workspaceRoot}/modules/SensorModule/bin/Debug/netcoreapp2.1/SensorModule.dll", + "args": [], + "cwd": "${workspaceRoot}/modules/SensorModule", + "internalConsoleOptions": "openOnSessionStart", + "stopAtEntry": false, + "console": "internalConsole", + "env": { + "EdgeHubConnectionString": "${config:azure-iot-edge.EdgeHubConnectionString}", + "EdgeModuleCACertificateFile": "${config:azure-iot-edge.EdgeModuleCACertificateFile}" + } + } + ] +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/settings.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/settings.json new file mode 100644 index 0000000000..e13a6e88bb --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "azure-iot-edge.defaultPlatform": { + "platform": "amd64", + "alias": null + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/deployment.debug.template.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/deployment.debug.template.json new file mode 100644 index 0000000000..8dd3f2e695 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/deployment.debug.template.json @@ -0,0 +1,122 @@ +{ + "$schema-template": "2.0.0", + "modulesContent": { + "$edgeAgent": { + "properties.desired": { + "schemaVersion": "1.0", + "runtime": { + "type": "docker", + "settings": { + "minDockerVersion": "v1.25", + "loggingOptions": "", + "registryCredentials": { + "sqldbedgecr": { + "username": "$CONTAINER_REGISTRY_USER_NAME", + "password": "$CONTAINER_REGISTRY_PASSWORD", + "address": "$CONTAINER_REGISTRY_NAME" + } + } + } + }, + "systemModules": { + "edgeAgent": { + "type": "docker", + "settings": { + "image": "mcr.microsoft.com/azureiotedge-agent:1.0", + "createOptions": {} + } + }, + "edgeHub": { + "type": "docker", + "status": "running", + "restartPolicy": "always", + "settings": { + "image": "mcr.microsoft.com/azureiotedge-hub:1.0", + "createOptions": { + "HostConfig": { + "PortBindings": { + "5671/tcp": [ + { + "HostPort": "5671" + } + ], + "8883/tcp": [ + { + "HostPort": "8883" + } + ], + "443/tcp": [ + { + "HostPort": "443" + } + ] + } + } + } + } + } + }, + "modules": { + "SensorModule": { + "version": "1.0", + "type": "docker", + "status": "running", + "restartPolicy": "always", + "settings": { + "image": "${MODULES.SensorModule.debug}", + "createOptions": {} + } + }, + "AzureSQLDatabaseEdge": { + "settings": { + "image": "marketplace.azurecr.io/microsoftsqledge-preview/azure-sql-database-edge", + "createOptions": "{\"HostConfig\":{\"CapAdd\":[\"SYS_PTRACE\"],\"Binds\":[\"sqlvolume:/sqlvolume\"],\"PortBindings\":{\"1433/tcp\":[{\"HostPort\":\"1433\"}]},\"Mounts\":[{\"Type\":\"volume\",\"Source\":\"sqlvolume\",\"Target\":\"/var/opt/mssql\"}]},\"User\":\"0:0\",\"Env\":[\"MSSQL_AGENT_ENABLED=TRUE\",\"ClientTransportType=AMQP_TCP_Only\",\"MSSQL_PID=Developer\"]}" + }, + "type": "docker", + "version": "1.0", + "env": { + "ACCEPT_EULA": { + "value": "Y" + }, + "SA_PASSWORD": { + "value": "Microsoft2020$" + }, + "MSSQL_LCID": { + "value": "1033" + }, + "MSSQL_COLLATION": { + "value": "SQL_Latin1_General_CP1_CI_AS" + } + }, + "status": "running", + "restartPolicy": "always" + } + } + } + }, + "$edgeHub": { + "properties.desired": { + "schemaVersion": "1.0", + "routes": { + "SensorModuleToIoTHub": "FROM /messages/modules/SensorModule/outputs/* INTO $upstream" + }, + "storeAndForwardConfiguration": { + "timeToLiveSecs": 7200 + } + } + }, + "SensorModule": { + "properties.desired": { + "SqlConnnectionString": "Server=tcp:AzureSQLDatabaseEdge,1433;Initial Catalog=turbine-sensor-db;Persist Security Info=False;User ID=sa;Password=Microsoft2020$;MultipleActiveResultSets=False;Connection Timeout=30;", + "PushTimeInterval": 5000, + "Alert": "start", + "OnnxModelUrl": "" + } + }, + "AzureSQLDatabaseEdge": { + "properties.desired": { + "SqlPackage": "$SQL_PACKAGE" + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.dockerignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.dockerignore new file mode 100644 index 0000000000..a43e842434 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.dockerignore @@ -0,0 +1,2 @@ +[b|B]in +[O|o]bj \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.gitignore new file mode 100644 index 0000000000..1074c05195 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/.gitignore @@ -0,0 +1,34 @@ +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc +.vs + +[Bb]in/ +[Oo]bj/ \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Constants.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Constants.cs new file mode 100644 index 0000000000..a9c372bb0e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Constants.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using SensorModule.Models; + +namespace SensorModule +{ + public static class Constants + { + public static class Sensors + { + public const string WindSpeedStdDev = "WindSpeedStdDev"; + public const string TurbineSpeedStdDev = "TurbineSpeedStdDev"; + public const string OverallWindDirection = "OverallWindDirection"; + public const string TurbineWindDirection = "TurbineWindDirection"; + public const string WindSpeedAverage = "WindSpeedAverage"; + public const string WindTempAverage = "WindTempAverage"; + public const string GearboxOilLevel = "GearboxOilLevel"; + public const string GearboxOilTemp = "GearboxOilTemp"; + public const string GeneratorActivePower = "GeneratorActivePower"; + public const string GeneratorSpeed = "GeneratorSpeed"; + public const string GeneratorTemp = "GeneratorTemp"; + public const string GeneratorTorque = "GeneratorTorque"; + public const string GridFrequency = "GridFrequency"; + public const string GridVoltage = "GridVoltage"; + public const string HydraulicOilPressure = "HydraulicOilPressure"; + public const string NacelleAngle = "NacelleAngle"; + public const string PitchAngle = "PitchAngle"; + public const string Vibration = "Vibration"; + public const string TurbineSpeedAverage = "TurbineSpeedAverage"; + public const string HatchSensor = "HatchSensor"; + } + + public static List SensorsList = new List{ + new Sensor {Id = Guid.NewGuid(), Type = Sensors.WindSpeedStdDev}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.TurbineSpeedStdDev}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.OverallWindDirection}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.TurbineWindDirection}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.WindSpeedAverage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.WindTempAverage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GearboxOilLevel}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GearboxOilTemp}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorActivePower}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorSpeed}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorTemp}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GeneratorTorque}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GridFrequency}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.GridVoltage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.HydraulicOilPressure}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.NacelleAngle}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.PitchAngle}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.Vibration}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.TurbineSpeedAverage}, + new Sensor {Id = Guid.NewGuid(), Type = Sensors.HatchSensor} + }; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStore/DatabaseContext.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStore/DatabaseContext.cs new file mode 100644 index 0000000000..4348c34da4 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStore/DatabaseContext.cs @@ -0,0 +1,29 @@ +using SensorModule; +using SensorModule.Models; +using Microsoft.EntityFrameworkCore; + +namespace SensorModule.DataStore +{ + + public class DatabaseContext : DbContext + { + private string _sqlConnectionString = string.Empty; + + public DatabaseContext(string sqlConnectionString) + { + this._sqlConnectionString = sqlConnectionString; + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseSqlServer(_sqlConnectionString); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().ToTable("models"); + } + + public DbSet RealtimeWindTurbineRecord { get; set; } + public DbSet RealtimeSensorRecord { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStructures/RingBuffer.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStructures/RingBuffer.cs new file mode 100644 index 0000000000..b959fc0a0d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/DataStructures/RingBuffer.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +namespace SensorModule.DataStructures +{ + /// + /// + /// Ring buffer. + /// + /// When writing to a full buffer: + /// PushBack -> removes this[0] / Front() + /// PushFront -> removes this[Size-1] / Back() + /// + /// this implementation is inspired by + /// http://www.boost.org/doc/libs/1_53_0/libs/Ring_buffer/doc/Ring_buffer.html + /// because I liked their interface. + /// + public class RingBuffer : IEnumerable + { + private readonly T[] _buffer; + + /// + /// The _start. Index of the first element in buffer. + /// + private int _start; + + /// + /// The _end. Index after the last element in the buffer. + /// + private int _end; + + /// + /// The _size. Buffer size. + /// + private int _size; + + public RingBuffer(int capacity) + : this(capacity, new T[] { }) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// Buffer capacity. Must be positive. + /// + /// + /// Items to fill buffer with. Items length must be less than capacity. + /// Suggestion: use Skip(x).Take(y).ToArray() to build this argument from + /// any enumerable. + /// + public RingBuffer(int capacity, T[] items) + { + if (capacity < 1) + { + throw new ArgumentException( + "Ring buffer cannot have negative or zero capacity.", nameof(capacity)); + } + if (items == null) + { + throw new ArgumentNullException(nameof(items)); + } + if (items.Length > capacity) + { + throw new ArgumentException( + "Too many items to fit Ring buffer", nameof(items)); + } + + _buffer = new T[capacity]; + + Array.Copy(items, _buffer, items.Length); + _size = items.Length; + + _start = 0; + _end = _size == capacity ? 0 : _size; + } + + /// + /// Maximum capacity of the buffer. Elements pushed into the buffer after + /// maximum capacity is reached (IsFull = true), will remove an element. + /// + public int Capacity { get { return _buffer.Length; } } + + public bool IsFull + { + get + { + return Size == Capacity; + } + } + + public bool IsEmpty + { + get + { + return Size == 0; + } + } + + /// + /// Current buffer size (the number of elements that the buffer has). + /// + public int Size { get { return _size; } } + + /// + /// Element at the front of the buffer - this[0]. + /// + /// The value of the element of type T at the front of the buffer. + public T Front() + { + ThrowIfEmpty(); + return _buffer[_start]; + } + + /// + /// Element at the back of the buffer - this[Size - 1]. + /// + /// The value of the element of type T at the back of the buffer. + public T Back() + { + ThrowIfEmpty(); + return _buffer[(_end != 0 ? _end : Capacity) - 1]; + } + + public T this[int index] + { + get + { + if (IsEmpty) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer is empty", index)); + } + if (index >= _size) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer size is {1}", index, _size)); + } + int actualIndex = InternalIndex(index); + return _buffer[actualIndex]; + } + set + { + if (IsEmpty) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer is empty", index)); + } + if (index >= _size) + { + throw new IndexOutOfRangeException(string.Format("Cannot access index {0}. Buffer size is {1}", index, _size)); + } + int actualIndex = InternalIndex(index); + _buffer[actualIndex] = value; + } + } + + /// + /// Pushes a new element to the back of the buffer. Back()/this[Size-1] + /// will now return this element. + /// + /// When the buffer is full, the element at Front()/this[0] will be + /// popped to allow for this new element to fit. + /// + /// Item to push to the back of the buffer + public void PushBack(T item) + { + if (IsFull) + { + _buffer[_end] = item; + Increment(ref _end); + _start = _end; + } + else + { + _buffer[_end] = item; + Increment(ref _end); + ++_size; + } + } + + /// + /// Pushes a new element to the front of the buffer. Front()/this[0] + /// will now return this element. + /// + /// When the buffer is full, the element at Back()/this[Size-1] will be + /// popped to allow for this new element to fit. + /// + /// Item to push to the front of the buffer + public void PushFront(T item) + { + if (IsFull) + { + Decrement(ref _start); + _end = _start; + _buffer[_start] = item; + } + else + { + Decrement(ref _start); + _buffer[_start] = item; + ++_size; + } + } + + /// + /// Removes the element at the back of the buffer. Decreasing the + /// Buffer size by 1. + /// + public void PopBack() + { + ThrowIfEmpty("Cannot take elements from an empty buffer."); + Decrement(ref _end); + _buffer[_end] = default(T); + --_size; + } + + /// + /// Removes the element at the front of the buffer. Decreasing the + /// Buffer size by 1. + /// + public void PopFront() + { + ThrowIfEmpty("Cannot take elements from an empty buffer."); + _buffer[_start] = default(T); + Increment(ref _start); + --_size; + } + + /// + /// Copies the buffer contents to an array, according to the logical + /// contents of the buffer (i.e. independent of the internal + /// order/contents) + /// + /// A new array with a copy of the buffer contents. + public T[] ToArray() + { + T[] newArray = new T[Size]; + int newArrayOffset = 0; + var segments = new ArraySegment[2] { ArrayOne(), ArrayTwo() }; + foreach (ArraySegment segment in segments) + { + Array.Copy(segment.Array, segment.Offset, newArray, newArrayOffset, segment.Count); + newArrayOffset += segment.Count; + } + return newArray; + } + + #region IEnumerable implementation + public IEnumerator GetEnumerator() + { + var segments = new ArraySegment[2] { ArrayOne(), ArrayTwo() }; + foreach (ArraySegment segment in segments) + { + for (int i = 0; i < segment.Count; i++) + { + yield return segment.Array[segment.Offset + i]; + } + } + } + #endregion + #region IEnumerable implementation + IEnumerator IEnumerable.GetEnumerator() + { + return (IEnumerator)GetEnumerator(); + } + #endregion + + private void ThrowIfEmpty(string message = "Cannot access an empty buffer.") + { + if (IsEmpty) + { + throw new InvalidOperationException(message); + } + } + + /// + /// Increments the provided index variable by one, wrapping + /// around if necessary. + /// + /// + private void Increment(ref int index) + { + if (++index == Capacity) + { + index = 0; + } + } + + /// + /// Decrements the provided index variable by one, wrapping + /// around if necessary. + /// + /// + private void Decrement(ref int index) + { + if (index == 0) + { + index = Capacity; + } + index--; + } + + /// + /// Converts the index in the argument to an index in _buffer + /// + /// + /// The transformed index. + /// + /// + /// External index. + /// + private int InternalIndex(int index) + { + return _start + (index < (Capacity - _start) ? index : index - Capacity); + } + + // doing ArrayOne and ArrayTwo methods returning ArraySegment as seen here: + // http://www.boost.org/doc/libs/1_37_0/libs/Ring_buffer/doc/Ring_buffer.html#classboost_1_1Ring__buffer_1957cccdcb0c4ef7d80a34a990065818d + // http://www.boost.org/doc/libs/1_37_0/libs/Ring_buffer/doc/Ring_buffer.html#classboost_1_1Ring__buffer_1f5081a54afbc2dfc1a7fb20329df7d5b + // should help a lot with the code. + + #region Array items easy access. + // The array is composed by at most two non-contiguous segments, + // the next two methods allow easy access to those. + + private ArraySegment ArrayOne() + { + if (IsEmpty) + { + return new ArraySegment(new T[0]); + } + else if (_start < _end) + { + return new ArraySegment(_buffer, _start, _end - _start); + } + else + { + return new ArraySegment(_buffer, _start, _buffer.Length - _start); + } + } + + private ArraySegment ArrayTwo() + { + if (IsEmpty) + { + return new ArraySegment(new T[0]); + } + else if (_start < _end) + { + return new ArraySegment(_buffer, _end, 0); + } + else + { + return new ArraySegment(_buffer, 0, _end); + } + } + #endregion + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64 b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64 new file mode 100644 index 0000000000..494ea45df9 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64 @@ -0,0 +1,17 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim +WORKDIR /app +COPY --from=build-env /app/out ./ + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64.debug b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64.debug new file mode 100644 index 0000000000..19079e1d03 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.amd64.debug @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base + +RUN apt-get update && \ + apt-get install -y --no-install-recommends unzip procps && \ + rm -rf /var/lib/apt/lists/* + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser +RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Debug -o out + +FROM base +WORKDIR /app +COPY --from=build-env /app/out ./ + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7 b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7 new file mode 100644 index 0000000000..e258a5e437 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7 @@ -0,0 +1,17 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim-arm32v7 +WORKDIR /app +COPY --from=build-env /app/out ./ + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7.debug b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7.debug new file mode 100644 index 0000000000..5f6562c780 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.arm32v7.debug @@ -0,0 +1,24 @@ +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim-arm32v7 AS base + +RUN apt-get update && \ + apt-get install -y --no-install-recommends unzip procps && \ + rm -rf /var/lib/apt/lists/* + +RUN useradd -ms /bin/bash moduleuser +USER moduleuser +RUN curl -sSL https://aka.ms/getvsdbgsh | bash /dev/stdin -v latest -l ~/vsdbg + +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Debug -o out + +FROM base +WORKDIR /app +COPY --from=build-env /app/out ./ + +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.windows-amd64 b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.windows-amd64 new file mode 100644 index 0000000000..f491fed3df --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Dockerfile.windows-amd64 @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env +WORKDIR /app + +COPY *.csproj ./ +RUN dotnet restore + +COPY . ./ +RUN dotnet publish -c Release -o out + +FROM mcr.microsoft.com/dotnet/core/runtime:3.1-nanoserver-1909 +WORKDIR /app +COPY --from=build-env /app/out ./ +ENTRYPOINT ["dotnet", "SensorModule.dll"] \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Helpers/GeneratorHelper.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Helpers/GeneratorHelper.cs new file mode 100644 index 0000000000..f2d3ea058e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Helpers/GeneratorHelper.cs @@ -0,0 +1,316 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SensorModule.Helpers +{ + public class GeneratorHelper + { + private Random _random = new Random(); + + public double GetGearBoxOilLevel() + { + int trendSign = _random.Next(-1, 1); + var offset = GetRandomNumber(0, 5); + offset = trendSign < 0 ? offset * -1 : offset; + return 40 + offset; + } + + public double GetGearBoxTemp() + { + var offset = GetRandomNumber(0, 3); + int trendSign = _random.Next(-2, 1); + var toReturn = 53.0 + offset; + + if (toReturn > 40) + { + offset = trendSign < 0 ? offset * -1 : offset; + } + else if (toReturn > 61) + { + offset *= -1; + } + + toReturn += offset; + + return toReturn > 61 ? GetRandomNumber(60, 61) : toReturn; + } + + public double GetGeneratorActivePower(double windSpeed) + { + Dictionary Values = new Dictionary() + { + { 0, -1.165047329 }, + { 1, -1.561275004 }, + { 2, -1.523817212 }, + { 3, 0.258328264 }, + { 4, 39.48032308 }, + { 5, 129.0223307 }, + { 6, 296.3115464 }, + { 7, 533.6013549 }, + { 8, 784.2038201 }, + { 9, 1033.222044 }, + { 10, 1282.494906 }, + { 11, 1522.07693 }, + { 12, 1710.51213 }, + { 13, 1847.754821 }, + { 14, 1909.292275 }, + { 15, 1929.077495 }, + }; + + var ws = Convert.ToInt32(Math.Round(windSpeed)); + ws = ws > 15 ? 15 : ws; + var apAvg = Values[ws]; + int trendSign = _random.Next(-2, 1); + + double offset; + if (ws <= 3) + { + offset = GetRandomNumber(-0.04, 0.01); + } + else if (ws <= 7) + { + offset = GetRandomNumber(0.01, 0.15); + } + else if (ws <= 12) + { + offset = GetRandomNumber(0.01, 0.63); + } + else + { + offset = GetRandomNumber(0.01, 0.94); + } + + offset = trendSign < 0 ? offset * -1 : offset; + var toReturn = (apAvg * offset) + apAvg; + return toReturn > 2100 ? 2100 : toReturn; + } + + public double GetGeneratorSpeed(double windSpeed) + { + Dictionary Values = new Dictionary() + { + { 0, 29.5339 }, + { 1, 93.4983 }, + { 2, 123.626 }, + { 3, 270.0063 }, + { 4, 850.3199 }, + { 5, 1059.4094 }, + { 6, 1317.4786 }, + { 7, 1548.3753 }, + { 8, 1635.4728 }, + { 9, 1660.1312 }, + { 10, 1685.2159 }, + { 11, 1709.3631 }, + { 12, 1722.729 }, + { 13, 1743.2982 }, + { 14, 1739.6748 }, + { 15, 1737.1417 } + }; + + var ws = Convert.ToInt32(Math.Round(windSpeed)); + ws = ws > 15 ? 15 : ws; + var gsAvg = Values[ws]; + double rate; + int trendSign = _random.Next(-3, 1); + + if (ws <= 5) + { + rate = GetRandomNumber(0, 0.7); + } + else if (ws <= 8) + { + rate = GetRandomNumber(0.001, 0.055); + } + else if (ws <= 12) + { + rate = GetRandomNumber(0.001, 0.04362); + trendSign = _random.Next(-1, 2); + } + else + { + rate = GetRandomNumber(0.001, 0.374); + trendSign = _random.Next(-1, 3); + } + rate = trendSign < 0 ? rate * -1 : rate; + var toReturn = (gsAvg * rate) + gsAvg; + return toReturn > 1800.100 + 5 ? 1800.100 : toReturn; + } + + public double GetGeneratorStatorTemp(double generatorSpeed) + { + double[] avgTempValues = { 15.0, 45.5, 55.3, 72.5 }; + var gs = Convert.ToInt32(Math.Round(generatorSpeed)); + var offset = GetRandomNumber(0, 10); + int trendSign = _random.Next(-2, 2); + offset = trendSign < 0 ? offset * -1 : offset; + double toReturn; + if (gs < 450) + { + toReturn = avgTempValues[0] + offset; + } + else if (gs < 900) + { + toReturn = avgTempValues[1] + offset; + } + else if (gs < 1350) + { + toReturn = avgTempValues[2] + offset; + } + else + { + offset = GetRandomNumber(0, 5); + toReturn = avgTempValues[3] + offset; + } + + return toReturn > 83 ? GetRandomNumber(82, 84) : toReturn; + } + + public double GetGeneratorTorque(double generatorSpeed, double activePower) + { + var toReturn = activePower == 0 || generatorSpeed == 0 ? 0 : (activePower / generatorSpeed) * (30 / 3.1416); + return toReturn > 10 ? GetRandomNumber(9, 10) : toReturn; + } + + public double GetGridFrequency(double activePower) + { + if (activePower == 0) + { + return 0; + } + else + { + var offset = GetRandomNumber(0, 0.5); + int trendSign = _random.Next(-1, 1); + offset = trendSign < 0 ? offset * -1 : offset; + + return 50 + offset; + } + } + + public double GetVoltage(double activePower) + { + var offset = GetRandomNumber(0, 20); + int trendSign = _random.Next(-1, 4); + offset = trendSign < 0 ? GetRandomNumber(0, 5) * -1 : offset; + return activePower != 0 ? 690 + offset : 0; + } + + public double GetHydraulicOilPressure() + { + var offset = GetRandomNumber(0, 10); + int trendSign = _random.Next(-2, 1); + double toReturn = 250 + offset; + + if (toReturn > 249) + { + offset = trendSign < 0 ? offset * -1 : offset; + } + else if (toReturn > 375) + { + offset *= -1; + } + + toReturn += offset; + + return toReturn > 380 ? GetRandomNumber(379, 380) : toReturn; + } + + public double GetNacelleAngle(double windDirection) + { + var offset = GetRandomNumber(0, 10); + int trendSign = _random.Next(-2, 2); + offset = trendSign < 0 ? offset * -1 : offset; + var toReturn = windDirection + offset; + return toReturn > 360 ? GetRandomNumber(358, 360) : toReturn; + } + + public double GetPitchAngle(double windSpeed) + { + Dictionary Values = new Dictionary() + { + { 0, new PitchAngleReference { Ratio = 0.98, Avg = 54.24524239 } }, + { 1, new PitchAngleReference {Ratio = 1.014, Avg = 51.67482604 } }, + { 2, new PitchAngleReference {Ratio = 1.4, Avg = 50.15667612 } }, + { 3, new PitchAngleReference {Ratio = 3.75, Avg = 44.47110192 } }, + { 4, new PitchAngleReference {Ratio = 10.9, Avg = 10.16831867 } }, + { 5, new PitchAngleReference {Ratio = 8, Avg = 3.753638458 } }, + { 6, new PitchAngleReference {Ratio = 8.6, Avg = 3.143487107 } }, + { 7, new PitchAngleReference {Ratio = 8.1, Avg = 3.851029642 } }, + { 8, new PitchAngleReference {Ratio = 7, Avg = 5.51622539 } }, + { 9, new PitchAngleReference {Ratio = 12.3, Avg = 5.607653521 } }, + { 10, new PitchAngleReference {Ratio = 11.3, Avg = 4.906807873 } }, + { 11, new PitchAngleReference {Ratio = 12.5, Avg = 4.556013361 } }, + { 12, new PitchAngleReference {Ratio = 7.6, Avg = 5.461135239 } }, + { 13, new PitchAngleReference {Ratio = 4, Avg = 6.617167409 } }, + { 14, new PitchAngleReference {Ratio = 6.5, Avg = 9.174521933 } }, + { 15, new PitchAngleReference {Ratio = 7.1, Avg = 11.5855706 } }, + }; + + var ws = Convert.ToInt32(Math.Round(windSpeed)); + ws = ws > 15 ? 15 : ws; + var paAvg = Values[ws].Avg; + var rate = GetRandomNumber(0.001, Values[ws].Ratio); + + int trendSign = _random.Next(-2, 2); + + rate = trendSign < 0 ? rate * -1 : rate; + var toReturn = (paAvg * rate) + paAvg; + + // This is needed as the avg for speeds greater than 5 are to low and the min value is to close to 0. + if (ws >= 5 && toReturn < 0) + { + toReturn = GetRandomNumber(-13, 1); + } + + return toReturn > 262.6 + 5 ? 262.6 : toReturn; + } + + public double GetVibration(double windSpeed) + { + if (windSpeed < 5) + { + return GetRandomNumber(0, 50); + } + else + { + return windSpeed * 13; + } + } + + public double GetRandomNumber(double minimum, double maximum) + { + return _random.NextDouble() * (maximum - minimum) + minimum; + } + + public bool GetRandomBool(int truePercentage = 50) + { + return _random.NextDouble() < truePercentage / 100.0; + } + + public double CalculateStandardDeviation(IEnumerable values) + { + double standardDeviation = 0; + + if (values.Any()) + { + // Compute the average. + double avg = values.Average(); + + // Perform the Sum of (value-avg)_2_2. + double sum = values.Sum(d => Math.Pow(d - avg, 2)); + + // Put it all together. + standardDeviation = Math.Sqrt((sum) / (values.Count() - 1)); + } + + return double.IsNaN(standardDeviation) ? 0 : standardDeviation; + } + } + + class PitchAngleReference + { + public double Ratio { get; set; } + public double Avg { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Interfaces/IWindTurbineRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Interfaces/IWindTurbineRecord.cs new file mode 100644 index 0000000000..8fefe5a4e8 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Interfaces/IWindTurbineRecord.cs @@ -0,0 +1,27 @@ +namespace SensorModule.Models.Interfaces +{ + public interface IWindTurbineRecord + { + int TurbineId { get; set; } + double WindSpeedStdDev { get; set; } + double TurbineSpeedStdDev { get; set; } + double OverallWindDirection { get; set; } + double TurbineWindDirection { get; set; } + double WindSpeedAverage { get; set; } + double WindTempAverage { get; set; } + bool Precipitation { get; set; } + double GearboxOilLevel { get; set; } + double GearboxOilTemp { get; set; } + double GeneratorActivePower { get; set; } + double GeneratorSpeed { get; set; } + double GeneratorTemp { get; set; } + double GeneratorTorque { get; set; } + double GridFrequency { get; set; } + double GridVoltage { get; set; } + double HydraulicOilPressure { get; set; } + double NacelleAngle { get; set; } + double PitchAngle { get; set; } + double Vibration { get; set; } + double TurbineSpeedAverage { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/OnnxModel.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/OnnxModel.cs new file mode 100644 index 0000000000..2aaf00e20f --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/OnnxModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace SensorModule.Models +{ + public class OnnxModel + { + [Key] + public int Id { get; set; } + public string Description { get; set; } + public byte[] Data { get; set; } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeSensorRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeSensorRecord.cs new file mode 100644 index 0000000000..03c920e8c7 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeSensorRecord.cs @@ -0,0 +1,16 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace SensorModule.Models +{ + public class RealtimeSensorRecord + { + [Key] + public Guid RecordId { get; set; } + public Guid TurbineId { get; set; } + public Guid SensorId { get; set; } + public string SensorType { get; set; } + public double SensorValue { get; set; } + public DateTime Timestamp { get; set; } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeWindTurbineRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeWindTurbineRecord.cs new file mode 100644 index 0000000000..4a2c971b91 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/RealtimeWindTurbineRecord.cs @@ -0,0 +1,35 @@ +using SensorModule.Models.Interfaces; +using System; +using System.ComponentModel.DataAnnotations; + +namespace SensorModule.Models +{ + public class RealtimeWindTurbineRecord : IWindTurbineRecord + { + [Key] + public Guid RecordId { get; set; } + public int TurbineId { get; set; } + public Guid TurbineGuid { get; set; } + public double WindSpeedStdDev { get; set; } + public double TurbineSpeedStdDev { get; set; } + public double OverallWindDirection { get; set; } + public double TurbineWindDirection { get; set; } + public double WindSpeedAverage { get; set; } + public double WindTempAverage { get; set; } + public bool Precipitation { get; set; } + public double GearboxOilLevel { get; set; } + public double GearboxOilTemp { get; set; } + public double GeneratorActivePower { get; set; } + public double GeneratorSpeed { get; set; } + public double GeneratorTemp { get; set; } + public double GeneratorTorque { get; set; } + public double GridFrequency { get; set; } + public double GridVoltage { get; set; } + public double HydraulicOilPressure { get; set; } + public double NacelleAngle { get; set; } + public double PitchAngle { get; set; } + public double Vibration { get; set; } + public double TurbineSpeedAverage { get; set; } + public DateTime Timestamp { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Sensor.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Sensor.cs new file mode 100644 index 0000000000..c396c5c1f6 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/Sensor.cs @@ -0,0 +1,11 @@ +using System; + +namespace SensorModule.Models +{ + public class Sensor + { + public Guid Id { get; set; } = Guid.NewGuid(); + + public string Type { get; set; } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/TrainingWindTurbineRecord.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/TrainingWindTurbineRecord.cs new file mode 100644 index 0000000000..7f67fef983 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Models/TrainingWindTurbineRecord.cs @@ -0,0 +1,30 @@ +using SensorModule.Models.Interfaces; + +namespace SensorModule.Models +{ + public class TrainingWindTurbineRecord : IWindTurbineRecord + { + public int TurbineId { get; set; } + public double WindSpeedStdDev { get; set; } + public double TurbineSpeedStdDev { get; set; } + public double OverallWindDirection { get; set; } + public double TurbineWindDirection { get; set; } + public double WindSpeedAverage { get; set; } + public double WindTempAverage { get; set; } + public bool Precipitation { get; set; } + public double GearboxOilLevel { get; set; } + public double GearboxOilTemp { get; set; } + public double GeneratorActivePower { get; set; } + public double GeneratorSpeed { get; set; } + public double GeneratorTemp { get; set; } + public double GeneratorTorque { get; set; } + public double GridFrequency { get; set; } + public double GridVoltage { get; set; } + public double HydraulicOilPressure { get; set; } + public double NacelleAngle { get; set; } + public double PitchAngle { get; set; } + public double Vibration { get; set; } + public double TurbineSpeedAverage { get; set; } + public bool AlterBlades { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Program.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Program.cs new file mode 100644 index 0000000000..0eb737e201 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Program.cs @@ -0,0 +1,197 @@ +namespace SensorModule +{ + using System; + using System.IO; + using System.Runtime.InteropServices; + using System.Runtime.Loader; + using System.Security.Cryptography.X509Certificates; + using System.Text; + using System.Threading; + using System.Threading.Tasks; + using Microsoft.Azure.Devices.Client; + using Microsoft.Azure.Devices.Client.Transport.Mqtt; + using Microsoft.Azure.Devices.Shared; + using Newtonsoft.Json; + using SensorModule.Services; + using SensorModule.Services.Interfaces; + + class Program + { + private static IDataGeneratorService _datageneratorservice; + private static IDataStoreService _datastoreservice; + private static ModuleClient _ioTHubModuleClient; + static int PushTimeInterval { get; set; } = 5000; + static bool StopWake { get; set; } = false; + static bool BlockedDataGeneration { get; set; } = false; + + static async Task Main(string[] args) + { + _datageneratorservice = new DataGeneratorService(); + _datastoreservice = new DataStoreService(); + + await Init(); + + try + { + Console.WriteLine("Truncating sensors table before start pushing data"); + _datastoreservice.TruncateRealtimeSensorRecordTable(); + } + catch(Exception e) + { + Console.WriteLine("Error truncating table: " + e.Message); + } + + Console.WriteLine($"Starting writing realtime records with {PushTimeInterval} millisecond interval to database..."); + + while (true) + { + if (!BlockedDataGeneration) + { + var records = _datageneratorservice.GenerateRealTimeSensorRecords(StopWake); + Console.WriteLine($"[{DateTime.Now}] Writing records to db."); + _datastoreservice.WriteSensorRecordsToDB(records); + } + await Task.Delay(PushTimeInterval); + } + } + + /// + /// Handles cleanup operations when app is cancelled or unloads + /// + public static Task WhenCancelled(CancellationToken cancellationToken) + { + var tcs = new TaskCompletionSource(); + cancellationToken.Register(s => ((TaskCompletionSource)s).SetResult(true), tcs); + return tcs.Task; + } + + /// + /// Initializes the ModuleClient and sets up the callback to receive + /// messages containing temperature information + /// + static async Task Init() + { + _ioTHubModuleClient = await ModuleClient.CreateFromEnvironmentAsync(); + _ioTHubModuleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null).Wait(); + await SetAlertStatus("start"); + Console.WriteLine("IoT Hub module client initialized."); + + // Read from the module twin's desired properties + var moduleTwin = await _ioTHubModuleClient.GetTwinAsync(); + await OnDesiredPropertyChanged(moduleTwin.Properties.Desired, _ioTHubModuleClient); + } + + static async Task SetAlertStatus(string status) + { + Console.WriteLine($"Sending alert as reported property with value `{status}`."); + TwinCollection reportedProperties = new TwinCollection + { + ["alert"] = status + }; + + await _ioTHubModuleClient.UpdateReportedPropertiesAsync(reportedProperties); + } + + static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, object userContext) + { + try + { + Console.WriteLine("Desired property change:"); + Console.WriteLine(JsonConvert.SerializeObject(desiredProperties)); + + if (desiredProperties["SqlConnnectionString"]!=null) + { + var connectionString = desiredProperties["SqlConnnectionString"]; + Console.WriteLine($"Updating SqlConnectionString: {connectionString}"); + _datastoreservice.SetSqlConnectionString($"{connectionString}"); + } + + if (desiredProperties["PushTimeInterval"]!=null) + { + var pushTimeInterval = desiredProperties["PushTimeInterval"]; + Console.WriteLine($"Updating PushTimeInterval to: {pushTimeInterval}"); + PushTimeInterval = desiredProperties["PushTimeInterval"]; + } + + if (desiredProperties["Alert"]!=null) + { + var alertStatus = desiredProperties["Alert"]; + Console.WriteLine($"Will update alert from property to: {alertStatus}"); + await SetAlertStatus($"{alertStatus}"); + } + + if (desiredProperties["OnnxModelUrl"]!=null) + { + var onnxModelUrl = $"{desiredProperties["OnnxModelUrl"]}"; + if (!string.IsNullOrEmpty(onnxModelUrl)) + { + // Blocking data generation while we run the model + BlockedDataGeneration = true; + Console.WriteLine($"Updating OnnxModelUrl: {onnxModelUrl}"); + // Re-Create the Model Table in DB to keep only one record of the model + _datastoreservice.DropAndCreateModelTable(); + // Insert the model into the created table + _datastoreservice.InsertModelFromUrl($"{onnxModelUrl}"); + // Get model prediction of top rows + var modelResult = _datastoreservice.GetModelResult(); + Console.WriteLine($"Model prediction got a value of: {modelResult}"); + // Stabilize the data if result is > 0 + StopWake = modelResult > 0; + if (StopWake) + { + Console.WriteLine($"Stabilizing the data."); + // Clear the buffer to accelarate stabilization of the data + ClearBuffer(); + } + // If result is > 0 we need to stop the alert + var alertStatus = modelResult > 0 ? "stop":"start"; + Console.WriteLine($"Setting Alert to: {alertStatus}"); + // Update the twin module property to get new value in client + await SetAlertStatus(alertStatus); + // Unblock the data generation after running the model + BlockedDataGeneration = false; + } + else + { + BlockedDataGeneration = true; + StopWake = false; + Console.WriteLine($"Is data stabilized? {StopWake}"); + _datastoreservice.TruncateRealtimeSensorRecordTable(); + ClearBuffer(); + BlockedDataGeneration = false; + } + } + else + { + BlockedDataGeneration = true; + StopWake = false; + Console.WriteLine($"Is data stabilized? {StopWake}"); + _datastoreservice.TruncateRealtimeSensorRecordTable(); + ClearBuffer(); + BlockedDataGeneration = false; + } + } + catch (AggregateException ex) + { + foreach (Exception exception in ex.InnerExceptions) + { + Console.WriteLine(); + Console.WriteLine("Error when receiving desired property: {0}", exception); + } + } + catch (Exception ex) + { + Console.WriteLine(); + Console.WriteLine("Error when receiving desired property: {0}", ex); + } + } + + static void ClearBuffer() + { + _datageneratorservice.ClearBuffer(); + // Add new records as a reference for the next record generation + _datageneratorservice.GenerateRealTimeSensorRecords(StopWake); + _datageneratorservice.GenerateRealTimeSensorRecords(StopWake); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/SensorModule.csproj b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/SensorModule.csproj new file mode 100644 index 0000000000..9f611ee3f0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/SensorModule.csproj @@ -0,0 +1,35 @@ + + + Exe + netcoreapp3.1 + latest + + + + True + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataExporterService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataExporterService.cs new file mode 100644 index 0000000000..685b1ce4ec --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataExporterService.cs @@ -0,0 +1,144 @@ +using SensorModule.Models; +using SensorModule.Services.Interfaces; +using Parquet; +using Parquet.Data; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SensorModule.Services +{ + public class DataExporterService : IDataExporterService + { + public void SaveParquet(IEnumerable records, string outputFile) + { + //create data columns with schema metadata and the data you need + var turbineId = new DataColumn( + new DataField("TurbineId"), + records.Select(x => x.TurbineId).ToArray()); + + var gearboxOilLevel = new DataColumn( + new DataField("GearboxOilLevel"), + records.Select(x => x.GearboxOilLevel).ToArray()); + + var gearboxOilTemp = new DataColumn( + new DataField("GearboxOilTemp"), + records.Select(x => x.GearboxOilTemp).ToArray()); + + var generatorActivePower = new DataColumn( + new DataField("GeneratorActivePower"), + records.Select(x => x.GeneratorActivePower).ToArray()); + + var generatorSpeed = new DataColumn( + new DataField("GeneratorSpeed"), + records.Select(x => x.GeneratorSpeed).ToArray()); + + var generatorTemp = new DataColumn( + new DataField("GeneratorTemp"), + records.Select(x => x.GeneratorTemp).ToArray()); + + var generatorTorque = new DataColumn( + new DataField("GeneratorTorque"), + records.Select(x => x.GeneratorTorque).ToArray()); + + var gridFrequency = new DataColumn( + new DataField("GridFrequency"), + records.Select(x => x.GridFrequency).ToArray()); + + var gridVoltage = new DataColumn( + new DataField("GridVoltage"), + records.Select(x => x.GridVoltage).ToArray()); + + var hydraulicOilPressure = new DataColumn( + new DataField("HydraulicOilPressure"), + records.Select(x => x.HydraulicOilPressure).ToArray()); + + var nacelleAngle = new DataColumn( + new DataField("NacelleAngle"), + records.Select(x => x.NacelleAngle).ToArray()); + + var overallWindDirection = new DataColumn( + new DataField("OverallWindDirection"), + records.Select(x => x.OverallWindDirection).ToArray()); + + var overalWindSpeedStdDev = new DataColumn( + new DataField("WindSpeedStdDev"), + records.Select(x => x.WindSpeedStdDev).ToArray()); + + var precipitation = new DataColumn( + new DataField("Precipitation"), + records.Select(x => x.Precipitation).ToArray()); + + var turbineWindDirection = new DataColumn( + new DataField("TurbineWindDirection"), + records.Select(x => x.TurbineWindDirection).ToArray()); + + var turbineSpeedStdDev = new DataColumn( + new DataField("TurbineSpeedStdDev"), + records.Select(x => x.TurbineSpeedStdDev).ToArray()); + + var windSpeedAverage = new DataColumn( + new DataField("WindSpeedAverage"), + records.Select(x => x.WindSpeedAverage).ToArray()); + + var windTempAverage = new DataColumn( + new DataField("WindTempAverage"), + records.Select(x => x.WindTempAverage).ToArray()); + + var alterBlades = new DataColumn( + new DataField("AlterBlades"), + records.Select(x => x.AlterBlades).ToArray()); + + var pitchAngle = new DataColumn( + new DataField("PitchAngle"), + records.Select(x => x.PitchAngle).ToArray()); + + var vibration = new DataColumn( + new DataField("Vibration"), + records.Select(x => x.Vibration).ToArray()); + + var turbineSpeedAverage = new DataColumn( + new DataField("TurbineSpeedAverage"), + records.Select(x => x.TurbineSpeedAverage).ToArray()); + + // create file schema + var schema = new Schema(turbineId.Field, gearboxOilLevel.Field, gearboxOilTemp.Field, generatorActivePower.Field, generatorSpeed.Field, generatorTemp.Field, generatorTorque.Field, gridFrequency.Field, gridVoltage.Field, hydraulicOilPressure.Field, + nacelleAngle.Field, overallWindDirection.Field, overalWindSpeedStdDev.Field, precipitation.Field, turbineWindDirection.Field, turbineSpeedStdDev.Field, windSpeedAverage.Field, windTempAverage.Field, pitchAngle.Field, vibration.Field, turbineSpeedAverage.Field, alterBlades.Field); + + var outputPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + + using (Stream fileStream = File.OpenWrite(Path.Combine(outputPath, $"{outputFile}.parquet"))) + { + using (var parquetWriter = new ParquetWriter(schema, fileStream)) + { + // create a new row group in the file + using (ParquetRowGroupWriter groupWriter = parquetWriter.CreateRowGroup()) + { + groupWriter.WriteColumn(turbineId); + groupWriter.WriteColumn(gearboxOilLevel); + groupWriter.WriteColumn(gearboxOilTemp); + groupWriter.WriteColumn(generatorActivePower); + groupWriter.WriteColumn(generatorSpeed); + groupWriter.WriteColumn(generatorTemp); + groupWriter.WriteColumn(generatorTorque); + groupWriter.WriteColumn(gridFrequency); + groupWriter.WriteColumn(gridVoltage); + groupWriter.WriteColumn(hydraulicOilPressure); + groupWriter.WriteColumn(nacelleAngle); + groupWriter.WriteColumn(overallWindDirection); + groupWriter.WriteColumn(overalWindSpeedStdDev); + groupWriter.WriteColumn(precipitation); + groupWriter.WriteColumn(turbineWindDirection); + groupWriter.WriteColumn(turbineSpeedStdDev); + groupWriter.WriteColumn(windSpeedAverage); + groupWriter.WriteColumn(windTempAverage); + groupWriter.WriteColumn(pitchAngle); + groupWriter.WriteColumn(vibration); + groupWriter.WriteColumn(turbineSpeedAverage); + groupWriter.WriteColumn(alterBlades); + } + } + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataGeneratorService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataGeneratorService.cs new file mode 100644 index 0000000000..dfc963ac77 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataGeneratorService.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using SensorModule.DataStructures; +using SensorModule.Helpers; +using SensorModule.Models; +using SensorModule.Services.Interfaces; + +namespace SensorModule.Services +{ + public class DataGeneratorService : IDataGeneratorService + { + private RingBuffer ringBuffer = new RingBuffer(100); + private GeneratorHelper gen = new GeneratorHelper(); + private readonly Guid TurbineGuid = Guid.NewGuid(); + + private RealtimeWindTurbineRecord GenerateFirstRealtimeRecord() + { + var windSpeed = gen.GetRandomNumber(15.0, 25.0); + var generatorSpeed = gen.GetGeneratorSpeed(windSpeed); + var activePower = gen.GetGeneratorActivePower(windSpeed); + var windDirection = gen.GetRandomNumber(41.0, 44.0); + var toReturn = new RealtimeWindTurbineRecord + { + RecordId = Guid.NewGuid(), + TurbineId = 15443, + TurbineGuid = TurbineGuid, + GearboxOilLevel = gen.GetGearBoxOilLevel(), + GearboxOilTemp = gen.GetGearBoxTemp(), + GeneratorActivePower = gen.GetGeneratorActivePower(windSpeed), + GeneratorSpeed = generatorSpeed, + GeneratorTemp = gen.GetGeneratorStatorTemp(generatorSpeed), + GeneratorTorque = gen.GetGeneratorTorque(generatorSpeed, activePower), + GridFrequency = gen.GetGridFrequency(activePower), + GridVoltage = gen.GetVoltage(activePower), + HydraulicOilPressure = gen.GetHydraulicOilPressure(), + NacelleAngle = gen.GetNacelleAngle(windDirection), + PitchAngle = gen.GetPitchAngle(windSpeed), + Vibration = gen.GetVibration(windSpeed), + WindSpeedAverage = windSpeed, + Precipitation = gen.GetRandomBool(20), + WindTempAverage = gen.GetRandomNumber(-10.0, 30), + OverallWindDirection = windDirection, + TurbineWindDirection = windDirection * gen.GetRandomNumber(0.97, 1.03), + TurbineSpeedAverage = windSpeed * gen.GetRandomNumber(0.97f, 1.03f), + WindSpeedStdDev = 4.885422, + TurbineSpeedStdDev = 4.978619, + Timestamp = DateTime.Now + }; + + ringBuffer.PushFront(toReturn); + return toReturn; + } + + public void ClearBuffer() + { + ringBuffer = new RingBuffer(100); + } + + private RealtimeWindTurbineRecord GenerateRegularRealtimeRecord(bool stopWake) + { + var currentRecords = ringBuffer.ToList(); + double windDirection = currentRecords.Select(x => x.OverallWindDirection).Average() * gen.GetRandomNumber(0.9, 1.1); + var windSpeed = currentRecords.Select(x => x.WindSpeedAverage).Average() * gen.GetRandomNumber(0.9, 1.1); + double turbineSpeed = windSpeed * gen.GetRandomNumber(0.25, 1.75); + if (stopWake) + { + turbineSpeed = windSpeed * gen.GetRandomNumber(0.97, 1.03); + windDirection = gen.GetRandomNumber(40.0, 45.0); + } + + var generatorSpeed = gen.GetGeneratorSpeed(windSpeed); + var activePower = gen.GetGeneratorActivePower(windSpeed); + var toReturn = new RealtimeWindTurbineRecord + { + RecordId = Guid.NewGuid(), + TurbineId = 15443, + TurbineGuid = TurbineGuid, + GearboxOilLevel = currentRecords.Select(x => x.GearboxOilLevel).Average() * gen.GetRandomNumber(0.95, 1.05), + GearboxOilTemp = currentRecords.Select(x => x.GearboxOilTemp).Average() * gen.GetRandomNumber(0.95, 1.05), + GeneratorActivePower = gen.GetGeneratorActivePower(windSpeed), + GeneratorSpeed = generatorSpeed, + GeneratorTemp = gen.GetGeneratorStatorTemp(generatorSpeed), + GeneratorTorque = gen.GetGeneratorTorque(generatorSpeed, activePower), + GridFrequency = gen.GetGridFrequency(activePower), + GridVoltage = gen.GetVoltage(activePower), + HydraulicOilPressure = gen.GetHydraulicOilPressure(), + NacelleAngle = gen.GetNacelleAngle(windDirection), + PitchAngle = gen.GetPitchAngle(windSpeed), + Vibration = gen.GetVibration(windSpeed), + WindSpeedAverage = windSpeed, + Precipitation = gen.GetRandomBool(20), + WindTempAverage = gen.GetRandomNumber(-10.0, 30), + OverallWindDirection = windDirection, + TurbineWindDirection = windDirection * gen.GetRandomNumber(0.97, 1.03), + TurbineSpeedAverage = turbineSpeed, + WindSpeedStdDev = gen.CalculateStandardDeviation(ringBuffer.ToList().Select(x => x.WindSpeedAverage).TakeLast(10)), + TurbineSpeedStdDev = gen.CalculateStandardDeviation(ringBuffer.ToList().Select(x => x.TurbineSpeedAverage).TakeLast(10)), + Timestamp = DateTime.Now + }; + + ringBuffer.PushFront(toReturn); + return toReturn; + } + + public RealtimeWindTurbineRecord GenerateRealTimeRecords(bool stopWake) + { + if (ringBuffer.IsEmpty) + { + return GenerateFirstRealtimeRecord(); + } + else + { + return GenerateRegularRealtimeRecord(stopWake); + } + } + + public IEnumerable GenerateTrainingRecords(int amountOfRecords) + { + var toReturn = new List(); + + for (var i = 0; i < amountOfRecords; i++) + { + var windDirection = gen.GetRandomNumber(0.0, 360.0); + var windSpeed = gen.GetRandomNumber(10.0, 25.0); + var turbineSpeed = windSpeed * gen.GetRandomNumber(0.97, 1.03); + if (((double)i / amountOfRecords) >= 0.8) + { + turbineSpeed = windSpeed * gen.GetRandomNumber(0.25, 1.75); + windDirection = gen.GetRandomNumber(40.0, 45.0); + } + + var generatorSpeed = gen.GetGeneratorSpeed(windSpeed); + var activePower = gen.GetGeneratorActivePower(windSpeed); + toReturn.Add(new TrainingWindTurbineRecord + { + TurbineId = i, + GearboxOilLevel = gen.GetGearBoxOilLevel(), + GearboxOilTemp = gen.GetGearBoxTemp(), + GeneratorActivePower = gen.GetGeneratorActivePower(windSpeed), + GeneratorSpeed = generatorSpeed, + GeneratorTemp = gen.GetGeneratorStatorTemp(generatorSpeed), + GeneratorTorque = gen.GetGeneratorTorque(generatorSpeed, activePower), + GridFrequency = gen.GetGridFrequency(activePower), + GridVoltage = gen.GetVoltage(activePower), + HydraulicOilPressure = gen.GetHydraulicOilPressure(), + NacelleAngle = gen.GetNacelleAngle(windDirection), + PitchAngle = gen.GetPitchAngle(windSpeed), + Vibration = gen.GetVibration(windSpeed), + WindSpeedAverage = windSpeed, + Precipitation = gen.GetRandomBool(20), + WindTempAverage = gen.GetRandomNumber(-10.0, 30), + OverallWindDirection = windDirection, + TurbineWindDirection = windDirection * gen.GetRandomNumber(0.97, 1.03), + TurbineSpeedAverage = turbineSpeed, + WindSpeedStdDev = gen.CalculateStandardDeviation(toReturn.Select(x => x.WindSpeedAverage).TakeLast(10)), + TurbineSpeedStdDev = gen.CalculateStandardDeviation(toReturn.Select(x => x.TurbineSpeedAverage).TakeLast(10)), + AlterBlades = (gen.CalculateStandardDeviation(toReturn.Select(x => x.TurbineSpeedAverage).TakeLast(10)) - gen.CalculateStandardDeviation(toReturn.Select(x => x.WindSpeedAverage).TakeLast(10))) > 1.0 + }); + } + + return toReturn.OrderBy(a => Guid.NewGuid()).ToList(); + } + + public List GenerateRealTimeSensorRecords(bool stopWake) + { + RealtimeWindTurbineRecord windTurbineRecord; + if (ringBuffer.IsEmpty) + { + windTurbineRecord = GenerateFirstRealtimeRecord(); + } + else + { + windTurbineRecord = GenerateRegularRealtimeRecord(stopWake); + } + var records = Constants.SensorsList.Select(sensor => + { + double sensorValue = sensor.Type switch + { + Constants.Sensors.WindSpeedStdDev => windTurbineRecord.WindSpeedStdDev, + Constants.Sensors.TurbineSpeedStdDev => windTurbineRecord.TurbineSpeedStdDev, + Constants.Sensors.OverallWindDirection => windTurbineRecord.OverallWindDirection, + Constants.Sensors.TurbineWindDirection => windTurbineRecord.TurbineWindDirection, + Constants.Sensors.WindSpeedAverage => windTurbineRecord.WindSpeedAverage, + Constants.Sensors.WindTempAverage => windTurbineRecord.WindTempAverage, + Constants.Sensors.GearboxOilLevel => windTurbineRecord.GearboxOilLevel, + Constants.Sensors.GearboxOilTemp => windTurbineRecord.GearboxOilTemp, + Constants.Sensors.GeneratorActivePower => windTurbineRecord.GeneratorActivePower, + Constants.Sensors.GeneratorSpeed => windTurbineRecord.GeneratorSpeed, + Constants.Sensors.GeneratorTemp => windTurbineRecord.GeneratorTemp, + Constants.Sensors.GeneratorTorque => windTurbineRecord.GeneratorTorque, + Constants.Sensors.GridFrequency => windTurbineRecord.GridFrequency, + Constants.Sensors.GridVoltage => windTurbineRecord.GridVoltage, + Constants.Sensors.HydraulicOilPressure => windTurbineRecord.HydraulicOilPressure, + Constants.Sensors.NacelleAngle => windTurbineRecord.NacelleAngle, + Constants.Sensors.PitchAngle => windTurbineRecord.PitchAngle, + Constants.Sensors.Vibration => windTurbineRecord.Vibration, + Constants.Sensors.TurbineSpeedAverage => windTurbineRecord.TurbineSpeedAverage, + Constants.Sensors.HatchSensor => 0, + _ => 0, + }; + return new RealtimeSensorRecord + { + RecordId = Guid.NewGuid(), + TurbineId = windTurbineRecord.TurbineGuid, + SensorId = sensor.Id, + SensorType = sensor.Type, + SensorValue = sensorValue, + Timestamp = windTurbineRecord.Timestamp + }; + }); + return records.ToList(); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataStoreService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataStoreService.cs new file mode 100644 index 0000000000..e08176efc5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/DataStoreService.cs @@ -0,0 +1,117 @@ +using SensorModule.DataStore; +using SensorModule.Models; +using SensorModule.Services.Interfaces; +using Microsoft.Data.SqlClient; +using Microsoft.EntityFrameworkCore; +using System; +using System.Data; +using System.Net; +using System.Collections.Generic; + +namespace SensorModule.Services +{ + public class DataStoreService : IDataStoreService + { + private const string STOREDPROCNAME = "ModelResponse"; + private const string RUNMODELSTOREDPROCNAME = "RunModel"; + private const string MODELTABLENAME = "models"; + private const string TRUNCATETABLESTOREDPROCNAME = "TruncateRealtimeWindTurbineRecord"; + private const string TRUNCATEREALTIMESENSORTABLESTOREDPROCNAME = "TruncateRealtimeSensorRecords"; + private string _sqlConnectionString; + + public DataStoreService() + { + } + + public void SetSqlConnectionString(string sqlConnectionString) + { + _sqlConnectionString = sqlConnectionString; + } + + public bool ModelResponse() + { + SqlParameter[] @params = + { + new SqlParameter("@returnVal", SqlDbType.Bit) {Direction = ParameterDirection.Output} + }; + + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"exec @returnVal=" + STOREDPROCNAME, @params); + } + + return (bool)@params[0].Value; + } + + public void TruncateRealtimeWindTurbineRecordTable() + { + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"exec " + TRUNCATETABLESTOREDPROCNAME); + } + } + + public void WriteToDB(RealtimeWindTurbineRecord record) + { + using (var db = new DatabaseContext(_sqlConnectionString)) + { + record.Timestamp = DateTime.Now; + db.Add(record); + db.SaveChanges(); + } + } + + public void DropAndCreateModelTable() + { + using var dbContext = new DatabaseContext(_sqlConnectionString); + dbContext.Database.ExecuteSqlRaw($"drop table if exists {MODELTABLENAME}"); + dbContext.Database.ExecuteSqlRaw($"create table {MODELTABLENAME} ([id] [int] IDENTITY(1,1) NOT NULL, [data] [varbinary](max) NULL, [description] varchar(1000))"); + } + + public void InsertModelFromUrl(string url) + { + using var webClient = new WebClient(); + byte[] modelBytes = webClient.DownloadData(url); + using var dbContext = new DatabaseContext(_sqlConnectionString); + var query = $"insert into {MODELTABLENAME} ([description], [data]) values ('Onnx Model',?)"; + var model = new OnnxModel { Description = "Onnx Model", Data = modelBytes }; + dbContext.Add(model); + dbContext.SaveChanges(); + } + + public int GetModelResult() + { + SqlParameter[] @params = + { + new SqlParameter("@Result", SqlDbType.Int) {Direction = ParameterDirection.Output} + }; + + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"EXEC " + RUNMODELSTOREDPROCNAME + " @Result OUTPUT", @params); + } + + return (int)@params[0].Value; + } + + public void TruncateRealtimeSensorRecordTable() + { + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + dbContext.Database.ExecuteSqlRaw($"exec " + TRUNCATEREALTIMESENSORTABLESTOREDPROCNAME); + } + } + + public void WriteSensorRecordsToDB(List records) + { + using (var dbContext = new DatabaseContext(_sqlConnectionString)) + { + records.ForEach(record => + { + dbContext.Add(record); + }); + dbContext.SaveChanges(); + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataExporterService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataExporterService.cs new file mode 100644 index 0000000000..acab5f362c --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataExporterService.cs @@ -0,0 +1,10 @@ +using SensorModule.Models; +using System.Collections.Generic; + +namespace SensorModule.Services.Interfaces +{ + public interface IDataExporterService + { + void SaveParquet(IEnumerable records, string outputFile); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataGeneratorService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataGeneratorService.cs new file mode 100644 index 0000000000..41f7613a3b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataGeneratorService.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using SensorModule.Models; + +namespace SensorModule.Services.Interfaces +{ + public interface IDataGeneratorService + { + IEnumerable GenerateTrainingRecords(int amountOfRecords); + + RealtimeWindTurbineRecord GenerateRealTimeRecords(bool stopWake); + List GenerateRealTimeSensorRecords(bool stopWake); + + void ClearBuffer(); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataStoreService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataStoreService.cs new file mode 100644 index 0000000000..4ddec645ad --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/Services/Interfaces/IDataStoreService.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using SensorModule.Models; + +namespace SensorModule.Services.Interfaces +{ + public interface IDataStoreService + { + void WriteToDB(RealtimeWindTurbineRecord record); + bool ModelResponse(); + void TruncateRealtimeWindTurbineRecordTable(); + void SetSqlConnectionString(string sqlConnectionString); + void DropAndCreateModelTable(); + void InsertModelFromUrl(string url); + int GetModelResult(); + void TruncateRealtimeSensorRecordTable(); + void WriteSensorRecordsToDB(List records); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/module.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/module.json new file mode 100644 index 0000000000..5542c079cc --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/SensorSolution/modules/SensorModule/module.json @@ -0,0 +1,20 @@ +{ + "$schema-version": "0.0.1", + "description": "", + "image": { + "repository": "$CONTAINER_REGISTRY_NAME/sensormodule", + "tag": { + "version": "0.0.24", + "platforms": { + "amd64": "./Dockerfile.amd64", + "amd64.debug": "./Dockerfile.amd64.debug", + "arm32v7": "./Dockerfile.arm32v7", + "arm32v7.debug": "./Dockerfile.arm32v7.debug", + "windows-amd64": "./Dockerfile.windows-amd64" + } + }, + "buildOptions": [], + "contextPath": "./" + }, + "language": "csharp" +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/sensor-solution.code-workspace b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/sensor-solution.code-workspace new file mode 100644 index 0000000000..876a1499c0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/edge/sensor-solution.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/Github repo.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/Github repo.png new file mode 100644 index 0000000000..5aee7afceb Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/Github repo.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/azure-active-directory-option.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/azure-active-directory-option.png new file mode 100644 index 0000000000..a7cda48cb0 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/azure-active-directory-option.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/copy.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/copy.png new file mode 100644 index 0000000000..5b3ef26498 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/copy.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/iotedge-vm-dns-name.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/iotedge-vm-dns-name.png new file mode 100644 index 0000000000..ce7799aadc Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/iotedge-vm-dns-name.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/machine-learning-resource.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/machine-learning-resource.png new file mode 100644 index 0000000000..f5be55a8c4 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/images/machine-learning-resource.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/data/TrainingDataset.parquet b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/data/TrainingDataset.parquet new file mode 100644 index 0000000000..6bce038ebc Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/data/TrainingDataset.parquet differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/train.py b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/train.py new file mode 100644 index 0000000000..16f5bd6b85 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/train.py @@ -0,0 +1,33 @@ + +from azureml.core import Run + +from sklearn.compose import ColumnTransformer +from sklearn.pipeline import Pipeline +from sklearn.linear_model import LogisticRegression +from sklearn.preprocessing import StandardScaler + +from utils import * + +# Fetch current run +run = Run.get_context() + +# Fetch dataset from the run by name +dataset = run.input_datasets['training'] + +# Convert dataset to Pandas data frame +X_train, X_test, y_train, y_test = split_dataset(dataset) + +# Setup scikit-learn pipeline +numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())]) +preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, list(X_train.columns.values))]) + +clf = Pipeline(steps=[('preprocessor', preprocessor), + ('classifier', LogisticRegression())]) + +model = clf.fit(X_train, y_train) + +# Analyze model performance +analyze_model(clf, X_test, y_test) + +# Save model +model_id = save_model(clf) diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/utils.py b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/utils.py new file mode 100644 index 0000000000..b32d3c5fbe --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/scripts/utils.py @@ -0,0 +1,91 @@ +from azureml.core import Dataset, Model, Run +from azureml.contrib.interpret.explanation.explanation_client import ExplanationClient +from interpret.ext.blackbox import TabularExplainer + +from sklearn.preprocessing import LabelEncoder +from sklearn.metrics import accuracy_score, confusion_matrix, f1_score, precision_score, recall_score, roc_auc_score, roc_curve +from sklearn.model_selection import train_test_split + +import joblib +import matplotlib.pyplot as plt +import numpy as np +import os +import pandas as pd +import seaborn as sns +import sklearn + +OUTPUT_DIR = './outputs/' + +def split_dataset(dataset): + os.makedirs(OUTPUT_DIR, exist_ok=True) + + train_data = dataset.to_pandas_dataframe() + train_data = train_data.drop(columns=['TurbineId','Precipitation']) + + le = LabelEncoder() + train_data['AlterBlades'] = le.fit_transform(train_data['AlterBlades']) + + for x in train_data: + train_data[x] = pd.to_numeric(train_data[x]) + + y = train_data['AlterBlades'].values.flatten() + X = train_data.drop(['AlterBlades'], axis=1) + + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) + return X_train, X_test, y_train, y_test + +def analyze_model(clf, X_test, y_test): + run = Run.get_context() + + preds = clf.predict(X_test) + + accuracy = accuracy_score(y_test, preds) + run.log('Accuracy', np.float(accuracy)) + + precision = precision_score(y_test, preds, average="macro") + run.log('Precision', np.float(precision)) + + recall = recall_score(y_test, preds, average="macro") + run.log('Recall', np.float(recall)) + + f1score = f1_score(y_test, preds, average="macro") + run.log('F1 Score', np.float(f1score)) + + class_names = clf.classes_ + fig, ax = plt.subplots() + tick_marks = np.arange(len(class_names)) + plt.xticks(tick_marks, class_names) + plt.yticks(tick_marks, class_names) + sns.heatmap(pd.DataFrame(confusion_matrix(y_test, preds)), annot=True, cmap='YlGnBu', fmt='g') + ax.xaxis.set_label_position('top') + plt.tight_layout() + plt.title('Confusion Matrix', y=1.1) + plt.ylabel('Actual label') + plt.xlabel('Predicted label') + run.log_image('Confusion Matrix', plot=plt) + plt.close() + + preds_proba = clf.predict_proba(X_test)[::,1] + fpr, tpr, _ = roc_curve(y_test, preds_proba, pos_label = clf.classes_[1]) + auc = roc_auc_score(y_test, preds_proba) + plt.plot(fpr, tpr, label="data 1, auc=" + str(auc)) + plt.legend(loc=4) + run.log_image('ROC Curve', plot=plt) + plt.close() + +def save_model(clf): + run = Run.get_context() + dataset = run.input_datasets['training'] + + # Save model in the outputs folder + model_file_name = 'model.joblib' + joblib.dump(value=clf, filename=os.path.join(OUTPUT_DIR, model_file_name)) + run.upload_file(model_file_name, os.path.join(OUTPUT_DIR, model_file_name)) + + # Register the model + registered_model = run.register_model(model_name='wind_turbine_model', + model_path=model_file_name, + model_framework=Model.Framework.SCIKITLEARN, + model_framework_version=sklearn.__version__, + datasets=[(Dataset.Scenario.TRAINING, dataset)]) + return registered_model.id \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/utils.py b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/utils.py new file mode 100644 index 0000000000..24a62982f7 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/utils.py @@ -0,0 +1,26 @@ +from skl2onnx.common.data_types import FloatTensorType, Int64TensorType, DoubleTensorType + +import joblib +import pandas as pd + +def download_model(run): + run.download_file('model.joblib') + model = joblib.load('model.joblib') + return model + +def convert_dataframe_schema(df, drop=None, batch_axis=False): + inputs = [] + nrows = None if batch_axis else 1 + for k, v in zip(df.columns, df.dtypes): + if drop is not None and k in drop: + continue + if v == 'int64': + t = Int64TensorType([nrows, 1]) + elif v == 'float32': + t = FloatTensorType([nrows, 1]) + elif v == 'float64': + t = FloatTensorType([nrows, 1]) + else: + raise Exception("Bad type") + inputs.append((k, t)) + return inputs \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/wind-turbine-scikit.ipynb b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/wind-turbine-scikit.ipynb new file mode 100644 index 0000000000..457df9f6e5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/ml/wind-turbine-scikit.ipynb @@ -0,0 +1,616 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Wind Turbine: Azure ML with scikit-learn\n", + "\n", + "In this notebook, we'll build and analyze a new model to predict wind turbine wake winds.\n", + "\n", + "It is important to consider the two main conditions that influence the presence of wind wake:\n", + "1. Overall wind farm direction and turbine wind direction are both are between 40° - 45° degrees.\n", + "1. High difference that's greater than one minute between `TurbineSpeedStdDev` and `WindSpeedStdDev`.\n", + "\n", + "The above conditions are well known features to predict when `Wind Wake` is affecting the wind turbine." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Instructions\n", + "\n", + "Before you begin with this lab, please make sure to follow the steps below:\n", + "1. Locate the default datastore for the workspace, this can be done by authenticating against the workspace (cell #2) and execute the following command: `ws.get_default_datastore()`\n", + "1. Locate the dataset parquet file in the lab materials: `TrainingDataset.parquet`\n", + "1. Upload the dataset for this lab to the default datastore for the workspace. You can do this via Azure Portal or via Microsoft Azure Storage Explorer.\n", + "1. Ensure you have the correct version of `scikit-learn` and `joblib` installed. To install these dependencies, you can execute the cell below, skip this step if the dependencies are already installed.\n", + "1. Restart your kernel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install scikit-learn==0.22.1 joblib==0.14.1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup Azure ML\n", + "\n", + "In the next cell, we will create a new Workspace config object using the ``, ``, and ``. This will fetch the matching Workspace and prompt you for authentication. Please click on the link and input the provided details.\n", + "\n", + "For more information on **Workspace**, please visit: [Microsoft Workspace Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.workspace.workspace?view=azure-ml-py)\n", + "\n", + "`` = You can get this ID from the landing page of your Resource Group.\n", + "\n", + "`` = This is the name of your Resource Group.\n", + "\n", + "`` = This is the name of your Workspace." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.workspace import Workspace\n", + "from azureml.core.authentication import InteractiveLoginAuthentication\n", + "project_folder = './scripts'\n", + "\n", + "try: \n", + " interactive_auth = InteractiveLoginAuthentication(tenant_id=\"\")\n", + " # Get instance of the Workspace and write it to config file\n", + " ws = Workspace(\n", + " subscription_id = '', \n", + " resource_group = '', \n", + " workspace_name = '',\n", + " auth = interactive_auth)\n", + "\n", + " # Writes workspace config file\n", + " ws.write_config()\n", + " \n", + " print('Library configuration succeeded')\n", + "except Exception as e:\n", + " print(e)\n", + " print('Workspace not found')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fetch our data\n", + "\n", + "Let's retrieve our dataset from the default workspace Datastore." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import Dataset\n", + "from azureml.data.datapath import DataPath\n", + "from azureml.core import Datastore\n", + "\n", + "datastore = ws.get_default_datastore()\n", + "\n", + "datastore_path = [DataPath(datastore, '*.parquet')]\n", + "\n", + "tabular = Dataset.Tabular.from_parquet_files(path=datastore_path)\n", + "tabular = tabular.register(workspace=ws, \n", + " name='wind_turbine_training', \n", + " create_new_version=True)\n", + "tabular = Dataset.get_by_name(ws, name='wind_turbine_training')\n", + "print(tabular.version)\n", + "data = tabular.to_pandas_dataframe()\n", + "data.head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we'll take a subset of our data and then proceed to visualize it to better understand any patterns and trends that might exist to drive good ML models." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "subset = tabular.take_sample(probability=0.4, seed=123).to_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dataset Description\n", + "\n", + "Describe our current dataset. The table below shows the different statistical values for our training subset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "subset.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Wind Direction\n", + "\n", + "Let's take a look at the Turbine Wind Direction distribution against the Wind Direction Angle. As we can see, we have a considerable alteration between 40° and 50° degrees." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import seaborn as sns\n", + "import matplotlib.pyplot as plt\n", + "from IPython.display import display\n", + "\n", + "hstyle={\"rwidth\":0.75,'edgecolor':'black'}\n", + "\n", + "# Analyze distribution of TurbineWindDirection in the dataset\n", + "fig, ax = plt.subplots()\n", + "sns.distplot(subset[['TurbineWindDirection']], ax=ax, \n", + " hist_kws=hstyle).set_title(\"Turbine Wind Direction Distribuition\")\n", + "ax.set_xlim(0,360)\n", + "ax.set(xlabel=\"Wind Direction Angle\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Wind Direction vs Alter Blades\n", + "\n", + "Let's take a look at how our training dataset conducts for `Alter Blades` against the `Wind Direction Angle`. It is very clear that between 40° and 50° degrees we have a clear spike of `True` values for `Alter Blades`. Keep in mind, that the target column for our prediction is `Alter Blades`, this column will enable us to identify a wake condition." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "g = sns.FacetGrid(subset, col='AlterBlades')\n", + "g.map(sns.distplot, 'TurbineWindDirection', hist_kws=hstyle)\n", + "g.set(xlabel=\"Wind Direction Angle\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Speed\n", + "\n", + "Let's take a look at the Turbine Speed distribution. In the chart, we can observe the distribution has values between 10 and 25 km/h." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "sns.distplot(subset[['TurbineSpeedAverage']], ax=ax, \n", + " hist_kws=hstyle).set_title(\"Average Turbine Speed Distribuition\")\n", + "ax.set(xlabel=\"Average Turbine Speed\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbine Speed Standard Deviation vs Alter Blades\n", + "\n", + "Let's take a look at how our training dataset behaves for `Alter Blades` against the `Turbine Speed Standard Deviation`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Analyze how age influences whether customers have responded to insurance campaigns\n", + "g = sns.FacetGrid(subset, col='AlterBlades')\n", + "g.map(sns.distplot, 'TurbineSpeedStdDev', hist_kws=hstyle)\n", + "g.set(xlabel=\"Turbine Speed Std Dev\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wind Speed\n", + "\n", + "Let's take a look at the Wind Speed distribution. In the chart, we can observe the distribution has values between 10 and 25 km/h." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots()\n", + "sns.distplot(subset[['WindSpeedAverage']], ax=ax, \n", + " hist_kws=hstyle).set_title(\"Average Wind Speed Distribuition\")\n", + "ax.set(xlabel=\"Average Wind Speed\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wind Speed Standard Deviation vs Alter Blades\n", + "\n", + "Let's take a look at how our training dataset behaves for `Alter Blades` against the `Turbine Speed Standard Deviation`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Analyze how age influences whether customers have responded to insurance campaigns\n", + "g = sns.FacetGrid(subset, col='AlterBlades')\n", + "g.map(sns.distplot, 'WindSpeedStdDev', hist_kws=hstyle)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Isolate AlterBlades rows true values\n", + "\n", + "Let's create a Facet Grid to understand the trends that our `True` values from the `Alter Blades` column has against other features in the dataset such as:\n", + "1. Turbine Speed Standard Deviation\n", + "1. Turbine Wind Direction\n", + "1. Wind Speed Standard Deviation\n", + "\n", + "As we are able to see, when `Turbine Wind Direction` is around 40° to 45° degrees, it is a very good indication for an `Alter Blades: True` value. Also, we are able to see that high `Turbine Speed Standard Deviation` versus a low `Wind Speed Standard Deviation` are also key features to achieve a `True` value in the `Alter Blades` column" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "alterBlades = subset.loc[subset.AlterBlades]\n", + "g = sns.FacetGrid(alterBlades, col='AlterBlades')\n", + "g.map(plt.hist, 'TurbineSpeedStdDev')\n", + "g.set(xlabel=\"Turbine Speed Std Dev\")\n", + "\n", + "display(g)\n", + "\n", + "g = sns.FacetGrid(alterBlades, col='AlterBlades')\n", + "g.map(plt.hist, 'TurbineWindDirection')\n", + "g.set(xlabel=\"Turbine Wind Direction Angle\")\n", + "\n", + "display(g)\n", + "\n", + "g = sns.FacetGrid(alterBlades, col='AlterBlades')\n", + "g.map(plt.hist, 'WindSpeedStdDev')\n", + "g.set(xlabel=\"Wind Speed Std Dev\")\n", + "\n", + "display(g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pairplot Wind Speed Std Dev, Turbine Speed Std Dev and Alter Blades\n", + "\n", + "Let's place our key features in a Pair plot to analyze their trends." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Analyze how age and category gardening spend is influenced by age and region\n", + "sns.pairplot(subset, vars=['WindSpeedStdDev', 'TurbineSpeedStdDev'], hue='AlterBlades')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create experiment\n", + "\n", + "In our script, there are three distinct sections:\n", + "1. Setting up the scikit-learn logistic regression model pipeline (including encoding our features).\n", + "1. Analyzing and logging the results of the model training.\n", + "1. Running the model explainer to understand the key model drivers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile $project_folder/train.py\n", + "\n", + "from azureml.core import Run\n", + "\n", + "from sklearn.compose import ColumnTransformer\n", + "from sklearn.pipeline import Pipeline\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.preprocessing import StandardScaler\n", + "\n", + "from utils import *\n", + "\n", + "# Fetch current run\n", + "run = Run.get_context()\n", + " \n", + "# Fetch dataset from the run by name\n", + "dataset = run.input_datasets['training']\n", + "\n", + "# Convert dataset to Pandas data frame\n", + "X_train, X_test, y_train, y_test = split_dataset(dataset)\n", + "\n", + "# Setup scikit-learn pipeline\n", + "numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())])\n", + "preprocessor = ColumnTransformer(transformers=[('num', numeric_transformer, list(X_train.columns.values))])\n", + "\n", + "clf = Pipeline(steps=[('preprocessor', preprocessor),\n", + " ('classifier', LogisticRegression())])\n", + "\n", + "model = clf.fit(X_train, y_train)\n", + "\n", + "# Analyze model performance\n", + "analyze_model(clf, X_test, y_test)\n", + "\n", + "# Save model\n", + "model_id = save_model(clf)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a Workspace Experiment\n", + "\n", + "The Experiment constructor allows to create an experiment instance. The constructor takes in the current workspace, which is fetched by calling `Workspace.from_config()` and an experiment name. \n", + "\n", + "For more information on **Experiment**, please visit: [Microsoft Experiment Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.experiment.experiment?view=azure-ml-py)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.experiment import Experiment\n", + "\n", + "# Get an instance of the Workspace from the config file\n", + "ws = Workspace.from_config()\n", + "\n", + "experiment_name = 'wake-detection-experiment'\n", + "\n", + "# Create Experiment\n", + "experiment = Experiment(ws, experiment_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Automated ML Compute cluster\n", + "\n", + "Firstly, check for the existence of the cluster. If it already exists, we are able to reuse it. Checking for the existence of the cluster can be performed by calling the constructor `ComputeTarget()` with the current workspace and name of the cluster.\n", + "\n", + "In case the cluster does not exist, the next step will be to provide a configuration for the new AML cluster by calling the function `AmlCompute.provisioning_configuration()`. It takes as parameters the VM size and the max number of nodes that the cluster can scale up to. After the configuration has executed, `ComputeTarget.create()` should be called with the previously configuration object and the workspace object.\n", + "\n", + "For more information on **ComputeTarget**, please visit: [Microsoft get_data Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.compute.computetarget?view=azure-ml-py)\n", + "\n", + "For more information on **AmlCompute**, please visit: [Microsoft get_data Documentation](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.compute.akscompute?view=azure-ml-py)\n", + "\n", + "\n", + "**Note:** Please wait for the execution of the cell to finish before moving forward." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core.compute import ComputeTarget, AmlCompute\n", + "from azureml.core.compute_target import ComputeTargetException\n", + "\n", + "# Create AML CPU Compute Cluster\n", + "try:\n", + " compute_target = ComputeTarget(workspace=ws, name='cpucluster')\n", + " print('Found existing compute target.')\n", + "except ComputeTargetException:\n", + " print('Creating a new compute target...')\n", + " compute_config = AmlCompute.provisioning_configuration(vm_size='Standard_DS12_v2',\n", + " max_nodes=4)\n", + "\n", + " compute_target = ComputeTarget.create(ws, 'cpucluster', compute_config)\n", + " compute_target.wait_for_completion(show_output=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Submit Experiment\n", + "\n", + "We'll use remote compute for this job. We need to install a couple of extra libraries, including those required for model interpretability.\n", + "\n", + "The `experiment.submit()` function is called to send the experiment for execution. The only parameter received by this function is the `Estimator` object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.train.sklearn import SKLearn\n", + "\n", + "estimator = SKLearn(source_directory=project_folder,\n", + " compute_target=compute_target,\n", + " entry_script='train.py',\n", + " inputs=[tabular.as_named_input('training')],\n", + " pip_packages=['azureml-dataprep[fuse,pandas]','joblib==0.14.1','azureml-interpret','azureml-contrib-interpret','matplotlib','scikit-learn==0.22.1','seaborn'])\n", + "\n", + "run = experiment.submit(estimator)\n", + "run" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Monitor Experiment\n", + "\n", + "The creation of an object of type `Run` will enable us to observe the experiment’s progress and results. The object is created by calling the constructor `Run()`. It takes, as arguments, the experiment and the identifier of the run to fetch. After the object has been instantiated, the `RunDetails()` function will retrieve the progress, metrics, and tasks for the specified run. They will be displayed by calling the function `show()` over the mentioned object.\n", + "\n", + "**Note:** Please wait for the execution of the cell to finish before moving forward. (Status should be **Completed**)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.core import Run\n", + "from azureml.widgets import RunDetails\n", + "\n", + "run = Run(experiment, run.id)\n", + "RunDetails(run).show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Encode dataset and download trained model\n", + "\n", + "First step is to encode our training data to take the shape expected by the Onnx converter. Next, download the model obtained from the best run. In order to download the model, the function `download_model()` should be called. This will take care of downloading the model obtained from the best run." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from utils import *\n", + "from scripts.utils import *\n", + "\n", + "# Convert dataset to Pandas data frame\n", + "X_train, X_test, y_train, y_test = split_dataset(tabular)\n", + "model = download_model(run)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert model to Onnx format\n", + "\n", + "Export the Sklearn model to Onnx format by using `skl2onnx`. This step will output an Onnx model that we will be able to publish to the Azure SQL Edge Database Instance to use along with our `PREDICT` statement. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import skl2onnx\n", + "import onnxmltools\n", + "\n", + "# Convert the scikit model to onnx format\n", + "onnx_model = skl2onnx.convert_sklearn(model, 'Wind Turbine Dataset', convert_dataframe_schema(X_train))\n", + "# Save the onnx model locally\n", + "onnx_model_path = 'windturbinewake.model.onnx'\n", + "onnxmltools.utils.save_model(onnx_model, onnx_model_path)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Save model to Azure Blob Storage\n", + "\n", + "Let's save our Onnx model to the default workspace Datastore." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "datastore.upload_files(files=[onnx_model_path],\n", + " overwrite=True,\n", + " show_progress=True)" + ] + } + ], + "metadata": { + "kernel_info": { + "name": "python3" + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.9" + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/Rules.ruleset b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/Rules.ruleset new file mode 100644 index 0000000000..f0f9919038 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/Rules.ruleset @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/.gitignore new file mode 100644 index 0000000000..8f8b43bb12 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/.gitignore @@ -0,0 +1,232 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ +/wwwroot/dist/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +orleans.codegen.cs + +/node_modules + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/.gitignore b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/.gitignore new file mode 100644 index 0000000000..4d29575de8 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/README.md new file mode 100644 index 0000000000..859d27a647 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/README.md @@ -0,0 +1,68 @@ +This project was bootstrapped with [Create React App](/~https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.
+Open [http://localhost:3000](http://localhost:3000) to view it in the browser. + +The page will reload if you make edits.
+You will also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.
+See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.
+It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.
+Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can’t go back!** + +If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. + +You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting + +### Analyzing the Bundle Size + +This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size + +### Making a Progressive Web App + +This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app + +### Advanced Configuration + +This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration + +### Deployment + +This section has moved here: https://facebook.github.io/create-react-app/docs/deployment + +### `npm run build` fails to minify + +This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package-lock.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package-lock.json new file mode 100644 index 0000000000..a04a62a02a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package-lock.json @@ -0,0 +1,14318 @@ +{ + "name": "azure-maps-demo", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.6.0.tgz", + "integrity": "sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helpers": "^7.6.0", + "@babel/parser": "^7.6.0", + "@babel/template": "^7.6.0", + "@babel/traverse": "^7.6.0", + "@babel/types": "^7.6.0", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/generator": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.2.tgz", + "integrity": "sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ==", + "requires": { + "@babel/types": "^7.7.2", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz", + "integrity": "sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.0.tgz", + "integrity": "sha512-Cd8r8zs4RKDwMG/92lpZcnn5WPQ3LAMQbCw42oqUh4s7vsSN5ANUZjMel0OOnxDLq57hoDDbai+ryygYfCTOsw==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.0.tgz", + "integrity": "sha512-LSln3cexwInTMYYoFeVLKnYPPMfWNJ8PubTBs3hkh7wCu9iBaqq1OOyW+xGmEdLxT1nhsl+9SJ+h2oUDYz0l2A==", + "requires": { + "@babel/types": "^7.7.0", + "esutils": "^2.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.0.tgz", + "integrity": "sha512-Su0Mdq7uSSWGZayGMMQ+z6lnL00mMCnGAbO/R0ZO9odIdB/WNU/VfQKqMQU0fdIsxQYbRjDM4BixIa93SQIpvw==", + "requires": { + "@babel/helper-hoist-variables": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz", + "integrity": "sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz", + "integrity": "sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ==", + "requires": { + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "@babel/helper-define-map": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz", + "integrity": "sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/types": "^7.7.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.0.tgz", + "integrity": "sha512-CDs26w2shdD1urNUAji2RJXyBFCaR+iBEGnFz3l7maizMkQe3saVw9WtjG1tz8CwbjvlFnaSLVhgnu1SWaherg==", + "requires": { + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz", + "integrity": "sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q==", + "requires": { + "@babel/helper-get-function-arity": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz", + "integrity": "sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz", + "integrity": "sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz", + "integrity": "sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz", + "integrity": "sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz", + "integrity": "sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-simple-access": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz", + "integrity": "sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + }, + "@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz", + "integrity": "sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-wrap-function": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz", + "integrity": "sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz", + "integrity": "sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g==", + "requires": { + "@babel/template": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz", + "integrity": "sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA==", + "requires": { + "@babel/types": "^7.7.0" + } + }, + "@babel/helper-wrap-function": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz", + "integrity": "sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/helpers": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.0.tgz", + "integrity": "sha512-VnNwL4YOhbejHb7x/b5F39Zdg5vIQpUUNzJwx0ww1EcVRt41bbGRZWhAURrfY32T5zTT3qwNOQFWpn+P0i0a2g==", + "requires": { + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.3.tgz", + "integrity": "sha512-bqv+iCo9i+uLVbI0ILzKkvMorqxouI+GbV13ivcARXn9NNEabi2IEz912IgNpT/60BNXac5dgcfjb94NjsF33A==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.0.tgz", + "integrity": "sha512-ot/EZVvf3mXtZq0Pd0+tSOfGWMizqmOohXmNZg6LNFjHOV+wOPv7BvVYh8oPR8LhpIP3ye8nNooKL50YRWxpYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.7.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz", + "integrity": "sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.5.5", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.6.0.tgz", + "integrity": "sha512-ZSyYw9trQI50sES6YxREXKu+4b7MAg6Qx2cvyDDYjP2Hpzd3FleOUwC9cqn1+za8d0A2ZU8SHujxFao956efUg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.6.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-decorators": "^7.2.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz", + "integrity": "sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz", + "integrity": "sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz", + "integrity": "sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", + "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.7.0.tgz", + "integrity": "sha512-vQMV07p+L+jZeUnvX3pEJ9EiXGCjB5CTTvsirFD9rpEuATnoAvLBLoYbw1v5tyn3d2XxSuvEKi8cV3KqYUa0vQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz", + "integrity": "sha512-hi8FUNiFIY1fnUI2n1ViB1DR0R4QeK4iHcTlW6aJkrPoTdb8Rf1EMQ6GT3f67DDkYyWgew9DFoOZ6gOoEsdzTA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", + "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz", + "integrity": "sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.7.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz", + "integrity": "sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz", + "integrity": "sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.7.0", + "@babel/helper-define-map": "^7.7.0", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-optimise-call-expression": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz", + "integrity": "sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz", + "integrity": "sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz", + "integrity": "sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", + "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.0.tgz", + "integrity": "sha512-P5HKu0d9+CzZxP5jcrWdpe7ZlFDe24bmqP6a6X8BHEBl/eizAsY8K6LX8LASZL0Jxdjm5eEfzp+FIrxCm/p8bA==", + "requires": { + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz", + "integrity": "sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==", + "requires": { + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz", + "integrity": "sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg==", + "requires": { + "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.7.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz", + "integrity": "sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg==", + "requires": { + "@babel/helper-hoist-variables": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.0.tgz", + "integrity": "sha512-u7eBA03zmUswQ9LQ7Qw0/ieC1pcAkbp5OQatbWUzY1PaBccvuJXUkYzoN1g7cqp7dbTu6Dp9bXyalBvD04AANA==", + "requires": { + "@babel/helper-module-transforms": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz", + "integrity": "sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz", + "integrity": "sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.5.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.6.3.tgz", + "integrity": "sha512-1/YogSSU7Tby9rq2VCmhuRg+6pxsHy2rI7w/oo8RKoBt6uBUFG+mk6x13kK+FY1/ggN92HAfg7ADd1v1+NCOKg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.0.tgz", + "integrity": "sha512-mXhBtyVB1Ujfy+0L6934jeJcSXj/VCg6whZzEcgiiZHNS0PGC7vUCsZDQCxxztkpIdF+dY1fUMcjAgEOC3ZOMQ==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", + "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", + "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.0.tgz", + "integrity": "sha512-AXmvnC+0wuj/cFkkS/HFHIojxH3ffSXE+ttulrqWjZZRaUOonfJc60e1wSNT4rV8tIunvu/R3wCp71/tLAa9xg==", + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.0.tgz", + "integrity": "sha512-Da8tMf7uClzwUm/pnJ1S93m/aRXmoYNDD7TkHua8xBDdaAs54uZpTWvEt6NGwmoVMb9mZbntfTqmG2oSzN/7Vg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz", + "integrity": "sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.2.tgz", + "integrity": "sha512-UWhDaJRqdPUtdK1s0sKYdoRuqK0NepjZto2UZltvuCgMoMZmdjhgz5hcRokie/3aYEaSz3xvusyoayVaq4PjRg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.2.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz", + "integrity": "sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/preset-env": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", + "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", + "requires": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.0", + "@babel/plugin-proposal-dynamic-import": "^7.7.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-syntax-top-level-await": "^7.7.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.7.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.7.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.7.0", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.7.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.7.0", + "@babel/plugin-transform-modules-systemjs": "^7.7.0", + "@babel/plugin-transform-modules-umd": "^7.7.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.7.0", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.7.0", + "@babel/types": "^7.7.1", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/preset-react": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.7.0.tgz", + "integrity": "sha512-IXXgSUYBPHUGhUkH+89TR6faMcBtuMW0h5OHbMuVbL3/5wK2g6a2M2BBpkLa+Kw0sAHiZ9dNVgqJMDP/O4GRBA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.7.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "@babel/preset-typescript": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.6.0.tgz", + "integrity": "sha512-4xKw3tTcCm0qApyT6PqM9qniseCE79xGHiUnNdKGdxNsGUc2X7WwZybqIpnTmoukg3nhPceI5KPNzNqLNeIJww==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.6.0" + } + }, + "@babel/runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.0.tgz", + "integrity": "sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.0.tgz", + "integrity": "sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/types": "^7.7.0" + } + }, + "@babel/traverse": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.2.tgz", + "integrity": "sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helper-function-name": "^7.7.0", + "@babel/helper-split-export-declaration": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/types": "^7.7.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.2.tgz", + "integrity": "sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" + }, + "@csstools/normalize.css": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", + "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==" + }, + "@hapi/address": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.2.tgz", + "integrity": "sha512-O4QDrx+JoGKZc6aN64L04vqa7e41tIiLU+OvKdcYaEMP97UttL0f9GIi9/0A4WAMx0uBd6SidDIhktZhgOcN8Q==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.0.tgz", + "integrity": "sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "slash": "^2.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "requires": { + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz", + "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz", + "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz", + "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz", + "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz", + "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz", + "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz", + "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==" + }, + "@svgr/babel-preset": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz", + "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0", + "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3", + "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0", + "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0", + "@svgr/babel-plugin-transform-svg-component": "^4.2.0" + } + }, + "@svgr/core": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz", + "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==", + "requires": { + "@svgr/plugin-jsx": "^4.3.3", + "camelcase": "^5.3.1", + "cosmiconfig": "^5.2.1" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz", + "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@svgr/plugin-jsx": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz", + "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==", + "requires": { + "@babel/core": "^7.4.5", + "@svgr/babel-preset": "^4.3.3", + "@svgr/hast-util-to-babel-ast": "^4.3.2", + "svg-parser": "^2.0.0" + } + }, + "@svgr/plugin-svgo": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz", + "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==", + "requires": { + "cosmiconfig": "^5.2.1", + "merge-deep": "^3.0.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.2.tgz", + "integrity": "sha512-F3VE5OvyOWBEd2bF7BdtFRyI6E9it3mN7teDw0JQTlVtc4HZEYiiLSl+Uf9Uub6IYHVGc+qIrxxDyeedkQru2w==", + "requires": { + "@babel/core": "^7.4.5", + "@babel/plugin-transform-react-constant-elements": "^7.0.0", + "@babel/preset-env": "^7.4.5", + "@babel/preset-react": "^7.0.0", + "@svgr/core": "^4.3.2", + "@svgr/plugin-jsx": "^4.3.2", + "@svgr/plugin-svgo": "^4.3.1", + "loader-utils": "^1.2.3" + } + }, + "@types/babel__core": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz", + "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", + "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz", + "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==" + }, + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==" + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" + }, + "@types/yargs": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.3.tgz", + "integrity": "sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.7.0.tgz", + "integrity": "sha512-H5G7yi0b0FgmqaEUpzyBlVh0d9lq4cWG2ap0RKa6BkF3rpBb6IrAoubt1NWh9R2kRs/f0k6XwRDiDz3X/FqXhQ==", + "requires": { + "@typescript-eslint/experimental-utils": "2.7.0", + "eslint-utils": "^1.4.2", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^2.0.1", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.7.0.tgz", + "integrity": "sha512-9/L/OJh2a5G2ltgBWJpHRfGnt61AgDeH6rsdg59BH0naQseSwR7abwHq3D5/op0KYD/zFT4LS5gGvWcMmegTEg==", + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.7.0", + "eslint-scope": "^5.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.7.0.tgz", + "integrity": "sha512-ctC0g0ZvYclxMh/xI+tyqP0EC2fAo6KicN9Wm2EIao+8OppLfxji7KAGJosQHSGBj3TcqUrA96AjgXuKa5ob2g==", + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.7.0", + "@typescript-eslint/typescript-estree": "2.7.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.7.0.tgz", + "integrity": "sha512-vVCE/DY72N4RiJ/2f10PTyYekX2OLaltuSIBqeHYI44GQ940VCYioInIb8jKMrK9u855OEJdFC+HmWAZTnC+Ag==", + "requires": { + "debug": "^4.1.1", + "glob": "^7.1.4", + "is-glob": "^4.0.1", + "lodash.unescape": "4.0.1", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + } + } + }, + "acorn-jsx": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "requires": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + } + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "requires": { + "type-fest": "^0.5.2" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.7.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.1.tgz", + "integrity": "sha512-w3b5y1PXWlhYulevrTJ0lizkQ5CyqfeU6BIRDbuhsMupstHQOeb1Ur80tcB1zxSu7AwyY/qCQ7Vvqklh31ZBFw==", + "requires": { + "browserslist": "^4.7.2", + "caniuse-lite": "^1.0.30001006", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.21", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-extract-comments": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz", + "integrity": "sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==", + "requires": { + "babylon": "^6.18.0" + } + }, + "babel-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "requires": { + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.9.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "babel-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "requires": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + } + }, + "babel-plugin-jest-hoist": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-macros": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", + "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", + "requires": { + "@babel/runtime": "^7.4.2", + "cosmiconfig": "^5.2.0", + "resolve": "^1.10.0" + } + }, + "babel-plugin-named-asset-import": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.4.tgz", + "integrity": "sha512-S6d+tEzc5Af1tKIMbsf2QirCcPdQ+mKUCY2H1nJj1DyA1ShwpsoxEOAwbWsG5gcXNV/olpvQd9vrUWRx4bnhpw==" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "babel-preset-jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.9.0" + } + }, + "babel-preset-react-app": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.2.tgz", + "integrity": "sha512-aXD+CTH8Chn8sNJr4tO/trWKqe5sSE4hdO76j9fhVezJSzmpWYWUSc5JoPmdSxADwef5kQFNGKXd433vvkd2VQ==", + "requires": { + "@babel/core": "7.6.0", + "@babel/plugin-proposal-class-properties": "7.5.5", + "@babel/plugin-proposal-decorators": "7.6.0", + "@babel/plugin-proposal-object-rest-spread": "7.5.5", + "@babel/plugin-syntax-dynamic-import": "7.2.0", + "@babel/plugin-transform-destructuring": "7.6.0", + "@babel/plugin-transform-flow-strip-types": "7.4.4", + "@babel/plugin-transform-react-display-name": "7.2.0", + "@babel/plugin-transform-runtime": "7.6.0", + "@babel/preset-env": "7.6.0", + "@babel/preset-react": "7.0.0", + "@babel/preset-typescript": "7.6.0", + "@babel/runtime": "7.6.0", + "babel-plugin-dynamic-import-node": "2.3.0", + "babel-plugin-macros": "2.6.1", + "babel-plugin-transform-react-remove-prop-types": "0.4.24" + }, + "dependencies": { + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz", + "integrity": "sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/preset-env": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.6.0.tgz", + "integrity": "sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-dynamic-import": "^7.5.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.5.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.0", + "@babel/plugin-transform-classes": "^7.5.5", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.6.0", + "@babel/plugin-transform-modules-systemjs": "^7.5.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.6.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.5", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.6.0", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "@babel/preset-react": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", + "integrity": "sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", + "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", + "integrity": "sha512-uZavT/gZXJd2UTi9Ov7/Z340WOSQ3+m1iBVRUknf+okKxonL9P83S3ctiBDtuRmRu8PiCHjqyueqQ9HYlJhxiw==", + "requires": { + "caniuse-lite": "^1.0.30001004", + "electron-to-chromium": "^1.3.295", + "node-releases": "^1.1.38" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001009", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001009.tgz", + "integrity": "sha512-M3rEqHN6SaVjgo4bIik7HsGcWXsi+lI9WA0p51RPMFx5gXfduyOXWJrc0R4xBkSK1pgNf4CNgy5M+6H+WiEP8g==" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "requires": { + "rsvp": "^4.8.4" + } + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "clone-deep": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", + "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "requires": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "requires": { + "arity-n": "^1.0.4" + } + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==" + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz", + "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==" + }, + "core-js-compat": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.1.tgz", + "integrity": "sha512-YdeJI26gLc0CQJ9asLE5obEgBz2I0+CIgnoTbS2T0d5IPQw/OCgCIFR527RmpduxjrB3gSEHoGOCTq9sigOyfw==", + "requires": { + "browserslist": "^4.7.2", + "semver": "^6.3.0" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + } + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "requires": { + "postcss": "^7.0.5" + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=" + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==" + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "requires": { + "cssom": "0.3.x" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "damerau-levenshtein": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "requires": { + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=" + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==" + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.306", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.306.tgz", + "integrity": "sha512-frDqXvrIROoYvikSKTIKbHbzO6M3/qC6kCIt/1FOa9kALe++c4VAJnwjSFvf1tYLEUsP2n9XZ4XSCyqc3l7A/A==" + }, + "elliptic": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.1.tgz", + "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==" + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.52", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.52.tgz", + "integrity": "sha512-bWCbE9fbpYQY4CU6hJbJ1vSz70EClMlDgJ7BmwI+zEJhxrwjesZRPglGJlsZhu0334U3hI+gaspwksH9IGD6ag==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.2", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, + "eslint": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.6.0.tgz", + "integrity": "sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^11.7.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } + } + }, + "eslint-config-react-app": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.0.2.tgz", + "integrity": "sha512-VhlESAQM83uULJ9jsvcKxx2Ab0yrmjUt8kDz5DyhTQufqWE0ssAnejlWri5LXv25xoXfdqOyeDPdfJS9dXKagQ==", + "requires": { + "confusing-browser-globals": "^1.0.9" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "eslint-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-3.0.2.tgz", + "integrity": "sha512-S5VnD+UpVY1PyYRqeBd/4pgsmkvSokbHqTXAQMpvCyRr3XN2tvSLo9spm2nEpqQqh9dezw3os/0zWihLeOg2Rw==", + "requires": { + "fs-extra": "^8.1.0", + "loader-fs-cache": "^1.0.2", + "loader-utils": "^1.2.3", + "object-hash": "^1.3.1", + "schema-utils": "^2.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", + "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-flowtype": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz", + "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==", + "requires": { + "lodash": "^4.17.15" + } + }, + "eslint-plugin-import": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", + "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.0", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", + "requires": { + "@babel/runtime": "^7.4.5", + "aria-query": "^3.0.0", + "array-includes": "^3.0.3", + "ast-types-flow": "^0.0.7", + "axobject-query": "^2.0.2", + "damerau-levenshtein": "^1.0.4", + "emoji-regex": "^7.0.2", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.1" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + } + } + }, + "eslint-plugin-react": { + "version": "7.14.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", + "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==", + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.1.0", + "object.entries": "^1.1.0", + "object.fromentries": "^2.0.0", + "object.values": "^1.1.0", + "prop-types": "^15.7.2", + "resolve": "^1.10.1" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" + }, + "espree": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "requires": { + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "ext": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.2.0.tgz", + "integrity": "sha512-0ccUQK/9e3NreLFg6K6np8aPyRgwycx+oFGtfx1dSp7Wj00Ozw9r05FgBRlzjf2XBM7LAzwgLyDscRrtSU91hA==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "requires": { + "bser": "^2.0.0" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "figures": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", + "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==" + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "follow-redirects": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", + "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", + "requires": { + "debug": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", + "requires": { + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.1.tgz", + "integrity": "sha512-09/VS4iek66Dh2bctjRkowueRJbY1JDGR1L/zRxO1Qk8Uxs6PnqaNSqalpizPT+CDjre3hnEsuzvhgomz9qYrA==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, + "gud": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz", + "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==" + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "handle-thing": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + }, + "handlebars": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.2.tgz", + "integrity": "sha512-29Zxv/cynYB7mkT1rVWQnV7mGX6v7H/miQ6dbEpYTKq5eJBN7PsRB+ViYJlcT6JINTSu4dVB9kOqEun78h6Exg==", + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "harmony-reflect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.1.tgz", + "integrity": "sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", + "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" + } + } + }, + "html-webpack-plugin": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", + "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", + "requires": { + "html-minifier": "^3.5.20", + "loader-utils": "^1.1.0", + "lodash": "^4.17.11", + "pretty-error": "^2.1.1", + "tapable": "^1.1.0", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "requires": { + "postcss": "^7.0.14" + } + }, + "identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=", + "requires": { + "harmony-reflect": "^1.4.6" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "immer": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz", + "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==" + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "requires": { + "has": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==" + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.9.0" + }, + "dependencies": { + "jest-cli": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "requires": { + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^13.3.0" + } + } + } + }, + "jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "requires": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.9.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-docblock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "requires": { + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-environment-jsdom": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-jsdom-fourteen": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom-fourteen/-/jest-environment-jsdom-fourteen-0.1.0.tgz", + "integrity": "sha512-4vtoRMg7jAstitRzL4nbw83VmGH8Rs13wrND3Ud2o1fczDhMUF32iIrNKwYGgeOPUdfvZU4oy8Bbv+ni1fgVCA==", + "requires": { + "jest-mock": "^24.5.0", + "jest-util": "^24.5.0", + "jsdom": "^14.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "jsdom": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz", + "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==", + "requires": { + "abab": "^2.0.0", + "acorn": "^6.0.4", + "acorn-globals": "^4.3.0", + "array-equal": "^1.0.0", + "cssom": "^0.3.4", + "cssstyle": "^1.1.1", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.0", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.1.3", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.5.0", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^6.1.2", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "optional": true + } + } + } + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-matcher-utils": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==" + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + } + }, + "jest-runner": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^13.3.0" + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + }, + "jest-snapshot": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "expect": "^24.9.0", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + } + }, + "jest-watch-typeahead": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.4.0.tgz", + "integrity": "sha512-bJR/HPNgOQnkmttg1OkBIrYFAYuxFxExtgQh67N2qPvaWGVC8TCkedRNPKBfmZfVXFD3u2sCH+9OuS5ApBfCgA==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.1", + "jest-watcher": "^24.3.0", + "slash": "^3.0.0", + "string-length": "^3.1.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "string-length": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + } + } + } + }, + "jest-watcher": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "requires": { + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.9.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + } + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", + "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.unescape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", + "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", + "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==" + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "merge-deep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", + "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", + "requires": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" + }, + "mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "requires": { + "mime-db": "1.42.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-create-react-context": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz", + "integrity": "sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==", + "requires": { + "@babel/runtime": "^7.4.0", + "gud": "^1.0.0", + "tiny-warning": "^1.0.2" + } + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "node-releases": { + "version": "1.1.40", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.40.tgz", + "integrity": "sha512-r4LPcC5b/bS8BdtWH1fbeK88ib/wg9aqmg6/s3ngNLn2Ewkn/8J6Iw3P9RTlfIAdSdvYvQl2thCY5Y+qTAQ2iQ==", + "requires": { + "semver": "^6.3.0" + } + }, + "node-sass": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", + "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==" + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", + "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + } + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "pnp-webpack-plugin": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-jd9olUr9D7do+RN8Wspzhpxhgp1n6Vd0NtQ4SFkmIACZoEL1nkyAdW9Ygrinjec0vgDcWjscFQQ1gDW8rsfKTg==", + "requires": { + "ts-pnp": "^1.1.2" + } + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.1.tgz", + "integrity": "sha512-L2YKB3vF4PetdTIthQVeT+7YiSzMoNMLLYxPXXppOOP7NoazEAy45sh2LvJ8leCQjfBcfkYQs8TtCcQjeZTp8A==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-browser-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-2.0.0.tgz", + "integrity": "sha512-xGG0UvoxwBc4Yx4JX3gc0RuDl1kc4bVihCzzk6UC72YPfq5fu3c717Nu8Un3nvnq1BJ31gBnFXIG/OaUTnpHgA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-flexbugs-fixes": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.1.0.tgz", + "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "requires": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-7.0.1.tgz", + "integrity": "sha512-NOp1fwrG+6kVXWo7P9SizCHX6QvioxFD/hZcI2MLxPmVnFJFC0j0DDpIuNw2tUDeCFMni59gCVgeJ1/hYhj2OQ==", + "requires": { + "@csstools/normalize.css": "^9.0.1", + "browserslist": "^4.1.1", + "postcss": "^7.0.2", + "postcss-browser-comments": "^2.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==" + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-safe-parser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz", + "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==", + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pretty-bytes": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz", + "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==" + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "promise": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.3.tgz", + "integrity": "sha512-HeRDUL1RJiLhyA0/grn+PTShlBAcLuh/1BJGtrvjwbvRDCTLLMEz9rOGCV+R3vHY4MixIuoMEd9Yq/XvsTPcjw==", + "requires": { + "asap": "~2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + } + } + }, + "react": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.11.0.tgz", + "integrity": "sha512-M5Y8yITaLmU0ynd0r1Yvfq98Rmll6q8AxaEe88c8e7LxO8fZ2cNgmFt0aGAS9wzf1Ao32NKXtCl+/tVVtkxq6g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-app-polyfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.4.tgz", + "integrity": "sha512-5Vte6ki7jpNsNCUKaboyofAhmURmCn2Y6Hu7ydJ6Iu4dct1CIGoh/1FT7gUZKAbowVX2lxVPlijvp1nKxfAl4w==", + "requires": { + "core-js": "3.2.1", + "object-assign": "4.1.1", + "promise": "8.0.3", + "raf": "3.4.1", + "regenerator-runtime": "0.13.3", + "whatwg-fetch": "3.0.0" + } + }, + "react-dev-utils": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", + "integrity": "sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==", + "requires": { + "@babel/code-frame": "7.5.5", + "address": "1.1.2", + "browserslist": "4.7.0", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "1.0.5", + "filesize": "3.6.1", + "find-up": "3.0.0", + "fork-ts-checker-webpack-plugin": "1.5.0", + "global-modules": "2.0.0", + "globby": "8.0.2", + "gzip-size": "5.1.1", + "immer": "1.10.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", + "loader-utils": "1.2.3", + "open": "^6.3.0", + "pkg-up": "2.0.0", + "react-error-overlay": "^6.0.3", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "sockjs-client": "1.4.0", + "strip-ansi": "5.2.0", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "browserslist": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", + "requires": { + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "react-dom": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.11.0.tgz", + "integrity": "sha512-nrRyIUE1e7j8PaXSPtyRKtz+2y9ubW/ghNgqKFHHAHaeP0fpF5uXR+sq8IMRHC+ZUxw7W9NyCDTBtwWxvkb0iA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.17.0" + } + }, + "react-error-overlay": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.3.tgz", + "integrity": "sha512-bOUvMWFQVk5oz8Ded9Xb7WVdEi3QGLC8tH7HmYP0Fdp4Bn3qw0tRFmr5TW6mvahzvmrK4a6bqWGfCevBflP+Xw==" + }, + "react-from-dom": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/react-from-dom/-/react-from-dom-0.3.1.tgz", + "integrity": "sha512-PeNBa8iuzoD7qHA9O7YpGnXFvC+XFFwStmFh2/r2zJAvEIaRg6EwOj+EPcDIFwyYBhqPIItxIx/dGdeWiFivjQ==" + }, + "react-inlinesvg": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-inlinesvg/-/react-inlinesvg-1.2.0.tgz", + "integrity": "sha512-IsznU+UzpUwDGzBWbf0bfSRA5Jbqz87xeoqLM/nSIDPkoHksInF1wCGybTSn4sIui+30TqboRQP1wAelNTkdog==", + "requires": { + "exenv": "^1.2.2", + "react-from-dom": "^0.3.0" + } + }, + "react-is": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", + "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==" + }, + "react-router": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.1.2.tgz", + "integrity": "sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.3.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.1.2.tgz", + "integrity": "sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.1.2", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-scripts": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.2.0.tgz", + "integrity": "sha512-6LzuKbE2B4eFQG6i1FnTScn9HDcWBfXXnOwW9xKFPJ/E3rK8i1ufbOZ0ocKyRPxJAKdN7iqg3i7lt0+oxkSVOA==", + "requires": { + "@babel/core": "7.6.0", + "@svgr/webpack": "4.3.2", + "@typescript-eslint/eslint-plugin": "^2.2.0", + "@typescript-eslint/parser": "^2.2.0", + "babel-eslint": "10.0.3", + "babel-jest": "^24.9.0", + "babel-loader": "8.0.6", + "babel-plugin-named-asset-import": "^0.3.4", + "babel-preset-react-app": "^9.0.2", + "camelcase": "^5.2.0", + "case-sensitive-paths-webpack-plugin": "2.2.0", + "css-loader": "2.1.1", + "dotenv": "6.2.0", + "dotenv-expand": "5.1.0", + "eslint": "^6.1.0", + "eslint-config-react-app": "^5.0.2", + "eslint-loader": "3.0.2", + "eslint-plugin-flowtype": "3.13.0", + "eslint-plugin-import": "2.18.2", + "eslint-plugin-jsx-a11y": "6.2.3", + "eslint-plugin-react": "7.14.3", + "eslint-plugin-react-hooks": "^1.6.1", + "file-loader": "3.0.1", + "fs-extra": "7.0.1", + "fsevents": "2.0.7", + "html-webpack-plugin": "4.0.0-beta.5", + "identity-obj-proxy": "3.0.0", + "is-wsl": "^1.1.0", + "jest": "24.9.0", + "jest-environment-jsdom-fourteen": "0.1.0", + "jest-resolve": "24.9.0", + "jest-watch-typeahead": "0.4.0", + "mini-css-extract-plugin": "0.8.0", + "optimize-css-assets-webpack-plugin": "5.0.3", + "pnp-webpack-plugin": "1.5.0", + "postcss-flexbugs-fixes": "4.1.0", + "postcss-loader": "3.0.0", + "postcss-normalize": "7.0.1", + "postcss-preset-env": "6.7.0", + "postcss-safe-parser": "4.0.1", + "react-app-polyfill": "^1.0.4", + "react-dev-utils": "^9.1.0", + "resolve": "1.12.0", + "resolve-url-loader": "3.1.0", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "style-loader": "1.0.0", + "terser-webpack-plugin": "1.4.1", + "ts-pnp": "1.1.4", + "url-loader": "2.1.0", + "webpack": "4.41.0", + "webpack-dev-server": "3.2.1", + "webpack-manifest-plugin": "2.1.1", + "workbox-webpack-plugin": "4.3.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "requires": { + "util.promisify": "^1.0.0" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + }, + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "requires": { + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" + }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "requires": { + "define-properties": "^1.1.2" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "resolve-url-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.0.tgz", + "integrity": "sha512-2QcrA+2QgVqsMJ1Hn5NnJXIGCX1clQ1F6QJTqOeiaDw9ACo1G2k+8/shq3mtqne03HOFyskAClqfxKyFBriXZg==", + "requires": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.0.0", + "compose-function": "3.0.3", + "convert-source-map": "1.6.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.14", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "postcss": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.14.tgz", + "integrity": "sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "requires": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + }, + "dependencies": { + "convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=" + } + } + }, + "rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + }, + "dependencies": { + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "requires": { + "kind-of": "^6.0.2" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "requires": { + "xmlchars": "^2.1.1" + } + }, + "scheduler": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.17.0.tgz", + "integrity": "sha512-7rro8Io3tnCPuY4la/NuI5F2yfESpnfZyT6TtkXnSWVkcu0BCDJ+8gk5ozUaFaxpIyNuWAPXrH0yFcSi28fnDA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "requires": { + "node-forge": "0.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "dependencies": { + "kind-of": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "requires": { + "is-buffer": "^1.0.2" + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, + "sisteransi": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" + }, + "dependencies": { + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "spdy": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", + "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-1.0.2.tgz", + "integrity": "sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==", + "requires": { + "babel-extract-comments": "^1.0.0", + "babel-plugin-transform-object-rest-spread": "^6.26.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.2.tgz", + "integrity": "sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "terser": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.0.tgz", + "integrity": "sha512-oDG16n2WKm27JO8h4y/w3iqBGAOSCtq7k8dRmrn4Wf9NouL0b2WpMHGChFGZq4nFAQy1FsNJrVQHfurXOSTmOA==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz", + "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-invariant": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", + "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "ts-pnp": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.4.tgz", + "integrity": "sha512-1J/vefLC+BWSo+qe8OnJQfWTYRS6ingxjwqmHMqaMxXMj7kFtKLgAaYW3JeX3mktjgUL+etlU8/B4VUAUI9QGw==" + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.1.0.tgz", + "integrity": "sha512-kVrp/8VfEm5fUt+fl2E0FQyrpmOYgMEkBsv8+UDP1wFhszECq5JyGF33I7cajlVY90zRZ6MyfgKXngLvHYZX8A==", + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.5.0.tgz", + "integrity": "sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ==", + "requires": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "webpack": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.0.tgz", + "integrity": "sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==", + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.2.1.tgz", + "integrity": "sha512-sjuE4mnmx6JOh9kvSbPYw3u/6uxCLHNWfhWaIPwcXWsvWOPN+nc5baq4i9jui3oOBRXGonK9+OI0jVkaz6/rCw==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^4.1.1", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "^0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.2.0", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", + "sockjs": "0.3.19", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.5.1", + "webpack-log": "^2.0.0", + "yargs": "12.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "requires": { + "xregexp": "4.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", + "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-manifest-plugin": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.1.1.tgz", + "integrity": "sha512-2zqJ6mvc3yoiqfDjghAIpljhLSDh/G7vqGrzYcYqqRCd/ZZZCAuc/YPE5xG0LGpLgDJRhUNV1H+znyyhIxahzA==", + "requires": { + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "workbox-background-sync": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz", + "integrity": "sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-broadcast-update": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz", + "integrity": "sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-build": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-4.3.1.tgz", + "integrity": "sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==", + "requires": { + "@babel/runtime": "^7.3.4", + "@hapi/joi": "^15.0.0", + "common-tags": "^1.8.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.3", + "lodash.template": "^4.4.0", + "pretty-bytes": "^5.1.0", + "stringify-object": "^3.3.0", + "strip-comments": "^1.0.2", + "workbox-background-sync": "^4.3.1", + "workbox-broadcast-update": "^4.3.1", + "workbox-cacheable-response": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-expiration": "^4.3.1", + "workbox-google-analytics": "^4.3.1", + "workbox-navigation-preload": "^4.3.1", + "workbox-precaching": "^4.3.1", + "workbox-range-requests": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1", + "workbox-streams": "^4.3.1", + "workbox-sw": "^4.3.1", + "workbox-window": "^4.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "workbox-cacheable-response": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz", + "integrity": "sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-core": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-4.3.1.tgz", + "integrity": "sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==" + }, + "workbox-expiration": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-4.3.1.tgz", + "integrity": "sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-google-analytics": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz", + "integrity": "sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==", + "requires": { + "workbox-background-sync": "^4.3.1", + "workbox-core": "^4.3.1", + "workbox-routing": "^4.3.1", + "workbox-strategies": "^4.3.1" + } + }, + "workbox-navigation-preload": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz", + "integrity": "sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-precaching": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-4.3.1.tgz", + "integrity": "sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-range-requests": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz", + "integrity": "sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-routing": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-4.3.1.tgz", + "integrity": "sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-strategies": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-4.3.1.tgz", + "integrity": "sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-streams": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-4.3.1.tgz", + "integrity": "sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "workbox-sw": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-4.3.1.tgz", + "integrity": "sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==" + }, + "workbox-webpack-plugin": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz", + "integrity": "sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==", + "requires": { + "@babel/runtime": "^7.0.0", + "json-stable-stringify": "^1.0.1", + "workbox-build": "^4.3.1" + } + }, + "workbox-window": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-4.3.1.tgz", + "integrity": "sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==", + "requires": { + "workbox-core": "^4.3.1" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package.json new file mode 100644 index 0000000000..383dfc1357 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/package.json @@ -0,0 +1,35 @@ +{ + "name": "azure-maps-demo", + "version": "0.1.0", + "private": true, + "dependencies": { + "node-sass": "^4.13.0", + "normalize.css": "^8.0.1", + "react": "^16.11.0", + "react-dom": "^16.11.0", + "react-inlinesvg": "^1.2.0", + "react-router-dom": "^5.1.2", + "react-scripts": "3.2.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/favicon.ico b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/favicon.ico new file mode 100644 index 0000000000..bfe873eb22 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/favicon.ico differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/index.html b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/index.html new file mode 100644 index 0000000000..460e43d673 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + Contoso Renewable Energy + + + +
+ + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo192.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo192.png new file mode 100644 index 0000000000..fa313abf53 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo192.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo512.png b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo512.png new file mode 100644 index 0000000000..bd5d4b5e23 Binary files /dev/null and b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/logo512.png differ diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/manifest.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/manifest.json new file mode 100644 index 0000000000..080d6c77ac --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/robots.txt b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/robots.txt new file mode 100644 index 0000000000..01b0f9a107 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/public/robots.txt @@ -0,0 +1,2 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/App.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/App.js new file mode 100644 index 0000000000..cc19290f48 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/App.js @@ -0,0 +1,56 @@ +// node_modules +import React, { Component } from 'react' +import { BrowserRouter as Router, Route, Redirect } from "react-router-dom"; +import "normalize.css"; +import "./styles/global.scss"; + +// local components +import { Layout } from "./components/Layout"; +import { Home } from "./pages/Home"; +import Alerts from './pages/Alerts'; + +export default class App extends Component { + state = { + selected: 'dashboard', + showAlert: false, + showToast: false + } + + componentDidMount() { + this.pollForAlert(); + } + + componentWillUnmount() { + clearInterval(this.interval); + } + + pollForAlert = () => { + this.interval = setInterval(()=> { + fetch('/api/device').then(res => res.json()).then(json => { + const showToast = (this.state.showAlert && json.alert === false) || (this.state.showToast && json.alert === false); + this.setState({ showAlert: json.alert ? json.alert : false, showToast }); + }).catch(); + }, 1000); + } + + onSelect = (selected) => { + this.setState({ selected }); + } + + setShowToast = (showToast) => { + this.setState({ showToast }); + } + + render() { + const { selected, showAlert, showToast } = this.state; + return ( + + + }/> + } /> + } /> + + + ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/README.md new file mode 100644 index 0000000000..7101aab2de --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/README.md @@ -0,0 +1 @@ +# API Folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/sampleData.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/sampleData.js new file mode 100644 index 0000000000..235ab5a870 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/api/sampleData.js @@ -0,0 +1,4 @@ +export const getForecasts = async () => { + const forecastsResponse = await fetch("api/SampleData/WeatherForecasts"); + return await forecastsResponse.json(); +}; diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/README.md new file mode 100644 index 0000000000..f903599d70 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/README.md @@ -0,0 +1,3 @@ +# Shared Assets folder + +This folder is for shared assets that are imported into components. \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-oil-temperature.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-oil-temperature.svg new file mode 100644 index 0000000000..8f0f5ff664 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-oil-temperature.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Temp C + + + + + + 150 + + + + + + 125 + + + + + + 100 + + + + + + 75 + + + + + + 50 + + + + + + 25 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-power-generated.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-power-generated.svg new file mode 100644 index 0000000000..ecb79d4190 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-power-generated.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + Time + + + KWH + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-vibration.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-vibration.svg new file mode 100644 index 0000000000..38b052897a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-vibration.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Hertz + + + + + + 5 + + + + + + 4 + + + + + + 3 + + + + + + 2 + + + + + + 1 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-after.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-after.svg new file mode 100644 index 0000000000..922036f92a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-after.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Direction + + + + + + 360 + + + + + + 300 + + + + + + 240 + + + + + + 180 + + + + + + 60 + + + + + + 0 + + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-farm.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-farm.svg new file mode 100644 index 0000000000..a78cea30b0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-farm.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Direction + + + + + + 360 + + + + + + 300 + + + + + + 240 + + + + + + 180 + + + + + + 60 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-turbine.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-turbine.svg new file mode 100644 index 0000000000..7bdc4e4791 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-direction-turbine.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Direction + + + + + + 360 + + + + + + 300 + + + + + + 240 + + + + + + 180 + + + + + + 60 + + + + + + 0 + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-after.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-after.svg new file mode 100644 index 0000000000..8c1187e91b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-after.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Knots + + + + + + 80 + + + + + + 70 + + + + + + 60 + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-farm.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-farm.svg new file mode 100644 index 0000000000..7ff70dd256 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-farm.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Knots + + + + + + 80 + + + + + + 70 + + + + + + 60 + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-turbine.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-turbine.svg new file mode 100644 index 0000000000..289df52c6a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/graph-wind-speed-turbine.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + -5min + + + -4min + + + -3min + + + -2min + + + -1min + + + -0min + + + + Time + + + Knots + + + + + + 80 + + + + + + 70 + + + + + + 60 + + + + + + 50 + + + + + + 40 + + + + + + 30 + + + + + + 20 + + + + + + 10 + + + + + + 0 + + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/grid.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/grid.svg new file mode 100644 index 0000000000..9bf06a781d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/grid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-alerts.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-alerts.svg new file mode 100644 index 0000000000..26574f86dd --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-alerts.svg @@ -0,0 +1,4 @@ + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-close.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-close.svg new file mode 100644 index 0000000000..e33964322e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-dashboard.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-dashboard.svg new file mode 100644 index 0000000000..48f99ba859 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-dashboard.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-maintenance.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-maintenance.svg new file mode 100644 index 0000000000..673dcbd539 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-maintenance.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-models.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-models.svg new file mode 100644 index 0000000000..fb9a60f907 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-models.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-refresh.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-refresh.svg new file mode 100644 index 0000000000..b69331cecd --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-refresh.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-reports.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-reports.svg new file mode 100644 index 0000000000..bd20b5066f --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-reports.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-settings.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-settings.svg new file mode 100644 index 0000000000..96083408b4 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-settings.svg @@ -0,0 +1,3 @@ + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-tick.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-tick.svg new file mode 100644 index 0000000000..fd91a2cf75 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/icon-tick.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-issue.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-issue.svg new file mode 100644 index 0000000000..f103b71f2e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-issue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-oil-temperature.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-oil-temperature.svg new file mode 100644 index 0000000000..c76c7ba2e5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-oil-temperature.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-power-generated.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-power-generated.svg new file mode 100644 index 0000000000..880c6e3296 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-power-generated.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-security-alerts.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-security-alerts.svg new file mode 100644 index 0000000000..9a2cbcbad0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-security-alerts.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-vibration.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-vibration.svg new file mode 100644 index 0000000000..194ff2d8b0 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-vibration.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-direction.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-direction.svg new file mode 100644 index 0000000000..a34d14381d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-direction.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-speed.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-speed.svg new file mode 100644 index 0000000000..f5ed98112b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/line-wind-speed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/logo.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/logo.svg new file mode 100644 index 0000000000..51a3baebf9 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/logo.svg @@ -0,0 +1,10 @@ + + + + CONTOSO + + + RENEWABLE ENERGY + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/turbine.svg b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/turbine.svg new file mode 100644 index 0000000000..3a2fe5bf98 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/assets/turbine.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/Layout.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/Layout.scss new file mode 100644 index 0000000000..b5d78d87aa --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/Layout.scss @@ -0,0 +1,63 @@ +.Layout { + height: 100vh; + width: 100vw; + display: flex; + header { + width: 15vw; + -webkit-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + -moz-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + z-index: 1; + ul { + width: 100; + padding: 0; + margin: 0; + list-style-type: none; + li { + &.logo { + border-bottom: 1px solid #DDDFE1; + padding: 2vw; + svg { + width: 8vw; + } + } + &:nth-child(2) { + margin-top: 0.5vw; + } + padding: 1vw 2vw; + border-left: 2px solid transparent; + font-size: 0.8vw; + font-family: SegoeUISemiLight; + a { + text-decoration: none; + color: #6A707E; + display: flex; + align-items: center; + } + svg { + .icon-path { + fill:#aaa; + } + width: 1vw; + margin-right: 1vw; + } + &.selected { + background: #E5F5F5; + border-color: #00999A; + a { + color: #00999A; + } + svg { + .icon-path{ + fill: #00999a; + } + } + } + } + } + } + main { + flex: 1; + background: #B2D9EA; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/index.js new file mode 100644 index 0000000000..af5c31944d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Layout/index.js @@ -0,0 +1,51 @@ +// node_modules +import React from "react"; +import { Link } from "react-router-dom"; +import SVG from "react-inlinesvg"; + +// local imports +import "./Layout.scss"; +import Logo from '../../assets/logo.svg'; +import IconDashboard from '../../assets/icon-dashboard.svg'; +import IconAlerts from '../../assets/icon-alerts.svg'; +import IconReports from '../../assets/icon-reports.svg'; +import IconModels from '../../assets/icon-models.svg'; +import IconMaintenance from '../../assets/icon-maintenance.svg'; +import IconSettings from '../../assets/icon-settings.svg'; +import Toast from "../Toast"; + +export const Layout = ({ children, selected, showToast, setShowToast }) => { + return ( +
+
+ +
+
{children}
+ {showToast && {setShowToast(false)}} />} +
+ ); +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/README.md new file mode 100644 index 0000000000..289b0c49a5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/README.md @@ -0,0 +1 @@ +# Shared Components Folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/Toast.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/Toast.scss new file mode 100644 index 0000000000..6766ed377f --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/Toast.scss @@ -0,0 +1,24 @@ +.Toast { + position: absolute; + bottom: 1vw; + right: 1vw; + height: 2vw; + width: 10vw; + background: #00999A; + display: flex; + align-items: center; + color: white; + font-size: 0.7vw; + padding: 0 0.7vw; + .icon-tick { + width: 1vw; + margin-right: 0.3vw; + } + .icon-close { + width: 0.8vw; + cursor: pointer; + } + span { + flex: 1; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/index.js new file mode 100644 index 0000000000..e29c5239e4 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/components/Toast/index.js @@ -0,0 +1,16 @@ +import React, { Component } from 'react'; +import IconClose from '../../assets/icon-close.svg'; +import IconTick from '../../assets/icon-tick.svg'; +import './Toast.scss'; + +export default class Toast extends Component { + render() { + return ( +
+ icon tick + Alert resolved + icon close +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/index.js new file mode 100644 index 0000000000..a04419021a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/index.js @@ -0,0 +1,8 @@ +// node_modules +import React from 'react'; +import ReactDOM from 'react-dom'; + +// local components +import App from './App'; + +ReactDOM.render(, document.getElementById('root')); \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/Alerts.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/Alerts.scss new file mode 100644 index 0000000000..a35ed9bfc4 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/Alerts.scss @@ -0,0 +1,264 @@ +.Alerts { + position: relative; + height: 100%; + width: 100%; + .turbine { + width: 19vw; + position: absolute; + top: 7vw; + left: 34vw; + // max-height: 80vh; + } + .line { + position: absolute; + &.power-generated { + top: 14vw; + left: 28.5vw; + width: 11vw; + } + &.vibration { + top: 30vw; + left: 26.5vw; + width: 14vw; + } + &.oil-temperature { + top: 25vw; + left: 42.25vw; + width: 11vw; + } + &.security { + top: 11.2vw; + left: 42.8vw; + width: 15vw; + } + &.wind-direction { + top: 17.1vw; + left: 43vw; + width: 11.5vw; + } + &.wind-speed { + top: 11.9vw; + left: 47vw; + width: 9vw; + } + } + .loader { + position: absolute; + top: 40%; + left: calc(50% - 265px); + width: 450px; + background: white; + padding: 50px 40px; + -webkit-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + -moz-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + p { + color: #00999A; + font-family: SegoeUISemiBold; + font-size: 20px; + margin: 0; + margin-bottom: 20px; + text-align: center; + } + .progress-border { + background: #E4F4F4; + border: 1px solid #BBE0E0; + width: 450px; + height: 30px; + .progress { + background: #00999A; + height: 100%; + } + } + } + .content-wrap { + height: 100%; + width: 100%; + .menu { + position: absolute; + top: 2.5vw; + left: calc(50% - 13vw); + button { + width: 7vw; + color: #707070B2; + background: #E4F4F4; + border: 1px solid #707070B2; + height: 2.2vw; + text-align: center; + font-family: SegoeUISemiBold; + font-size: 0.7vw; + outline: none; + cursor: pointer; + &.selected { + color: #00999A; + border-color: #00999A; + } + &:first-child { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + } + &:last-child { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } + } + } + .refresh { + position: absolute; + top: 2.5vw; + cursor: pointer; + left: calc(50% + 2vw); + width: 5vw; + color: #707070B2; + background: #E4F4F4; + border: 1px solid #707070B2; + height: 2.2vw; + text-align: center; + font-family: SegoeUISemiBold; + font-size: 0.7vw; + outline: none; + justify-content: center; + display: flex; + align-items: center; + border-radius: 4px; + .icon { + width: 0.8vw; + margin-right: 0.35vw; + } + } + .stats-panels { + position: absolute; + top: 34vw; + left: 47vw; + display: flex; + } + .left-panels { + position: absolute; + top: 10vw; + left: 8vw; + display: flex; + flex-direction: column; + } + .right-panels { + position: absolute; + top: 10vw; + right: 8vw; + display: flex; + flex-direction: column; + } + .left-panels, .right-panels { + .panel { + margin-bottom: 30px; + } + .bottom-panels { + display: flex; + .panel { + margin-right: 2vw; + height: 3.5vw; + width: 7.5vw; + .stat { + font-size: 1.6vw; + font-family: SegoeUISemiLight; + color: #757B88; + } + } + } + } + .panel { + background: white; + padding: 20px; + padding: 1vw; + width: 19vw; + -webkit-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + -moz-box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + box-shadow: 3px 6px 24px -10px rgba(0,0,0,0.75); + + &.power { + top: 10vw; + left: 10vw; + position: absolute; + } + &.vibrations { + top: 29vw; + left: 6vw; + position: absolute; + } + &.oil { + top: 21vw; + left: 52vw; + position: absolute; + } + &.security { + top: 7vw; + left: 56vw; + width: 15vw; + position: absolute; + } + .graph { + width: 100%; + height: auto; + margin-left: -0.3vw; + margin-bottom: -0.3vw; + &.power-generated, &.vibration, &.oil-temperature { + .e,.f{fill:#777;font-size:10px;font-family:SegoeUISemilight,Segoe UI;font-weight:300;letter-spacing:.02em}.f{fill:#333}.h{opacity:.039} + } + &.wind-speed-farm, &.wind-direction-farm { + .d,.e{fill:#777;font-size:10px;font-family:SegoeUISemilight,Segoe UI;font-weight:300;letter-spacing:.02em}.e{fill:#333}.g{opacity:.039} + } + &.wind-speed-turbine, &.wind-direction-turbine { + .c,.d{fill:#777;font-size:10px;font-family:SegoeUISemilight,Segoe UI;font-weight:300;letter-spacing:.02em}.d{fill:#333}.f{opacity:.039} + } + } + p { + color: #6C7280; + font-family: SegoeUISemiLight; + font-size: 0.8vw; + margin: 0; + &.padded { + padding: 1.5vw 3vw; + text-align: center; + line-height: 1.5; + } + } + &.small { + width: 6vw; + height: 2.4vw; + margin-right: 0.5vw; + h3 { + font-size: 0.8vw; + margin-bottom: 10px; + } + } + .panel-heading { + display: flex; + width: 100%; + justify-content: space-between; + } + h3 { + color: #00999A; + font-size: 1vw; + font-family: SegoeUISemiBold; + margin: 0; + margin-bottom: 5px; + } + .legend { + color: #777777; + font-size: 0.55vw; + font-family: SegoeUISemiLight; + display: flex; + align-items: center; + .ball { + height: 0.3vw; + width: 0.3vw; + border-radius: 50%; + background: #777777; + margin-left: 0.6vw; + margin-right: 0.2vw; + &.actual { + background: #00C3FF; + } + } + } + } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/index.js new file mode 100644 index 0000000000..1ed2bbd0dd --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Alerts/index.js @@ -0,0 +1,211 @@ +import React, { Component } from 'react'; +import SVG from 'react-inlinesvg'; +import './Alerts.scss'; +import TurbineImage from '../../assets/turbine.svg'; +import LinePowerGenerated from '../../assets/line-power-generated.svg'; +import LineOilTemperature from '../../assets/line-oil-temperature.svg'; +import LineVibration from '../../assets/line-vibration.svg'; +import LineWindSpeed from '../../assets/line-wind-speed.svg'; +import LineWindDirection from '../../assets/line-wind-direction.svg'; +import LineSecurityAlert from '../../assets/line-security-alerts.svg'; +import GraphPowerGenerated from '../../assets/graph-power-generated.svg'; +import GraphOilTemperature from '../../assets/graph-oil-temperature.svg'; +import GraphVibration from '../../assets/graph-vibration.svg'; +import GraphWindSpeedFarm from '../../assets/graph-wind-speed-farm.svg'; +import GraphWindDirectionFarm from '../../assets/graph-wind-direction-farm.svg'; +import GraphWindSpeedTurbine from '../../assets/graph-wind-speed-turbine.svg'; +import GraphWindDirectionTurbine from '../../assets/graph-wind-direction-turbine.svg'; +import GraphWindSpeedTurbineV2 from '../../assets/graph-wind-speed-after.svg'; +import GraphWindDirectionTurbineV2 from '../../assets/graph-wind-direction-after.svg'; +import RefreshIcon from '../../assets/icon-refresh.svg'; + +export default class Alerts extends Component { + + state = { + progress: 0, + selectedView: 'progress', + hasRefreshed: false + } + + componentDidMount() { + this.props.onSelect('alerts'); + this.startLoading() + } + + startLoading() { + this.interval = setInterval(() => { + this.setState({ progress: this.state.progress + 1 }, () => { + if (this.state.progress === 100) { + clearInterval(this.interval); + this.setState({ selectedView: 'mechanical', progress: 0 }); + } + }) + }, 30) + } + + onRefresh = () => { + this.setState({ selectedView: 'progress' }, () => { + this.interval = setInterval(() => { + this.setState({ progress: this.state.progress + 1 }, () => { + if (this.state.progress === 100) { + clearInterval(this.interval) + this.setState({ selectedView: 'environmental', progress: 0, hasRefreshed: true }); + } + }) + }, 30) + }) + } + + render() { + const { selectedView, progress, hasRefreshed } = this.state; + return ( +
+ turbine + {selectedView === 'mechanical' && <> + + + + + } + {selectedView === 'environmental' && <> + + + } + {selectedView === 'progress' &&
+

Running Query for Unit 34…

+
+
+
+
} + {selectedView !== 'progress' &&
+ <> +
+ + +
+ + + {selectedView === 'mechanical' &&
+
+
+

Power Generated

+ +
Expected +
Actual +
+
+ +
+
+
+

Vibration

+ +
Expected +
Actual +
+
+ +
+
+
+

Security Alert

+
+

No events visible to current user

+
+
+
+

Oil Temperature

+ +
Expected +
Actual +
+
+ +
+
+
+
+

Fire

+
+

None detected

+
+
+
+

Malfunction

+
+

None detected

+
+
+
+

Part Failure

+
+

None detected

+
+
+
} + {selectedView === 'environmental' &&
+
+
+
+

Wind Speed (farm)

+
+ +
+
+
+

Wind Direction (farm)

+
+ +
+
+
+
+

Temperature

+
+
32°F
+
+
+
+

Humidity

+
+
12%
+
+
+
+
+
+
+

Wind Speed (turbine)

+
+ +
+
+
+

Wind Direction (turbine)

+
+ +
+
+
+
+

Temperature

+
+
32°F
+
+
+
+

Humidity

+
+
12%
+
+
+
+
} +
} +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/Home.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/Home.scss new file mode 100644 index 0000000000..4217e3d597 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/Home.scss @@ -0,0 +1,53 @@ +.Home { + height: 100%; + width: 100%; + position: relative; + overflow: hidden; + .turbine-wrap { + position: absolute; + } + .grid { + width: 120%; + position: absolute; + top: 10vw; + left: -20%; + } + .line-issue { + position: absolute; + top: 23vw; + left: 44.2vw; + height: 3vw; + } + .alert { + top: 18vw; + left: 48vw; + width: 13vw; + border: 1px solid #00999A; + position: absolute; + background: white; + padding: 0.8vw; + h3 { + font-size: 0.9vw; + font-family: SegoeUISemiBold; + color: #00999A; + margin: 0; + } + p { + font-size: 0.8vw; + font-family: SegoeUISemiLight; + color: #777777; + } + button { + color: white; + background: #00999A; + border: none; + border-radius: 5px; + width: 60px; + height: 20px; + font-family: SegoeUISemiBold; + font-size: 10px; + outline: none; + cursor: pointer; + } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/README.md new file mode 100644 index 0000000000..a4cec6b3dd --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/README.md @@ -0,0 +1,8 @@ +# Route folder + +This folder represents a top level route or 'page' in the application. The folder should only directly contain the `index.js` and the style file directly in the folder. + +- Any components should have their own folder and should be located the the sub-folder `components`. +- Any assets should be located in a sub-folder `assets`. + +Sometimes you will find a component or assets needs to be shared between multiple pages. This is when it 'graduates' into the appropriate shared folder in the `ClientApp/src`. \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/PulseRing.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/PulseRing.scss new file mode 100644 index 0000000000..d3fc9416df --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/PulseRing.scss @@ -0,0 +1,10 @@ +.PulseRing { + position: absolute; + width: 9vw; + top: 26.4vw; + left: 39.7vw; + .f{fill:none}.e{stroke:none} + g { + transition: opacity 0.3s; + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/index.js new file mode 100644 index 0000000000..d42935de7b --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/PulseRIng/index.js @@ -0,0 +1,44 @@ +import React, { useState, useEffect } from 'react'; +import './PulseRing.scss'; + +export const PulseRing = () => { + + const [status, setStatus] = useState(0); + + useEffect(() => { + const interval = setInterval(() => { + if (status === 3) { + setStatus(0); + } else { + setStatus(status + 1); + } + }, 300); + return () => { + clearInterval(interval); + } + }) + + return ( + + + + + + + 2 ? 1 : 0 }}> + + + + 1 ? 1 : 0 }}> + + + + 0 ? 1 : 0 }}> + + + + + + + ) +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/README.md new file mode 100644 index 0000000000..23b00e8875 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/README.md @@ -0,0 +1 @@ +# Page components folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/Turbine.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/Turbine.scss new file mode 100644 index 0000000000..f35e368e3c --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/Turbine.scss @@ -0,0 +1,33 @@ +.Turbine { + position: relative; + width: 8vw; + height: fit-content; + .top { + position: absolute; + left: 0.4vw; + width: 8vw; + height: 8vw; + top: 1vw; + .a{fill:#e6e6e6;stroke:#000;stroke-miterlimit:10;stroke-width:.25px} + } + .base { + position: absolute; + left: 3.5vw; + top: 4vw; + height: 10vw; + .a{fill:#e6e6e6;stroke:#000;stroke-miterlimit:10;stroke-width:.25px} + + @media screen and (min-width: 1200px) { + left: 3.65vw; + } + @media screen and (min-width: 1500px) { + left: 3.80vw; + } + @media screen and (min-width: 1600px) { + left: 3.90vw; + } + @media screen and (min-width: 1800px) { + left: 4vw; + } + } +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/index.js new file mode 100644 index 0000000000..8deffc1241 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/components/Turbine/index.js @@ -0,0 +1,52 @@ +import React, { Component } from 'react' +import './Turbine.scss'; + +export default class Turbine extends Component { + + state = { + rotationDegrees: 0, + slowRotationDegrees: 0 + } + + componentDidMount() { + this.interval = setInterval(() => { + this.setState({ + rotationDegrees: this.state.rotationDegrees === 360 ? 10 : this.state.rotationDegrees + 10, + slowRotationDegrees: this.state.slowRotationDegrees === 360 ? 5 : this.state.slowRotationDegrees + 5, + }) + }, 3000/36); + } + + render() { + const { rotationDegrees, slowRotationDegrees } = this.state; + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/index.js b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/index.js new file mode 100644 index 0000000000..4f0a8e3abc --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/Home/index.js @@ -0,0 +1,202 @@ +// node_modules +import React, { Component } from 'react'; +import './Home.scss'; +import { Link } from 'react-router-dom'; +import Turbine from './components/Turbine'; +import Grid from '../../assets/grid.svg'; +import Line from '../../assets/line-issue.svg'; +import { PulseRing } from './components/PulseRIng'; + +const turbinesData = [ + { + left: '14.15', + top: '6.25', + scale: 0.45 + }, + { + left: '24.65', + top: '7', + scale: 0.45 + }, + { + left: '34.3', + top: '7.7', + scale: 0.45 + }, + { + left: '45.35', + top: '8.5', + scale: 0.45 + }, + { + left: '59.2', + top: '9.5', + scale: 0.45 + }, + { + left: '70', + top: '10.2', + scale: 0.45 + }, + { + left: '77.55', + top: '10.8', + scale: 0.45 + }, + { + left: '2.25', + top: '6.2', + scale: 0.6 + }, + { + left: '13.65', + top: '7.3', + scale: 0.6 + }, + { + left: '24', + top: '8.4', + scale: 0.6 + }, + { + left: '37.3', + top: '9.65', + scale: 0.6 + }, + { + left: '53.3', + top: '11.3', + scale: 0.6 + }, + { + left: '66.9', + top: '12.6', + scale: 0.6 + }, + { + left: '76.5', + top: '13.6', + scale: 0.6 + }, + { + left: '0.5', + top: '7.9', + scale: 0.75 + }, + { + left: '12.5', + top: '9.3', + scale: 0.75 + }, + { + left: '27.9', + top: '11.2', + scale: 0.75 + }, + { + left: '46.9', + top: '13.6', + scale: 0.75 + }, + { + left: '63.35', + top: '15.6', + scale: 0.75 + }, + { + left: '75.45', + top: '17.2', + scale: 0.75 + }, + { + left: '0.15', + top: '9.9', + scale: 0.95 + }, + { + left: '17.65', + top: '12.5', + scale: 0.95 + }, + { + left: '39.6', + top: '15.7', + scale: 0.95, + canSlowDown: true + }, + { + left: '59.3', + top: '18.5', + scale: 0.95 + }, + { + left: '74.1', + top: '20.5', + scale: 0.95 + }, + { + left: '2.85', + top: '14.9', + scale: 1.20 + }, + { + left: '28.8', + top: '19.6', + scale: 1.20 + }, + { + left: '53.1', + top: '24.1', + scale: 1.20 + }, + { + left: '72.25', + top: '27.5', + scale: 1.20 + }, + { + left: '10.7', + top: '24.5', + scale: 1.7 + }, + { + left: '42.4', + top: '32.7', + scale: 1.7 + }, + { + left: '68.4', + top: '40.7', + scale: 1.7 + } +] + +export class Home extends Component { + + componentDidMount() { + this.props.onSelect('dashboard'); + } + + render() { + return ( +
+ {this.props.showAlert && } + grid + {turbinesData.map((t, i) => +
+ +
+ )} + {this.props.showAlert && + <> + +
+

Issue Detected

+

Unit 34 is experiencing an issue…

+ +
+ } +
+ ) + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/README.md b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/README.md new file mode 100644 index 0000000000..88791be21c --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/pages/README.md @@ -0,0 +1 @@ +# Pages Folder \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/styles/global.scss b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/styles/global.scss new file mode 100644 index 0000000000..680fc1e038 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/ClientApp/src/styles/global.scss @@ -0,0 +1,84 @@ +/* + Global Styles + + This file should only be used for site wide styles. If the style is specific to a component then it + should be in a file next to the component +*/ +@font-face { + font-family: SegoeUI; + src: local('Segoe UI'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.svg#web) + format('svg'); + font-weight: 400; +} + +@font-face { + font-family: SegoeUILight; + src: local('Segoe UI Light'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.svg#web) + format('svg'); + font-weight: 100; +} + +@font-face { + font-family: SegoeUISemilight; + src: local('Segoe UI Semilight'), local('Segoe UI'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.svg#web) + format('svg'); + font-weight: 200; +} + +@font-face { + font-family: SegoeUISemibold; + src: local('Segoe UI Semibold'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.svg#web) + format('svg'); + font-weight: 600; +} + +@font-face { + font-family: SegoeUIBold; + src: local('Segoe UI Bold'), local('Segoe UI'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff2) + format('woff2'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff) + format('woff'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.ttf) + format('truetype'), + url(//c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.svg#web) + format('svg'); + font-weight: 700; +} + +@import url('https://fonts.googleapis.com/css2?family=Audiowide&display=swap'); + +@import url('https://fonts.googleapis.com/css2?family=Cousine&display=swap'); + + +body { + font-family: SegoeUI; +} \ No newline at end of file diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Controllers/DeviceController.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Controllers/DeviceController.cs new file mode 100644 index 0000000000..f2c121b02d --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Controllers/DeviceController.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using SqlDbEdgeDemo.Web.Models; +using SqlDbEdgeDemo.Web.Services.Interfaces; + +namespace SqlDbEdgeDemo.Web.Controllers +{ + [Route("api/[controller]")] + public class DeviceController : Controller + { + private static IIoTHubModuleTwinService _ioTHubModuleTwinService; + + public DeviceController(IIoTHubModuleTwinService ioTHubModuleTwinService) + { + _ioTHubModuleTwinService = ioTHubModuleTwinService; + } + + [HttpGet] + public ActionResult GetStatus() + { + return Ok(_ioTHubModuleTwinService.GetTwinDeviceStatus()); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/DeviceModel.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/DeviceModel.cs new file mode 100644 index 0000000000..fda35f32de --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/DeviceModel.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SqlDbEdgeDemo.Web.Models +{ + public class DeviceModel + { + public bool Alert { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/IoTHubModuleTwinProperties.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/IoTHubModuleTwinProperties.cs new file mode 100644 index 0000000000..4f0061f3d5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Models/IoTHubModuleTwinProperties.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SqlDbEdgeDemo.Web.Models +{ + public class IoTHubModuleTwinReportedProperty + { + public string Alert { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Options/IoTHubOptions.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Options/IoTHubOptions.cs new file mode 100644 index 0000000000..ba8cd99e70 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Options/IoTHubOptions.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SqlDbEdgeDemo.Web.Options +{ + public class IoTHubOptions + { + public string ModuleConnectionString { get; set; } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml new file mode 100644 index 0000000000..6f92b95655 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml @@ -0,0 +1,26 @@ +@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml.cs new file mode 100644 index 0000000000..1c0ad38a45 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/Error.cshtml.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace SqlDbEdgeDemo.Web.Pages +{ + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + public class ErrorModel : PageModel + { + public string RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/_ViewImports.cshtml b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/_ViewImports.cshtml new file mode 100644 index 0000000000..dd20a6d14a --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using SqlDbEdgeDemo.Web +@namespace SqlDbEdgeDemo.Web.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Program.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Program.cs new file mode 100644 index 0000000000..f53152c3d5 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace SqlDbEdgeDemo.Web +{ + public class Program + { + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup(); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/Interfaces/IIoTHubModuleTwinService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/Interfaces/IIoTHubModuleTwinService.cs new file mode 100644 index 0000000000..691269732f --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/Interfaces/IIoTHubModuleTwinService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using SqlDbEdgeDemo.Web.Models; + +namespace SqlDbEdgeDemo.Web.Services.Interfaces +{ + public interface IIoTHubModuleTwinService + { + DeviceModel GetTwinDeviceStatus(); + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/IoTHubModuleTwinService.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/IoTHubModuleTwinService.cs new file mode 100644 index 0000000000..ca87e2e362 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Services/IoTHubModuleTwinService.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.Azure.Devices.Client; +using Newtonsoft.Json; +using SqlDbEdgeDemo.Web.Models; +using SqlDbEdgeDemo.Web.Options; +using SqlDbEdgeDemo.Web.Services.Interfaces; + +namespace SqlDbEdgeDemo.Web.Services +{ + public class IoTHubModuleTwinService : IIoTHubModuleTwinService + { + private static IoTHubOptions _options; + private static ModuleClient Client = null; + + public IoTHubModuleTwinService(IoTHubOptions options) + { + _options = options; + } + + public DeviceModel GetTwinDeviceStatus() + { + Connect(); + var twinTask = Client.GetTwinAsync(); + twinTask.Wait(); + var twin = twinTask.Result; + var properties = JsonConvert.DeserializeObject(twin.Properties.Reported.ToJson()); + return new DeviceModel + { + Alert = string.Equals(properties.Alert, "start", StringComparison.OrdinalIgnoreCase) + }; + } + + private void Connect() + { + if (Client == null) + { + try + { + Client = ModuleClient.CreateFromConnectionString(_options.ModuleConnectionString, TransportType.Amqp); + } + catch (Exception e) + { + Client = null; // Set to null for reconection + throw e; + } + } + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/SqlDbEdgeDemo.Web.csproj b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/SqlDbEdgeDemo.Web.csproj new file mode 100644 index 0000000000..4ea9913b7e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/SqlDbEdgeDemo.Web.csproj @@ -0,0 +1,50 @@ + + + + netcoreapp2.2 + true + Latest + false + ClientApp\ + $(DefaultItemExcludes);$(SpaRoot)node_modules\** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(DistFiles.Identity) + PreserveNewest + + + + + diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Startup.cs b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Startup.cs new file mode 100644 index 0000000000..97e9c07810 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/Startup.cs @@ -0,0 +1,75 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.SpaServices.ReactDevelopmentServer; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using SqlDbEdgeDemo.Web.Options; +using SqlDbEdgeDemo.Web.Services; +using SqlDbEdgeDemo.Web.Services.Interfaces; + +namespace SqlDbEdgeDemo.Web +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + var ioTHubOptions = Configuration.GetSection("IoTHub").Get(); + services.AddSingleton(sp => ioTHubOptions); + services.AddSingleton(sp => new IoTHubModuleTwinService(ioTHubOptions)); + + services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); + + // In production, the React files will be served from this directory + services.AddSpaStaticFiles(configuration => + { + configuration.RootPath = "ClientApp/build"; + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + app.UseSpaStaticFiles(); + + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller}/{action=Index}/{id?}"); + }); + + app.UseSpa(spa => + { + spa.Options.SourcePath = "ClientApp"; + + if (env.IsDevelopment()) + { + spa.UseReactDevelopmentServer(npmScript: "start"); + } + }); + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.Development.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.Development.json new file mode 100644 index 0000000000..e203e9407e --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.json b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.json new file mode 100644 index 0000000000..1c5b6ef904 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.Web/appsettings.json @@ -0,0 +1,11 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "IoTHub": { + "ModuleConnectionString": "" + }, + "AllowedHosts": "*" +} diff --git a/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.sln b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.sln new file mode 100644 index 0000000000..5616178951 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/Wind Turbine Demo/webappsrc/SqlDbEdgeDemoWeb/SqlDbEdgeDemo.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SqlDbEdgeDemo.Web", "SqlDbEdgeDemo.Web\SqlDbEdgeDemo.Web.csproj", "{CAC06327-8684-4D14-A31F-AF4D995FBB38}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x64.ActiveCfg = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x64.Build.0 = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x86.ActiveCfg = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Debug|x86.Build.0 = Debug|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|Any CPU.Build.0 = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x64.ActiveCfg = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x64.Build.0 = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x86.ActiveCfg = Release|Any CPU + {CAC06327-8684-4D14-A31F-AF4D995FBB38}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/samples/demos/azure-sql-edge-demos/readme.md b/samples/demos/azure-sql-edge-demos/readme.md new file mode 100644 index 0000000000..c6e6cb06e8 --- /dev/null +++ b/samples/demos/azure-sql-edge-demos/readme.md @@ -0,0 +1,2 @@ +# Azure SQL Demos + diff --git a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/cleanup-controller-new.sh b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/cleanup-controller-new.sh new file mode 100644 index 0000000000..3fe6979eb3 --- /dev/null +++ b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/cleanup-controller-new.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +DIR_PREFIX=$1 + +sudo kubeadm reset --force + +# Clean up azdata-cli package. +# +sudo dpkg --remove --force-all azdata-cli + +sudo systemctl stop kubelet +sudo rm -rf /var/lib/cni/ +sudo rm -rf /var/lib/etcd/ +sudo rm -rf /run/flannel/ +sudo rm -rf /var/lib/kubelet/* +sudo rm -rf /etc/cni/ +sudo rm -rf /etc/kubernetes/ + +sudo ip link set cni0 down +#brctl delbr cni0 +sudo ip link set flannel.1 down +#brctl delbr flannel.1 +sudo iptables -F && sudo iptables -t nat -F && sudo iptables -t mangle -F && sudo iptables -X + +sudo rm -rf .azdata/ + +# Remove mounts. +# +SERVICE_STOP_FAILED=0 + +sudo systemctl | grep "/var/lib/kubelet/pods" | while read -r line; do + + # Retrieve the mount path + # + MOUNT_PATH=`echo "$line" | grep -v echo | egrep -oh -m 1 "(/var/lib/kubelet/pods).+"` + + if [ -z "$MOUNT_PATH" ]; then + continue + fi + + if [[ ! -d "$MOUNT_PATH" ]] && [[ ! -f "$MOUNT_PATH" ]]; then + + SERVICE=$(echo $line | cut -f1 -d' ') + + echo "Mount "$MOUNT_PATH" no longer exists." + echo "Stopping orphaned mount service: '$SERVICE'" + + sudo systemctl stop $SERVICE + + if [ $? -ne 0 ]; then + SERVICE_STOP_FAILED=1 + fi + + echo "" + fi +done + +if [ $SERVICE_STOP_FAILED -ne 0 ]; then + echo "Not all services were stopped successfully. Please check the above output for more inforamtion." +else + echo "All orphaned services successfully stopped." +fi + +# Clean the mounted volumes. +# + +for i in $(seq 1 80); do + + vol="vol$i" + + sudo umount /azurearc/local-storage/$vol + + sudo rm -rf /azurearc/local-storage/$vol + +done + +# Reset kube +# +sudo apt-get purge -y kubeadm --allow-change-held-packages +sudo apt-get purge -y kubectl --allow-change-held-packages +sudo apt-get purge -y kubelet --allow-change-held-packages +sudo apt-get purge -y kubernetes-cni --allow-change-held-packages +sudo apt-get purge -y kube* --allow-change-held-packages +sudo apt -y autoremove +sudo rm -rf ~/.kube + +# Clean up working folders. +# +export AZUREARCDATACONTROLLER_DIR=arc-data +if [ -d "$AZUREARCDATACONTROLLER_DIR" ]; then + echo "Removing working directory $AZUREARCDATACONTROLLER_DIR." + rm -f -r $AZUREARCDATACONTROLLER_DIR +fi diff --git a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/cleanup-controller.sh b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/cleanup-controller.sh index 0d3ccd2ee9..9dca7dace9 100644 --- a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/cleanup-controller.sh +++ b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/cleanup-controller.sh @@ -6,6 +6,9 @@ sudo kubeadm reset --force # Clean up azdata-cli package. # +azdata extension remove --name azdata-cli-dc --yes +azdata extension remove --name azdata-cli-postgres --yes +azdata extension remove --name azdata-cli-sqlinstance --yes unalias azdata unalias az sudo dpkg --remove --force-all azdata-cli diff --git a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller-new.sh b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller-new.sh new file mode 100644 index 0000000000..896e6ddbf7 --- /dev/null +++ b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller-new.sh @@ -0,0 +1,362 @@ +#!/bin/bash + +# Prompt for private preview repository username and password provided by Microsoft +# +if [ -z "$DOCKER_USERNAME" ] +then + read -p 'Enter Azure Arc Data Controller repo username provided by Microsoft:' AADC_USERNAME + echo + export DOCKER_USERNAME=$AADC_USERNAME +fi +if [ -z "$DOCKER_PASSWORD" ] +then + read -sp 'Enter Azure Arc Data Controller repo password provided by Microsoft:' AADC_PASSWORD + echo + export DOCKER_PASSWORD=$AADC_PASSWORD +fi + + +# Propmpt for Arc Data Controller properties. +# +if [ -z "$ARC_DC_NAME" ] +then + read -p "Enter a name for the new Azure Arc Data Controller: " dc_name + echo + export ARC_DC_NAME=$dc_name +fi + +if [ -z "$ARC_DC_SUBSCRIPTION" ] +then + read -p "Enter a subscription ID for the new Azure Arc Data Controller: " dc_subscription + echo + export ARC_DC_SUBSCRIPTION=$dc_subscription +fi + +if [ -z "$ARC_DC_RG" ] +then + read -p "Enter a resource group for the new Azure Arc Data Controller: " dc_rg + echo + export ARC_DC_RG=$dc_rg +fi + +if [ -z "$ARC_DC_REGION" ] +then + read -p "Enter a region for the new Azure Arc Data Controller (eastus, eastus2, centralus, westus2, westeurope, southeastasia, japaneast, australiaeast, koreacentral, northeurope, uksouth, or francecentral): " dc_region + echo + export ARC_DC_REGION=$dc_region +fi + +# Get controller username and password as input. It is used as default for the controller. +# +if [ -z "$AZDATA_USERNAME" ] +then + read -p "Create Username for Azure Arc Data Controller: " username + echo + export AZDATA_USERNAME=$username +fi +if [ -z "$AZDATA_PASSWORD" ] +then + while true; do + read -s -p "Create Password for Azure Arc Data Controller: " password + echo + read -s -p "Confirm your Password: " password2 + echo + [ "$password" = "$password2" ] && break + echo "Password mismatch. Please try again." + done + export AZDATA_PASSWORD=$password +fi + +set -Eeuo pipefail + +# This is a script to create single-node Kubernetes cluster and deploy Azure Arc Data Controller on it. +# +export AZUREARCDATACONTROLLER_DIR=arc-data + +# Name of virtualenv variable used. +# +export LOG_FILE="arc-data-controller.log" +export DEBIAN_FRONTEND=noninteractive + +# Requirements file. +export OSCODENAME=$(lsb_release -cs) +export AZDATA_PRIVATE_PREVIEW_DEB_PACKAGE="https://aka.ms/aug-2020-arc-azdata-$OSCODENAME" + +# Kube version. +# +KUBE_DPKG_VERSION=1.16.3-00 +KUBE_VERSION=1.16.3 + +# Wait for 5 minutes for the cluster to be ready. +# +TIMEOUT=600 +RETRY_INTERVAL=5 + +# Variables used for azdata cluster creation. +# +export ACCEPT_EULA=yes +export CLUSTER_NAME=arc +export PV_COUNT="100" + +# Make a directory for installing the scripts and logs. +# +rm -f -r $AZUREARCDATACONTROLLER_DIR +mkdir -p $AZUREARCDATACONTROLLER_DIR +cd $AZUREARCDATACONTROLLER_DIR/ +touch $LOG_FILE + +{ +# Install all necessary packages: kuberenetes, docker, request, azdata. +# +echo "" +echo "######################################################################################" +echo "Starting installing packages..." + +# Install docker. +# +sudo apt-get update -q + +sudo apt --yes install \ + software-properties-common \ + apt-transport-https \ + ca-certificates \ + curl + +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + +sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + +sudo apt update -q +sudo apt-get install -q --yes docker-ce=18.06.2~ce~3-0~ubuntu --allow-downgrades +sudo apt-mark hold docker-ce + +sudo usermod --append --groups docker $USER + +# Create working directory +# +rm -f -r setupscript +mkdir -p setupscript +cd setupscript/ + +# Download and install azdata prerequisites +# +sudo apt install -y libodbc1 odbcinst odbcinst1debian2 unixodbc apt-transport-https libkrb5-dev + +# Download and install azdata package +# +echo "" + +if [[ -v AZDATA_DEB_PACKAGE_PATH ]]; then + sudo dpkg -i $AZDATA_DEB_PACKAGE_PATH +elif [[ -v AZDATA_DEB_PACKAGE_URL ]]; then + echo "Downloading azdata installer from" $AZDATA_DEB_PACKAGE_URL + curl --location $AZDATA_DEB_PACKAGE_URL --output azdata_setup.deb + sudo dpkg -i azdata_setup.deb +else + echo "Downloading azdata installer from" $AZDATA_PRIVATE_PREVIEW_DEB_PACKAGE + curl --location $AZDATA_PRIVATE_PREVIEW_DEB_PACKAGE --output azdata_setup.deb + sudo dpkg -i azdata_setup.deb +fi + +cd - + +azdata --version +echo "Azdata has been successfully installed." + +# Install Azure CLI +# +#curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash + +# Load all pre-requisites for Kubernetes. +# +echo "###########################################################################" +echo "Starting to setup pre-requisites for kubernetes..." + +# Setup the kubernetes preprequisites. +# +sudo swapoff -a +sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab + +curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - + +cat <> sudo tee -a /etc/hosts - sudo swapoff -a sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab @@ -290,7 +333,9 @@ echo "Starting to deploy azdata cluster..." # Command to create cluster for single node cluster. # -azdata control create -n $CLUSTER_NAME -c azure-arc-kubeadm-private-preview --accept-eula $ACCEPT_EULA +azdata arc dc config init -s azure-arc-kubeadm-private-preview -t azure-arc-custom --force + +azdata arc dc create -n $ARC_DC_NAME -p azure-arc-kubeadm-private-preview --namespace $CLUSTER_NAME --location $ARC_DC_REGION --resource-group $ARC_DC_RG --subscription $ARC_DC_SUBSCRIPTION --connectivity-mode indirect echo "Azure Arc Data Controller cluster created." # Setting context to cluster. diff --git a/samples/features/epm-framework/sample-policies/Asymmetric Key Encryption Algorithm.xml b/samples/features/epm-framework/sample-policies/Asymmetric Key Encryption Algorithm.xml new file mode 100644 index 0000000000..6d5429f999 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Asymmetric Key Encryption Algorithm.xml @@ -0,0 +1,352 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Asymmetric Key Encryption Algorithm + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/RSA 1024 or RSA 2048 Encrypted + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Asymmetric Key Encryption Algorithm + Checks whether asymmetric keys were created with 1024-bit or better. + RSA 1024 or RSA 2048 Encrypted + Asymmetric Key Encryption Algorithm_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116370 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + + + + /PolicyStore + + + Asymmetric Key Encryption Algorithm_ObjectSet + AsymmetricKey + + + + + + + /PolicyStore/Condition/RSA 1024 or RSA 2048 Encrypted + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>KeyEncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.AsymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Rsa1024</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>KeyEncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.AsymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Rsa2048</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + RSA 1024 or RSA 2048 Encrypted + Confirms that asymmetric keys were created with 1024-bit encryption or better. + AsymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> +</Operator> + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database_/AsymmetricKey + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet + + + Server/Database/AsymmetricKey + true + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database_/AsymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + Server/Database/AsymmetricKey + AsymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Asymmetric Key Encryption Algorithm__ObjectSet/TargetSet/Server_/Database_/AsymmetricKey + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Backup and Data File Location.xml b/samples/features/epm-framework/sample-policies/Backup and Data File Location.xml new file mode 100644 index 0000000000..5a5257f063 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Backup and Data File Location.xml @@ -0,0 +1,251 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Backup and Data File Location + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Data and Backup on Separate Drive + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Backup and Data File Location + Checks if database and the backups are on separate backup devices. If they are on the same backup device, and the device that contains the database fails, your backups will be unavailable. Also, putting the data and backups on separate devices optimizes the I/O performance for both the production use of the database and writing the backups.<?char 13?> +<?char 13?> +Note: This policy cannot detect separate physical devices through mount points. + Data and Backup on Separate Drive + Backup and Data File Location_ObjectSet + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116373 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Backup and Data File Location_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Data and Backup on Separate Drive + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>DataAndBackupOnSeparateLogicalVolumes</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Data and Backup on Separate Drive + Confirms that the database and the database backups are on separate drives. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Backup and Data File Location__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Data and Log File Location.xml b/samples/features/epm-framework/sample-policies/Data and Log File Location.xml new file mode 100644 index 0000000000..8bcc7fbab9 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Data and Log File Location.xml @@ -0,0 +1,405 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Data and Log File Location + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Data and Log Files on Separate Drives + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Data and Log File Location + Checks whether data and log files are placed on separate logical drives. Placing both data and log files on the same drive can cause contention for that drive and result in poor performance. Placing the files on separate drives allows the I/O activity to occur at the same time for both the data and log files. The best practice is to specify separate drives for the data and log when you create a new database. To move files after the database is created, the database must be taken offline. Move the files by using one of the following methods:<?char 13?> +<?char 13?> +* Restore the database from backup by using the RESTORE DATABASE statement with the WITH MOVE option. <?char 13?> +* Detach and then re-attach the database specifying separate locations for the data and log devices. <?char 13?> +* Specify a new location by running the ALTER DATABASE statement with the MODIFY FILE option, and then restarting the instance of SQL Server. <?char 13?> +<?char 13?> +Note: This policy cannot detect separate physical devices through mount points. + Data and Log Files on Separate Drives + Data and Log File Location_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116362 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Data and Log File Location_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Data and Log Files on Separate Drives + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>DataAndLogFilesOnSeparateLogicalVolumes</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LT</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Size</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>5120</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Data and Log Files on Separate Drives + Confirms that data and log files are placed on separate drives. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Data and Log File Location__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Auto Close.xml b/samples/features/epm-framework/sample-policies/Database Auto Close.xml new file mode 100644 index 0000000000..a1999799de --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Auto Close.xml @@ -0,0 +1,330 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Auto Close + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto Close Disabled + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Database Auto Close + Checks that the AUTO_ CLOSE option is off for SQL Server Standard and Enterprise Editions. When set to on, this option can cause performance degradation on frequently accessed databases because of the increased overhead of opening and closing the database after each connection. AUTO_CLOSE also flushes the procedure cache after each connection. + Auto Close Disabled + Database Auto Close_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116338 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Auto Close_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Auto Close Disabled + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>AutoClose</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Auto Close Disabled + Confirms that the AUTO_CLOSE database option is set to off. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Auto Close__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Auto Shrink.xml b/samples/features/epm-framework/sample-policies/Database Auto Shrink.xml new file mode 100644 index 0000000000..00272a0646 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Auto Shrink.xml @@ -0,0 +1,400 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Auto Shrink + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto Shrink Disabled + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Database Auto Shrink + Checks that the AUTO_SHRINK option is off for user databases on SQL Server Standard and Enterprise Editions. Frequently shrinking and expanding a database can lead to poor performance because of physical fragmentation. Set the AUTO_SHRINK database option to OFF. If you know that the space that you are reclaiming will not be needed in the future, you can manually shrink the database. + Auto Shrink Disabled + Database Auto Shrink_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116337 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Auto Shrink_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Auto Shrink Disabled + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>AutoShrink</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Auto Shrink Disabled + Confirms that the AUTO_SHRINK database option is set to off. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/Condition/Online User Database + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + Online User Database + Confirms that the database is not a system database and that it is online. + Database + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Auto Shrink__ObjectSet/TargetSet/Server_/Database + + + + + /PolicyStore/Condition/Online User Database + + + Server/Database + Database + Online User Database + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Collation.xml b/samples/features/epm-framework/sample-policies/Database Collation.xml new file mode 100644 index 0000000000..0e75cb3d25 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Collation.xml @@ -0,0 +1,252 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Collation + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Collation Matches master or model + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + Database Collation + Looks for user-defined databases that have a collation different from the master or model databases. It is recommended that you not use this configuration because collation conflicts can occur that might prevent code from executing. For example, when a stored procedure joins one table to a temporary table, SQL Server might end the batch and return a collation conflict error if the collations of the user-defined database and the model database are different. This happens because temporary tables are created in tempdb, which obtains its collation based on that of the model database. If you experience collation conflict errors, consider one of the following solutions:<?char 13?> + * Export the data from the user database and import it into new tables that have the same collation as the master and model databases.<?char 13?> + * Rebuild the system databases to use a collation that matches the user database collation.<?char 13?> + * Modify any stored procedures that join user tables to tables in tempdb to create the tables in tempdb by using the collation of the user database. To do this, add the COLLATE database_default clause to the column definitions of the temporary table. For example: CREATE TABLE #temp1 ( c1 int, c2 varchar(30) COLLATE database_default ) + Collation Matches master or model + Database Collation_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116336 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Collation_ObjectSet + IDatabasePerformanceFacet + + + + + + + /PolicyStore/Condition/Collation Matches master or model + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>CollationMatchesModelOrMaster</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Collation Matches master or model + Confirms that the collation of the database matches the master or model databases. + IDatabasePerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Collation__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Page Status.xml b/samples/features/epm-framework/sample-policies/Database Page Status.xml new file mode 100644 index 0000000000..0066895522 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Page Status.xml @@ -0,0 +1,306 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Page Status + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/No Suspect Database Pages + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Database Page Status + Checks whether the database has suspect database pages. A database page is set suspect by error 824. This error occurs when a logical consistency error is detected during a read operation, which frequently indicates data corruption caused by a faulty I/O subsystem component. When the SQL Server Database Engine detects a suspect page, the page ID is recorded in the msdbo.dbo.suspect_pages table. This is a severe error condition that threatens database integrity and must be corrected immediately.<?char 13?> +<?char 13?> +Best Practices Recommendations:<?char 13?> +* Review the SQL Server error log for the details of the 824 error for this database.<?char 13?> +* Complete a full database consistency check (DBCC CHECKDB).<?char 13?> +* Implement the user actions defined in MSSQLSERVER_824.<?char 13?> + + No Suspect Database Pages + Database Page Status_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116379 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Page Status_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/No Suspect Database Pages + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteSql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>SELECT COUNT(*) AS [Total_Suspect_Pages] FROM msdb.dbo.suspect_pages WHERE event_type IN (1,2,3) AND database_id = DB_ID(DB_NAME()) </Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> +</Operator> + No Suspect Database Pages + Confirms that the current database has no suspect database pages. A database page is set as suspect by error 824, which indicates that a logical consistency error was detected during a read operation. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> +</Operator> + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Page Status__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Database Page Verification.xml b/samples/features/epm-framework/sample-policies/Database Page Verification.xml new file mode 100644 index 0000000000..c7f0cdae7a --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Database Page Verification.xml @@ -0,0 +1,250 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Database Page Verification + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Page Verify Checksum + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Database Page Verification + Checks if the PAGE_VERIFY database option is not set to CHECKSUM to provide a high level of data-file integrity. When CHECKSUM is enabled for the PAGE_VERIFY database option, the SQL Server Database Engine calculates a checksum over the contents of the whole page, and stores the value in the page header when a page is written to disk. When the page is read from disk, the checksum is recomputed and compared to the checksum value that is stored in the page header. This helps provide a high level of data-file integrity. + Page Verify Checksum + Database Page Verification_ObjectSet + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116333 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Database Page Verification_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Page Verify Checksum + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>PageVerify</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>Microsoft.SqlServer.Management.Smo.PageVerify</ObjType><?char 13?> + <Value>Checksum</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Page Verify Checksum + Confirms that the PAGE_VERIFY database option set to CHECKSUM. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Database Page Verification__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Guest Permissions.xml b/samples/features/epm-framework/sample-policies/Guest Permissions.xml new file mode 100644 index 0000000000..b9785f3750 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Guest Permissions.xml @@ -0,0 +1,404 @@ + + + + +<_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Guest Permissions + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Has No Database Access + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Guest Permissions + Checks if permission to access the database is enabled for guest user. Remove access to the guest user if it is not required. The guest user cannot be dropped, but a guest user account can be disabled by revoking its CONNECT permission. You do this by executing REVOKE CONNECT FROM GUEST from within any database other than master, msdb, or tempdb. + Has No Database Access + Guest Permissions_ObjectSet + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116354 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + + /PolicyStore + + + Guest Permissions_ObjectSet + User + + + + + + + /PolicyStore/Condition/Has No Database Access + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>HasDBAccess</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> +</Operator> + Has No Database Access + Confirms that the database user does not have access to the database. + User + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database_/User + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet + + + Server/Database/User + true + + + + + + + /PolicyStore/Condition/Guest + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>guest</Value><?char 13?> + </Constant><?char 13?> +</Operator> + Guest + The user is the Guest account. + User + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database_/User + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + /PolicyStore/Condition/Guest + + + Server/Database/User + User + Guest + + + + + + + /PolicyStore/Condition/User or Model + + + + + + + + /PolicyStore + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Group><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Count>1</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>model</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + </Group><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> +</Operator> + User or Model + Confirms that the database is a user database or the Model database and that the database is online. + Database + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Guest Permissions__ObjectSet/TargetSet/Server_/Database_/User + + + + + /PolicyStore/Condition/User or Model + + + Server/Database + Database + User or Model + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Last Successful Backup Date.xml b/samples/features/epm-framework/sample-policies/Last Successful Backup Date.xml new file mode 100644 index 0000000000..6b684c7d44 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Last Successful Backup Date.xml @@ -0,0 +1,273 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Last Successful Backup Date + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Safe Last Backup Date + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Last Successful Backup Date + + Checks whether a database has recent backups. Scheduling regular backups is important for protecting your databases against data loss from a variety of failures.<?char 13?> + <?char 13?> + The appropriate frequency for backing up data depends on the recovery model of the database, on business requirements regarding potential data loss, and on how frequently the database is updated. In a frequently updated database, the amount of work-loss exposure increases relatively quickly between backups.<?char 13?> + <?char 13?> + The best practice is to perform backups frequently enough to protect databases against data loss. The simple recovery model and full recovery model both require data backups. The full recovery model also requires log backups, which should be taken more often than data backups. For either recovery model, you can supplement your full backups with differential backups to efficiently reduce the risk of data loss. For a database that uses the full recovery model, Microsoft recommends that you take frequent log backups. For a production database that contains critical data, log backups would typically be taken every one to fifteen minutes. Note: The recommended method for scheduling backups is a database maintenance plan. <?char 13?> + + Safe Last Backup Date + Last Successful Backup Date_ObjectSet + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116361 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Last Successful Backup Date_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Safe Last Backup Date + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>DateTime</TypeClass><?char 13?> + <Name>LastBackupDate</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>DateTime</TypeClass><?char 13?> + <FunctionType>DateAdd</FunctionType><?char 13?> + <ReturnType>DateTime</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>day</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>-1</Value><?char 13?> + </Constant><?char 13?> + <Function><?char 13?> + <TypeClass>DateTime</TypeClass><?char 13?> + <FunctionType>GetDate</FunctionType><?char 13?> + <ReturnType>DateTime</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Function><?char 13?> + </Operator> + + Safe Last Backup Date + Confirms that the database was backed up within the last day. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Last Successful Backup Date__ObjectSet/TargetSet/Server_/Database + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Public Not Granted Server Permissions.xml b/samples/features/epm-framework/sample-policies/Public Not Granted Server Permissions.xml new file mode 100644 index 0000000000..20de56221e --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Public Not Granted Server Permissions.xml @@ -0,0 +1,217 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Public Not Granted Server Permissions + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Public Server Role Has No Granted Permissions + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Public Not Granted Server Permissions + Checks that the server permission is not granted to the Public role. + Public Server Role Has No Granted Permissions + Public Not Granted Server Permissions_ObjectSet + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116364 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Public Not Granted Server Permissions_ObjectSet + IServerSecurityFacet + + + + + + + /PolicyStore/Condition/Public Server Role Has No Granted Permissions + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>PublicServerRoleIsGrantedPermissions</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Public Server Role Has No Granted Permissions + Confirms that the Server permission is not granted to the Public role. + IServerSecurityFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Public Not Granted Server Permissions__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/README.md b/samples/features/epm-framework/sample-policies/README.md new file mode 100644 index 0000000000..56ceb8c9c7 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/README.md @@ -0,0 +1,3 @@ +# Policy-Based Management Sample Policies + +A set of sample policies is provided, which can be imported for use as rules to be evaluated against the database engine. For more about the best practice rules behind these samples and how to import a policy-based management policy, please see [Policy-Based Management on Microsoft Docs](https://docs.microsoft.com/sql/relational-databases/policy-based-management/monitor-and-enforce-best-practices-by-using-policy-based-management). diff --git a/samples/features/epm-framework/sample-policies/Read-only Database Recovery Model.xml b/samples/features/epm-framework/sample-policies/Read-only Database Recovery Model.xml new file mode 100644 index 0000000000..16162ee127 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Read-only Database Recovery Model.xml @@ -0,0 +1,436 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Read-only Database Recovery Model + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Recovery Model Simple + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + Read-only Database Recovery Model + Checks whether the recovery model is set to simple for read only databases. + Recovery Model Simple + Read-only Database Recovery Model_ObjectSet + Enterprise or Standard Edition + Microsoft Best Practices: Maintenance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116383 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Read-only Database Recovery Model_ObjectSet + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Recovery Model Simple + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>RecoveryModel</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.RecoveryModel</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Simple</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + Recovery Model Simple + Confirms that the database recovery model is set to simple. + IDatabaseMaintenanceFacet + + + + + + + /PolicyStore/Condition/Enterprise or Standard Edition + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Standard</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + Enterprise or Standard Edition + Confirms that the instance of SQL Server is either Enterprise or Standard Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Maintenance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Maintenance + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/Condition/Read-only + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>ReadOnly</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Status</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.DatabaseStatus</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Normal</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + Read-only + Confirms that the database ReadOnly property is equal to true. + Database + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Read-only Database Recovery Model__ObjectSet/TargetSet/Server_/Database + + + + + /PolicyStore/Condition/Read-only + + + Server/Database + Database + Read-only + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server 32-bit Affinity Mask Overlap.xml b/samples/features/epm-framework/sample-policies/SQL Server 32-bit Affinity Mask Overlap.xml new file mode 100644 index 0000000000..8093c4f563 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server 32-bit Affinity Mask Overlap.xml @@ -0,0 +1,268 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server 32-bit Affinity Mask Overlap + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/32-bit Affinity Mask Overlapped + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet + + + + + /PolicyStore/Condition/32-bit Configuration + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server 32-bit Affinity Mask Overlap + Checks an instance of SQL Server having processors that are assigned with both the affinity mask and the affinity I/O mask options. On a computer that has more than one processor, the affinity mask and the affinity I/O mask options are used to designate which CPUs are used by SQL Server. Enabling a CPU with both the affinity mask and the affinity I/O mask can slow performance by forcing the processor to be overused. + 32-bit Affinity Mask Overlapped + SQL Server 32-bit Affinity Mask Overlap_ObjectSet + 32-bit Configuration + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116381 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server 32-bit Affinity Mask Overlap_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/32-bit Affinity Mask Overlapped + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>BitwiseAnd</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityMask</Name><?char 13?> + </Attribute><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityIOMask</Name><?char 13?> + </Attribute><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + 32-bit Affinity Mask Overlapped + Confirms that the same CPUs are not enabled with both the affinity mask option and the affinity I/O mask option, which can slow performance. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/32-bit Configuration + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Platform</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>NT INTEL X86</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + 32-bit Configuration + Confirms that the version of SQL Server uses 32-bit configuration. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server 32-bit Affinity Mask Overlap__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server 64-bit Affinity Mask Overlap.xml b/samples/features/epm-framework/sample-policies/SQL Server 64-bit Affinity Mask Overlap.xml new file mode 100644 index 0000000000..a277f6c9f1 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server 64-bit Affinity Mask Overlap.xml @@ -0,0 +1,316 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server 64-bit Affinity Mask Overlap + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/64-bit Affinity Mask Overlapped + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet + + + + + /PolicyStore/Condition/64-bit Configuration + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server 64-bit Affinity Mask Overlap + Checks an instance of SQL Server having processors that are assigned with both the affinity64 mask and the affinity64 I/O mask options. On a computer that has more than one processor, the affinity64 mask and the affinity64 I/O mask options are used to designate which CPUs are used by SQL Server. Enabling a CPU with both the affinity64 mask and the affinity64 I/O mask can slow performance by forcing the processor to be overused. + 64-bit Affinity Mask Overlapped + SQL Server 64-bit Affinity Mask Overlap_ObjectSet + 64-bit Configuration + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116381 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server 64-bit Affinity Mask Overlap_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/64-bit Affinity Mask Overlapped + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>BitwiseAnd</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityMask</Name><?char 13?> + </Attribute><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityIOMask</Name><?char 13?> + </Attribute><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>BitwiseAnd</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Affinity64Mask</Name><?char 13?> + </Attribute><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>Affinity64IOMask</Name><?char 13?> + </Attribute><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator> + + 64-bit Affinity Mask Overlapped + Confirms that the same CPUs are not enabled with both the affinity mask option and the affinity I/O mask option, which can slow performance. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/64-bit Configuration + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Platform</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>NT AMD64</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Platform</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>NT INTEL IA64</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator> + + 64-bit Configuration + Confirms that the version of SQL Server uses 64-bit configuration. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server 64-bit Affinity Mask Overlap__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Affinity Mask.xml b/samples/features/epm-framework/sample-policies/SQL Server Affinity Mask.xml new file mode 100644 index 0000000000..7cacba4ee3 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Affinity Mask.xml @@ -0,0 +1,220 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Affinity Mask + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Affinity Mask Default + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Affinity Mask + + Checks an instance of SQL Server for setting, affinity mask to its default value 0, since in most cases, the Microsoft Windows 2000 or Windows Server 2003 default affinity provides the best performance. <?char 13?> + <?char 13?> + Confirms whether the setting affinity mask of server is set to zero.<?char 13?> + + Affinity Mask Default + SQL Server Affinity Mask_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116357 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Affinity Mask_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Affinity Mask Default + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityMask</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Affinity Mask Default + Confirms whether the setting affinity mask of server is set to zero. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Affinity Mask__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Blocked Process Threshold.xml b/samples/features/epm-framework/sample-policies/SQL Server Blocked Process Threshold.xml new file mode 100644 index 0000000000..406b01f64b --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Blocked Process Threshold.xml @@ -0,0 +1,277 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Blocked Process Threshold + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Blocked Process Threshold Optimized + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Blocked Process Threshold + Checks whether the blocked process threshold option is set lower than 5 and is not disabled (0). Setting the blocked process threshold option to a value from 1 to 4 can cause the deadlock monitor to run constantly. Values 1 to 4 should only be used for troubleshooting and never long term or in a production environment without the assistance of Microsoft Customer Service and Support. + Blocked Process Threshold Optimized + SQL Server Blocked Process Threshold_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116356 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Blocked Process Threshold_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Blocked Process Threshold Optimized + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>OR</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>BlockedProcessThreshold</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>5</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>BlockedProcessThreshold</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + </Operator> + + Blocked Process Threshold Optimized + Confirms that the blocked process threshold property is set higher than 4, or is disabled (0). + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Blocked Process Threshold__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Default Trace.xml b/samples/features/epm-framework/sample-policies/SQL Server Default Trace.xml new file mode 100644 index 0000000000..574f8b832c --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Default Trace.xml @@ -0,0 +1,259 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Default Trace + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Default Trace Enabled + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Audit + + + SQL Server Default Trace + Checks whether default trace is turned on to collect information about configuration and DDL changes to the instance of SQL Server. This information can be helpful for customers and Microsoft Technical Support when troubleshooting issues with the Database Engine. + Default Trace Enabled + SQL Server Default Trace_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Audit + false + None + + http://go.microsoft.com/fwlink/?LinkId=116384 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Default Trace_ObjectSet + IServerAuditFacet + + + + + + + /PolicyStore/Condition/Default Trace Enabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>DefaultTraceEnabled</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Default Trace Enabled + Confirms that the default trace enabled options is turned on. + IServerAuditFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Audit + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Audit + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Default Trace__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Dynamic Locks.xml b/samples/features/epm-framework/sample-policies/SQL Server Dynamic Locks.xml new file mode 100644 index 0000000000..1f352b3a56 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Dynamic Locks.xml @@ -0,0 +1,258 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Dynamic Locks + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto-configured Dynamic Locks + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Dynamic Locks + Checks whether the value of the locks option is the default setting of 0. This enables the Database Engine to allocate and deallocate lock structures dynamically, based on changing system requirements. If locks is nonzero, batch jobs will stop, and an out of locks error message will be generated when the value specified is exceeded. + Auto-configured Dynamic Locks + SQL Server Dynamic Locks_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116358 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Dynamic Locks_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Auto-configured Dynamic Locks + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>DynamicLocks</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Auto-configured Dynamic Locks + Confirms that the locks option is set to zero. This is the recommended default value. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Dynamic Locks__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server I_O Affinity Mask For Non-enterprise SQL Servers.xml b/samples/features/epm-framework/sample-policies/SQL Server I_O Affinity Mask For Non-enterprise SQL Servers.xml new file mode 100644 index 0000000000..22b0c19334 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server I_O Affinity Mask For Non-enterprise SQL Servers.xml @@ -0,0 +1,269 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/I_/O Affinity Mask Disabled + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet + + + + + /PolicyStore/Condition/Not Enterprise Edition + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server I/O Affinity Mask For Non-enterprise SQL Servers + Checks that the I/O Affinity Mask is disabled for non-enterprise editions. + I/O Affinity Mask Disabled + SQL Server I/O Affinity Mask For Non-enterprise SQL Servers_ObjectSet + Not Enterprise Edition + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116381 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server I/O Affinity Mask For Non-enterprise SQL Servers_ObjectSet + IServerConfigurationFacet + + + + + + + /PolicyStore/Condition/I_/O Affinity Mask Disabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>AffinityIOMask</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + I/O Affinity Mask Disabled + Confirms that the server I/O affinity mask property is disabled. + IServerConfigurationFacet + + + + + + + /PolicyStore/Condition/Not Enterprise Edition + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EngineEdition</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.Edition</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>EnterpriseOrDeveloper</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + Not Enterprise Edition + Confirms that the instance of SQL Server is not Enterprise Edition. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server I_/O Affinity Mask For Non-enterprise SQL Servers__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Lightweight Pooling.xml b/samples/features/epm-framework/sample-policies/SQL Server Lightweight Pooling.xml new file mode 100644 index 0000000000..02cc47180d --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Lightweight Pooling.xml @@ -0,0 +1,217 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Lightweight Pooling + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Lightweight Pooling Disabled + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Lightweight Pooling + Checks whether lightweight pooling is disabled on the server. Setting lightweightpooling to 1 causes SQL Server to switch to fiber mode scheduling. Fiber mode is intended for certain situations when the context switching of the UMS workers are the critical bottleneck in performance. Because this situation is unusual, fiber mode rarely enhances performance or scalability on the typical system. + Lightweight Pooling Disabled + SQL Server Lightweight Pooling_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116350 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Lightweight Pooling_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Lightweight Pooling Disabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>LightweightPoolingEnabled</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Lightweight Pooling Disabled + Confirms that lightweight pooling is disabled on the server. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Lightweight Pooling__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Login Mode.xml b/samples/features/epm-framework/sample-policies/SQL Server Login Mode.xml new file mode 100644 index 0000000000..a16c61c840 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Login Mode.xml @@ -0,0 +1,216 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Login Mode + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Windows Authentication Mode + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + SQL Server Login Mode + Checks for Windows Authentication. When possible, Microsoft recommends using Windows Authentication. Windows Authentication uses Kerberos security protocol, provides password policy enforcement in terms of complexity validation for strong passwords (applies only to Windows Server 2003 and later), provides support for account lockout, and supports password expiration. + Windows Authentication Mode + SQL Server Login Mode_ObjectSet + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116369 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Login Mode_ObjectSet + IServerSecurityFacet + + + + + + + /PolicyStore/Condition/Windows Authentication Mode + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>LoginMode</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>Microsoft.SqlServer.Management.Smo.ServerLoginMode</ObjType><?char 13?> + <Value>Integrated</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Windows Authentication Mode + Confirms that the server LoginMode is Windows integrated authentication. + IServerSecurityFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Login Mode__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Max Degree of Parallelism.xml b/samples/features/epm-framework/sample-policies/SQL Server Max Degree of Parallelism.xml new file mode 100644 index 0000000000..f4a5830849 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Max Degree of Parallelism.xml @@ -0,0 +1,216 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Max Degree of Parallelism + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Maximum Degree of Parallelism Optimized + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Max Degree of Parallelism + Checks the max degree of parallelism option for the optimal value to avoid unwanted resource consumption and performance degradation. The recommended value of this option is 8 or less. Setting this option to a larger value often results in unwanted resource consumption and performance degradation. + Maximum Degree of Parallelism Optimized + SQL Server Max Degree of Parallelism_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116335 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Max Degree of Parallelism_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Maximum Degree of Parallelism Optimized + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>MaxDegreeOfParallelism</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>8</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Maximum Degree of Parallelism Optimized + Confirms that the maximum degree of parallelism is less than 8. Eight is optimal. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Degree of Parallelism__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Max Worker Threads for SQL Server 2005 and above.xml b/samples/features/epm-framework/sample-policies/SQL Server Max Worker Threads for SQL Server 2005 and above.xml new file mode 100644 index 0000000000..5f699534fc --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Max Worker Threads for SQL Server 2005 and above.xml @@ -0,0 +1,258 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Max Worker Threads for SQL Server 2005 and above + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Auto-configured Maximum Worker Threads + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Max Worker Threads for SQL Server 2005 and above + Checks the max work threads server option for potentially incorrect settings of an instance of SQL Server 2005. Setting the max worker threads option to a nonzero value will prevent SQL Server from automatically determining the proper number of active worker threads based on user requests. + Auto-configured Maximum Worker Threads + SQL Server Max Worker Threads for SQL Server 2005 and above_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116324 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Max Worker Threads for SQL Server 2005 and above_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Auto-configured Maximum Worker Threads + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>MaxWorkerThreads</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Auto-configured Maximum Worker Threads + Confirms that the maximum worker threads server option value is set to the recommended value for instances of SQL Server 2005 and later versions. + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Max Worker Threads for SQL Server 2005 and above__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Network Packet Size.xml b/samples/features/epm-framework/sample-policies/SQL Server Network Packet Size.xml new file mode 100644 index 0000000000..7207aa2df2 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Network Packet Size.xml @@ -0,0 +1,216 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Network Packet Size + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Network Packet Size Optimized + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + SQL Server Network Packet Size + Checks whether for the value specified for network packet size server option is set to the optimal value of 8060 bytes. If the network packet size of any logged-in user is more than 8060 bytes, SQL Server performs different memory allocation operations. This can cause an increase in the process virtual address space that is not reserved for the buffer pool. + Network Packet Size Optimized + SQL Server Network Packet Size_ObjectSet + Microsoft Best Practices: Performance + false + None + + http://go.microsoft.com/fwlink/?LinkId=116360 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + SQL Server Network Packet Size_ObjectSet + IServerPerformanceFacet + + + + + + + /PolicyStore/Condition/Network Packet Size Optimized + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>NetworkPacketSize</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>8060</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Network Packet Size Optimized + Confirms that the value specified for network packet size server option does not exceed 8060 bytes. + IServerPerformanceFacet + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Performance + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Performance + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/SQL Server Network Packet Size__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Password Expiration.xml b/samples/features/epm-framework/sample-policies/SQL Server Password Expiration.xml new file mode 100644 index 0000000000..805091d911 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Password Expiration.xml @@ -0,0 +1,345 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Password Expiration + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Password Expiration Enabled + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + SQL Server Password Expiration + Checks whether enforce password expiration on SQL Server logins is enabled. Enforce password expiration should be enabled for all SQL Server logins. + Password Expiration Enabled + SQL Server Password Expiration_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116332 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login + + + + + + /PolicyStore + + + SQL Server Password Expiration_ObjectSet + ILoginOptions + + + + + + + /PolicyStore/Condition/Password Expiration Enabled + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>PasswordExpirationEnabled</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Password Expiration Enabled + Confirms that password expiration is enforced for all SQL Server logins. + ILoginOptions + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet + + + Server/Login + true + + + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>LoginType</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.LoginType</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>SqlLogin</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + SQL Server Authenticated Logins + + Login + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Expiration__ObjectSet/TargetSet/Server_/Login + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + Server/Login + Login + SQL Server Authenticated Logins + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/SQL Server Password Policy.xml b/samples/features/epm-framework/sample-policies/SQL Server Password Policy.xml new file mode 100644 index 0000000000..2972e2cfce --- /dev/null +++ b/samples/features/epm-framework/sample-policies/SQL Server Password Policy.xml @@ -0,0 +1,345 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/SQL Server Password Policy + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Password Policy Enforced + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + SQL Server Password Policy + Checks whether password policy enforcement on SQL Server logins is enabled. Password policy should be enforced for all SQL Server logins. + Password Policy Enforced + SQL Server Password Policy_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116331 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login + + + + + + /PolicyStore + + + SQL Server Password Policy_ObjectSet + ILoginOptions + + + + + + + /PolicyStore/Condition/Password Policy Enforced + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>PasswordPolicyEnforced</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Password Policy Enforced + Confirms that the enforce password option on SQL Server logins is enabled. + ILoginOptions + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login + + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet + + + Server/Login + true + + + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>LoginType</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.LoginType</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>SqlLogin</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator> + + SQL Server Authenticated Logins + + Login + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login/TargetSetLevel/Server_/Login + + + + + + + + /PolicyStore/ObjectSet/SQL Server Password Policy__ObjectSet/TargetSet/Server_/Login + + + + + /PolicyStore/Condition/SQL Server Authenticated Logins + + + Server/Login + Login + SQL Server Authenticated Logins + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Symmetric Key Encryption for User Databases.xml b/samples/features/epm-framework/sample-policies/Symmetric Key Encryption for User Databases.xml new file mode 100644 index 0000000000..1727871673 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Symmetric Key Encryption for User Databases.xml @@ -0,0 +1,397 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Symmetric Key Encryption for User Databases + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Strongly Encrypted + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Symmetric Key Encryption for User Databases + Checks that symmetric keys with a length less than 128 bytes do not use the RC2 or RC4 encryption algorithm. The best practice recommendation is to use AES 128 bit and above to create symmetric keys for data encryption. If AES is not supported by the version of your operating system, use 3DES. + Strongly Encrypted + Symmetric Key Encryption for User Databases_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116328 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + /PolicyStore + + + Symmetric Key Encryption for User Databases_ObjectSet + SymmetricKey + + + + + + + /PolicyStore/Condition/Strongly Encrypted + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.SymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>RC2</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>EncryptionAlgorithm</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>Enum</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Microsoft.SqlServer.Management.Smo.SymmetricKeyEncryptionAlgorithm</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>RC4</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + Strongly Encrypted + Confirms that the symmetric key encryption algorithm is neither RC2 nor RC4. + SymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet + + + Server/Database/SymmetricKey + true + + + + + + + /PolicyStore/Condition/Key Length Less Than 128 Bytes + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>LE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>KeyLength</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>128</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Key Length Less Than 128 Bytes + Confirms that the Symmetric Key KeyLength property is less than 128 bytes. + SymmetricKey + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + /PolicyStore/Condition/Key Length Less Than 128 Bytes + + + Server/Database/SymmetricKey + SymmetricKey + Key Length Less Than 128 Bytes + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key Encryption for User Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + Server/Database + Database + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Symmetric Key for System Databases.xml b/samples/features/epm-framework/sample-policies/Symmetric Key for System Databases.xml new file mode 100644 index 0000000000..c84c6577fa --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Symmetric Key for System Databases.xml @@ -0,0 +1,379 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Symmetric Key for System Databases + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Fail For Any Symmetric Key + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Symmetric Key for System Databases + Checks for user-created symmetric keys in the msdb, model, and tempdb databases. This is not recommended. This recommendation does not apply to the master database. + Fail For Any Symmetric Key + Symmetric Key for System Databases_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116329 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + /PolicyStore + + + Symmetric Key for System Databases_ObjectSet + SymmetricKey + + + + + + + /PolicyStore/Condition/Fail For Any Symmetric Key + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Fail For Any Symmetric Key + Confirms that symmetric keys in the database fail this condition. + SymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet + + + Server/Database/SymmetricKey + true + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + Server/Database/SymmetricKey + SymmetricKey + + + + + + + + /PolicyStore/Condition/System Databases Not Including Master + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>AND</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>NE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>master</Value><?char 13?> + </Constant><?char 13?> + </Operator><?char 13?> + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsSystemObject</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator><?char 13?> + </Operator> + + System Databases Not Including Master + Confirms that the database is a system database and its name is not master. + Database + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for System Databases__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + /PolicyStore/Condition/System Databases Not Including Master + + + Server/Database + Database + System Databases Not Including Master + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Symmetric Key for master Database.xml b/samples/features/epm-framework/sample-policies/Symmetric Key for master Database.xml new file mode 100644 index 0000000000..311c2765af --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Symmetric Key for master Database.xml @@ -0,0 +1,362 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Symmetric Key for master Database + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Microsoft Service Master Key + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Symmetric Key for master Database + Checks for user-created symmetric keys in the master database, which is not recommended. The master database contains the Master Symmetric key. + Microsoft Service Master Key + Symmetric Key for master Database_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116329 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + /PolicyStore + + + Symmetric Key for master Database_ObjectSet + SymmetricKey + + + + + + + /PolicyStore/Condition/Microsoft Service Master Key + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Unsupported</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>##MS_ServiceMasterKey##</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Microsoft Service Master Key + + Confirms that the symmetric key is the Service Master Key.<?char 13?> + <?char 13?> + The Service Master Key is the root of the SQL Server encryption hierarchy. It is generated automatically the first time it is needed to encrypt another key. By default, the Service Master Key is encrypted using the Windows data protection API and using the local machine key. The Service Master Key can only be opened by the Windows service account under which it was created or by a principal with access to both the service account name and its password.<?char 13?> + <?char 13?> + Regenerating or restoring the Service Master Key involves decrypting and re-encrypting the complete encryption hierarchy. Unless the key has been compromised, this resource-intensive operation should be scheduled during a period of low demand.<?char 13?> + + SymmetricKey + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet + + + Server/Database/SymmetricKey + true + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database_/SymmetricKey + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + Server/Database/SymmetricKey + SymmetricKey + + + + + + + + /PolicyStore/Condition/Is master + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <Name>Name</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>master</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Is master + Confirms that the database name is master. + Database + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Symmetric Key for master Database__ObjectSet/TargetSet/Server_/Database_/SymmetricKey + + + + + /PolicyStore/Condition/Is master + + + Server/Database + Database + Is master + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Trustworthy Database.xml b/samples/features/epm-framework/sample-policies/Trustworthy Database.xml new file mode 100644 index 0000000000..cd9b82fe66 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Trustworthy Database.xml @@ -0,0 +1,335 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Trustworthy Database + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Database Owner Not sysadmin + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + Trustworthy Database + Checks whether the dbo or a db_owner is assigned to a fixed server sysadmin role for databases where the trustworthy bit is set to on. Database users with the appropriate level of permissions can elevate privileges to the sysadmin role. In this role, the user can create and execute unsafe assemblies that compromise the system. The best practice is to turn off the trustworthy bit or change the dbo and db_owner to a fixed server role other than sysadmin. + Database Owner Not sysadmin + Trustworthy Database_ObjectSet + SQL Server 2005 or a Later Version + Microsoft Best Practices: Security + false + None + + http://go.microsoft.com/fwlink/?LinkId=116327 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database + + + + + + /PolicyStore + + + Trustworthy Database_ObjectSet + IDatabaseSecurityFacet + + + + + + + /PolicyStore/Condition/Database Owner Not sysadmin + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>IsOwnerSysadmin</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>False</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Database Owner Not sysadmin + Confirms that no login in the db_owner role has sysadmin privileges. + IDatabaseSecurityFacet + + + + + + + /PolicyStore/Condition/SQL Server 2005 or a Later Version + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>GE</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <Name>VersionMajor</Name><?char 13?> + </Attribute><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>9</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + SQL Server 2005 or a Later Version + Confirms that the version of SQL Server is 2005 or a later version. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Security + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Security + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database + + + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet + + + Server/Database + true + + + + + + + /PolicyStore/Condition/Trustworthy + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Attribute><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <Name>Trustworthy</Name><?char 13?> + </Attribute><?char 13?> + <Function><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <FunctionType>True</FunctionType><?char 13?> + <ReturnType>Bool</ReturnType><?char 13?> + <Count>0</Count><?char 13?> + </Function><?char 13?> + </Operator> + + Trustworthy + Confirms that the database Trustworthy property is equal to true. + IDatabaseOptions + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database/TargetSetLevel/Server_/Database + + + + + + + + /PolicyStore/ObjectSet/Trustworthy Database__ObjectSet/TargetSet/Server_/Database + + + + + /PolicyStore/Condition/Trustworthy + + + Server/Database + Database + Trustworthy + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Cluster Disk Resource Corruption Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Cluster Disk Resource Corruption Error.xml new file mode 100644 index 0000000000..c90d1f13d7 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Cluster Disk Resource Corruption Error.xml @@ -0,0 +1,247 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Cluster Disk Resource Corruption Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Cluster Disk Resource Corruption Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Cluster Disk Resource Corruption Error + + Detects SCSI host adapter configuration issues or a malfunctioning device error message in the System Log.<?char 13?> + http://support.microsoft.com/kb/311081<?char 13?> + + Cluster Disk Resource Corruption Error Check + Windows Event Log Cluster Disk Resource Corruption Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116377 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Cluster Disk Resource Corruption Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Cluster Disk Resource Corruption Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=1066 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Cluster Disk Resource Corruption Error Check + Confirms that an ESCSI host adapter configuration issue or a malfunctioning device error (Event ID –1066) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Cluster Disk Resource Corruption Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Device Driver Control Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Device Driver Control Error.xml new file mode 100644 index 0000000000..902bd3a1c4 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Device Driver Control Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Device Driver Control Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Device Driver Control Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Device Driver Control Error + + Detects Error EventID –11 in the System Log. This error could be because of a corrupted device driver, a hardware problem, a malfunctioning device, poor cabling, or termination issues. <?char 13?> + http://support.microsoft.com/kb/259237 <?char 13?> + http://support.microsoft.com/kb/154690 + + Device Driver Control Error Check + Windows Event Log Device Driver Control Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116371 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Device Driver Control Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Device Driver Control Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=11 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Device Driver Control Error Check + Confirms that an I/O time-out event error (Event ID -11) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Driver Control Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Device Not Ready Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Device Not Ready Error.xml new file mode 100644 index 0000000000..f87d94e5bb --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Device Not Ready Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Device Not Ready Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Device Not Ready Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Device Not Ready Error + + This policy detects for error messages in Detects error messages in the System Log that can be the result of SCSI host adapter configuration issues or related problems.<?char 13?> + http://support.microsoft.com/kb/259237<?char 13?> + http://support.microsoft.com/kb/154690<?char 13?> + + Device Not Ready Error Check + Windows Event Log Device Not Ready Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116349 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Device Not Ready Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Device Not Ready Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=15 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Device Not Ready Error Check + Confirms that a Device Not Ready Error (Event ID –15) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Device Not Ready Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Failed I_O Request Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Failed I_O Request Error.xml new file mode 100644 index 0000000000..0f111e17e2 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Failed I_O Request Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Failed I_/O Request Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Failed I_/O Request Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Failed I/O Request Error + + This policy detects a failed I/O request error message in the system log. This could be the result of a variety of things, including a firmware bug or faulty SCSI cables.<?char 13?> + http://support.microsoft.com/kb/311081<?char 13?> + http://support.microsoft.com/kb/885688<?char 13?> + + Failed I/O Request Check + Windows Event Log Failed I/O Request Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116385 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Failed I/O Request Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Failed I_/O Request Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=50 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Failed I/O Request Check + Confirms that a failed I/O request (Event ID 50) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Failed I_/O Request Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log I_O Delay Warning.xml b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Delay Warning.xml new file mode 100644 index 0000000000..542ed21556 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Delay Warning.xml @@ -0,0 +1,244 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log I_/O Delay Warning + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/I_/O Delay Warning Check + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log I/O Delay Warning + Detects Event ID 833 in the system log. This message indicates that SQL Server has issued a read or write request from disk, and that the request has taken longer than 15 seconds to return. This error is reported by SQL Server and indicates a problem with the disk I/O subsystem. Delays this long can severely limit the performance of your instance of SQL Server. + I/O Delay Warning Check + Windows Event Log I/O Delay Warning_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116375 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log I/O Delay Warning_ObjectSet + Server + + + + + + + /PolicyStore/Condition/I_/O Delay Warning Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=833 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + I/O Delay Warning Check + Confirms that an I/O delay warning (Event ID 833) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Delay Warning__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log I_O Error During Hard Page Fault Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Error During Hard Page Fault Error.xml new file mode 100644 index 0000000000..91c80ed1de --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log I_O Error During Hard Page Fault Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log I_/O Error During Hard Page Fault Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/I_/O Error During Hard Page Fault Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log I/O Error During Hard Page Fault Error + + DetectsI/O Error during hard page fault in System Log.<?char 13?> + http://support.microsoft.com/kb/304415 <?char 13?> + http://support.microsoft.com/kb/305547<?char 13?> + + I/O Error During Hard Page Fault Error Check + Windows Event Log I/O Error During Hard Page Fault Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116355 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log I/O Error During Hard Page Fault Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/I_/O Error During Hard Page Fault Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=51 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + I/O Error During Hard Page Fault Error Check + Confirms that an I/O Error during hard page fault (Event ID – 51) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log I_/O Error During Hard Page Fault Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Read Retry Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Read Retry Error.xml new file mode 100644 index 0000000000..6ecf92590a --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Read Retry Error.xml @@ -0,0 +1,244 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Read Retry Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Read Retry Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Read Retry Error + Detects Error Event ID 825 in the system log. This error message indicates that SQL Server could not read data from the disk on the first try. This message indicates a major problem with the disk I/O subsystem, not with SQL Server itself. However, the disk problem can cause data loss or database corruption if it is not resolved. + Read Retry Error Check + Windows Event Log Read Retry Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116339 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Read Retry Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Read Retry Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=825 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Read Retry Error Check + Confirms that read retry issues (Event ID 825) do not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Read Retry Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log Storage System I_O Timeout Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log Storage System I_O Timeout Error.xml new file mode 100644 index 0000000000..77b46f32b0 --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log Storage System I_O Timeout Error.xml @@ -0,0 +1,248 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log Storage System I_/O Timeout Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/Storage System I_/O Timeout Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log Storage System I/O Timeout Error + + Detects Error EventID –9 in the System Log. This error indicates that I/O time-out has occurred within the storage system, as detected from the driver for the controller. <?char 13?> + http://support.microsoft.com/kb/259237 <?char 13?> + http://support.microsoft.com/kb/154690 + + Storage System I/O Timeout Error Check + Windows Event Log Storage System I/O Timeout Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116330 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log Storage System I/O Timeout Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/Storage System I_/O Timeout Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=9 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + Storage System I/O Timeout Error Check + Confirms that an I/O time-out event error (Event ID -9) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log Storage System I_/O Timeout Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/epm-framework/sample-policies/Windows Event Log System Failure Error.xml b/samples/features/epm-framework/sample-policies/Windows Event Log System Failure Error.xml new file mode 100644 index 0000000000..81b7162dce --- /dev/null +++ b/samples/features/epm-framework/sample-policies/Windows Event Log System Failure Error.xml @@ -0,0 +1,244 @@ + + + + + <_locDefinition xmlns="urn:locstudio"> + <_locDefault _loc="locNone" /> + <_locTag _loc="locData">DMF:Name + <_locTag _loc="locData">DMF:Description + <_locTag _loc="locData">DMF:Condition + <_locTag _loc="locData">DMF:ObjectSet + <_locTag _loc="locData">DMF:RootCondition + <_locTag _loc="locData">DMF:PolicyCategory + <_locTag _loc="locData">DMF:HelpText + + + urn:uuid:96fe1236-abf6-4a57-b54d-e9baab394fd1 + http://documentcollection/ + + + + + + + /system/schema/DMF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /PolicyStore/Policy/Windows Event Log System Failure Error + + + + + + + + /PolicyStore + + + + + /PolicyStore/Condition/System Failure Error Check + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + Windows Event Log System Failure Error + Detects Error Event ID 6008 in the System Log. This error indicates an unexpected system shutdown. The system might be unstable and might not provide the stability and integrity that is required to host an instance of SQL Server. If it is known, you should address the root cause of the unexpected server restarts. Otherwise, move the instance of SQL Server to another computer. + System Failure Error Check + Windows Event Log System Failure Error_ObjectSet + Microsoft Best Practices: Windows Log File + false + None + + http://go.microsoft.com/fwlink/?LinkId=116326 + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet + + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet/TargetSet/Server + + + + + + /PolicyStore + + + Windows Event Log System Failure Error_ObjectSet + Server + + + + + + + /PolicyStore/Condition/System Failure Error Check + + + + + + + + /PolicyStore + + + + <Operator><?char 13?> + <TypeClass>Bool</TypeClass><?char 13?> + <OpType>EQ</OpType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>IsNull</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>2</Count><?char 13?> + <Function><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <FunctionType>ExecuteWql</FunctionType><?char 13?> + <ReturnType>Numeric</ReturnType><?char 13?> + <Count>3</Count><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>Numeric</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>root\CIMV2</Value><?char 13?> + </Constant><?char 13?> + <Constant><?char 13?> + <TypeClass>String</TypeClass><?char 13?> + <ObjType>System.String</ObjType><?char 13?> + <Value>select EventCode from Win32_NTLogEvent where EventCode=6008 and Logfile="System"</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Function><?char 13?> + <Constant><?char 13?> + <TypeClass>Numeric</TypeClass><?char 13?> + <ObjType>System.Int32</ObjType><?char 13?> + <Value>0</Value><?char 13?> + </Constant><?char 13?> + </Operator> + + System Failure Error Check + Confirms that an unexpected system shutdown error message (Event ID – 6008) does not exist in the system log. + Server + + + + + + + /PolicyStore/PolicyCategory/Microsoft Best Practices_b Windows Log File + + + + + + + + /PolicyStore + + + Microsoft Best Practices: Windows Log File + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet/TargetSet/Server + + + + + + + + /PolicyStore/ObjectSet/Windows Event Log System Failure Error__ObjectSet + + + Server + true + + + + + + + + + + + \ No newline at end of file diff --git a/samples/features/in-memory-database/memory-optimized-tempdb-metadata/MemoryOptimizedTempDBMetadata-TSQL.ipynb b/samples/features/in-memory-database/memory-optimized-tempdb-metadata/MemoryOptimizedTempDBMetadata-TSQL.ipynb index 5ba7d05cfa..4ededbf092 100644 --- a/samples/features/in-memory-database/memory-optimized-tempdb-metadata/MemoryOptimizedTempDBMetadata-TSQL.ipynb +++ b/samples/features/in-memory-database/memory-optimized-tempdb-metadata/MemoryOptimizedTempDBMetadata-TSQL.ipynb @@ -16,7 +16,7 @@ { "cell_type": "markdown", "source": [ - "# Exploring Memory-Optmized TempDB Metadata\r\n", + "# Exploring Memory-Optimized TempDB Metadata\r\n", "\r\n", "TempDB metadata contention has historically been a bottleneck to scalability for many workloads running on SQL Server. SQL Server 2019 introduces a new feature that is part of the [In-Memory Database](https://docs.microsoft.com/sql/relational-databases/in-memory-database) feature family, memory-optimized tempdb metadata, which effectively removes this bottleneck and unlocks a new level of scalability for tempdb-heavy workloads. In SQL Server 2019, the system tables involved in managing temp table metadata can be moved into latch-free non-durable memory-optimized tables.\r\n", "\r\n", @@ -487,4 +487,4 @@ "execution_count": 16 } ] -} \ No newline at end of file +} diff --git a/samples/features/intelligent-query-processing/IQP Demo - APPROX_COUNT_DISTINCT.sql b/samples/features/intelligent-query-processing/IQP Demo - APPROX_COUNT_DISTINCT.sql index ea913b8393..f2af97ffc8 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - APPROX_COUNT_DISTINCT.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - APPROX_COUNT_DISTINCT.sql @@ -16,9 +16,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO diff --git a/samples/features/intelligent-query-processing/IQP Demo - Batch Mode Adaptive Join.sql b/samples/features/intelligent-query-processing/IQP Demo - Batch Mode Adaptive Join.sql index a30ee923f8..7e685f81c0 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - Batch Mode Adaptive Join.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - Batch Mode Adaptive Join.sql @@ -16,9 +16,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 140; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO @@ -53,4 +50,4 @@ FROM [Fact].[Order] AS [fo] INNER JOIN [Dimension].[Stock Item] AS [si] ON [fo].[Stock Item Key] = [si].[Stock Item Key] WHERE [fo].[Quantity] = 361; -GO \ No newline at end of file +GO diff --git a/samples/features/intelligent-query-processing/IQP Demo - Batch Mode MGF.sql b/samples/features/intelligent-query-processing/IQP Demo - Batch Mode MGF.sql index 1cd6cfc679..69b5b7378f 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - Batch Mode MGF.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - Batch Mode MGF.sql @@ -16,9 +16,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 140; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO @@ -43,4 +40,4 @@ GO -- Execute this query a few times - each time looking at -- the plan to see impact on spills, memory grant size, and run time EXEC [FactOrderByLineageKey] 9; -GO \ No newline at end of file +GO diff --git a/samples/features/intelligent-query-processing/IQP Demo - Batch Mode on Rowstore.sql b/samples/features/intelligent-query-processing/IQP Demo - Batch Mode on Rowstore.sql index 1d0eb36ee4..0b4f636fd0 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - Batch Mode on Rowstore.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - Batch Mode on Rowstore.sql @@ -16,9 +16,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO @@ -54,4 +51,4 @@ GROUP BY [Tax Rate], ORDER BY [Tax Rate], [Lineage Key], [Salesperson Key] -OPTION (RECOMPILE); \ No newline at end of file +OPTION (RECOMPILE); diff --git a/samples/features/intelligent-query-processing/IQP Demo - Interleaved Execution.sql b/samples/features/intelligent-query-processing/IQP Demo - Interleaved Execution.sql index 5f58af7f33..3da3fd82c7 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - Interleaved Execution.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - Interleaved Execution.sql @@ -122,9 +122,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 130; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO @@ -153,9 +150,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 140; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO diff --git a/samples/features/intelligent-query-processing/IQP Demo - Row Mode MGF.sql b/samples/features/intelligent-query-processing/IQP Demo - Row Mode MGF.sql index cb0ea3c252..7855dd1243 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - Row Mode MGF.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - Row Mode MGF.sql @@ -16,9 +16,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO diff --git a/samples/features/intelligent-query-processing/IQP Demo - Scalar UDF Inlining.sql b/samples/features/intelligent-query-processing/IQP Demo - Scalar UDF Inlining.sql index 439742349e..e67d6522d3 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - Scalar UDF Inlining.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - Scalar UDF Inlining.sql @@ -15,9 +15,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO diff --git a/samples/features/intelligent-query-processing/IQP Demo - TVDC.sql b/samples/features/intelligent-query-processing/IQP Demo - TVDC.sql index 161f4b2fcd..6a7b422e37 100644 --- a/samples/features/intelligent-query-processing/IQP Demo - TVDC.sql +++ b/samples/features/intelligent-query-processing/IQP Demo - TVDC.sql @@ -16,9 +16,6 @@ GO ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 140; GO -ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; -GO - USE [WideWorldImportersDW]; GO diff --git a/samples/features/sql-big-data-cluster/deployment/README.md b/samples/features/sql-big-data-cluster/deployment/README.md index fe5ec27790..6793158b85 100644 --- a/samples/features/sql-big-data-cluster/deployment/README.md +++ b/samples/features/sql-big-data-cluster/deployment/README.md @@ -13,4 +13,12 @@ Using the sample Python script in **aks** folder, you will deploy a Kubernetes c ## __[Push SQL Server big data cluster images to your own private Docker repository](offline/)__ -Using the sample Python script in **offline** folder, you will push the necessary images required for the deployment to your own repository. \ No newline at end of file +Using the sample Python script in **offline** folder, you will push the necessary images required for the deployment to your own repository. + +## __[Deploy SQL Server big data clusters (BDC) with Azure Kubernetes service (AKS) private cluster](private-aks/)__ + +Using the sample Python script in **private-aks** folder, you will Deploy SQL Server big data cluster in in your private network with Azure Kubernetes service (AKS) private cluster. + +## __[OpenShift manifests and scripts](openshift/)__ + +Use manifests and scripts in **openshift** folder, to support SQL Server Big Data Clusters on OpenShift. \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/cleanup-bdc.sh b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/cleanup-bdc.sh index 9a53ae8c40..24c5cfbcf7 100644 --- a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/cleanup-bdc.sh +++ b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/cleanup-bdc.sh @@ -7,7 +7,6 @@ fi DIR_PREFIX=$1 kubeadm reset --force -unalias azdata systemctl stop kubelet rm -rf /var/lib/cni/ @@ -23,8 +22,12 @@ ip link set flannel.1 down #brctl delbr flannel.1 iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X -rm -rf .azdata/ -rm -rf bdcdeploy/ +# Remove azdata +# +apt-get remove -y azdata-cli +rm /etc/apt/sources.list.d/azdata-cli.list +rm /etc/apt/trusted.gpg.d/dpgswdist.v1.asc.gpg +apt autoremove # Remove mounts. # diff --git a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh index bda58040ca..9d8d4154e9 100644 --- a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh +++ b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm-ad/setup-bdc-ad.sh @@ -47,14 +47,10 @@ export VIRTUALENV_NAME="bdcvenv" export LOG_FILE="bdcdeploy.log" export DEBIAN_FRONTEND=noninteractive -# Requirements file. -# -export REQUIREMENTS_LINK="https://aka.ms/azdata" - # Kube version. # -KUBE_DPKG_VERSION=1.15.0-00 -KUBE_VERSION=1.15.0 +KUBE_DPKG_VERSION=1.16.3-00 +KUBE_VERSION=1.16.3 # Wait for 5 minutes for the cluster to be ready. # @@ -65,7 +61,7 @@ RETRY_INTERVAL=5 # export DOCKER_REGISTRY="mcr.microsoft.com" export DOCKER_REPOSITORY="mssql/bdc" -export DOCKER_TAG="2019-CU3-ubuntu-16.04" +export DOCKER_TAG="2019-CU8-ubuntu-16.04" # Variables used for azdata cluster creation. # @@ -77,7 +73,7 @@ export STORAGE_CLASS=local-storage export PV_COUNT="30" IMAGES=( - mssql-app-service-proxy + mssql-app-service-proxy mssql-control-watchdog mssql-controller mssql-dns @@ -92,14 +88,12 @@ IMAGES=( mssql-monitor-influxdb mssql-monitor-kibana mssql-monitor-telegraf - mssql-security-domainctl mssql-security-knox mssql-security-support - mssql-server mssql-server-controller mssql-server-data mssql-ha-operator - mssql-ha-supervisor + mssql-ha-supervisor mssql-service-proxy mssql-ssis-app-runtime ) @@ -112,7 +106,7 @@ cd $BDCDEPLOY_DIR/ touch $LOG_FILE { -# Install all necessary packages: kuberenetes, docker, python3, python3-pip, request, azdata. +# Install all necessary packages: kubernetes, docker, python3, python3-pip, request, azdata. # echo "" echo "######################################################################################" @@ -126,6 +120,9 @@ apt --yes install \ software-properties-common \ apt-transport-https \ ca-certificates \ + lsb-release \ + gnupg \ + wget \ curl curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - @@ -134,31 +131,34 @@ add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt update -q -apt-get install -q --yes docker-ce=18.06.2~ce~3-0~ubuntu --allow-downgrades -apt-mark hold docker-ce +apt-cache policy docker-ce +apt --yes install docker-ce usermod --append --groups docker $USER -# Install python3, python3-pip, requests. + +# Install azdata cli. # -apt-get install -q -y python3 -apt-get install -q -y python3-pip -apt-get install -y libkrb5-dev -apt-get install -y libsqlite3-dev -apt-get install -y unixodbc-dev +curl -sL https://packages.microsoft.com/keys/microsoft.asc | +gpg --dearmor | +tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null + +code=$(lsb_release -cs) +if [ $code == "focal" ]; then + add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/prod.list)" +elif [ $code == "bionic" ]; then + add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/18.04/prod.list)" +elif [ $code == "xenial" ]; then + add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/16.04/prod.list)" +fi -pip3 install requests --upgrade +apt-get update +apt-get install -y azdata-cli -# Install and create virtualenv. -# -pip3 install --upgrade virtualenv -virtualenv -p python3 $VIRTUALENV_NAME -source $VIRTUALENV_NAME/bin/activate +cd - -# Install azdata cli. -# -pip3 install -r $REQUIREMENTS_LINK -echo "Packages installed." +azdata --version +echo "Azdata has been successfully installed." # Load all pre-requisites for Kubernetes. # @@ -353,10 +353,3 @@ kubectl config set-context --current --namespace $CLUSTER_NAME # azdata login -n $CLUSTER_NAME azdata bdc endpoint list --output table - -if [ -d "$HOME/.azdata/" ]; then - sudo chown -R $(id -u $SUDO_USER):$(id -g $SUDO_USER) $HOME/.azdata/ -fi - -echo "alias azdata='$BDCDEPLOY_DIR/$VIRTUALENV_NAME/bin/azdata'" >> $HOME/.bashrc -}| tee $LOG_FILE diff --git a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/cleanup-bdc.sh b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/cleanup-bdc.sh index 9a53ae8c40..24c5cfbcf7 100644 --- a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/cleanup-bdc.sh +++ b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/cleanup-bdc.sh @@ -7,7 +7,6 @@ fi DIR_PREFIX=$1 kubeadm reset --force -unalias azdata systemctl stop kubelet rm -rf /var/lib/cni/ @@ -23,8 +22,12 @@ ip link set flannel.1 down #brctl delbr flannel.1 iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X -rm -rf .azdata/ -rm -rf bdcdeploy/ +# Remove azdata +# +apt-get remove -y azdata-cli +rm /etc/apt/sources.list.d/azdata-cli.list +rm /etc/apt/trusted.gpg.d/dpgswdist.v1.asc.gpg +apt autoremove # Remove mounts. # diff --git a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh index dc188dd687..133cdd6b3e 100644 --- a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh +++ b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu-single-node-vm/setup-bdc.sh @@ -30,12 +30,12 @@ export DEBIAN_FRONTEND=noninteractive # Requirements file. # -export REQUIREMENTS_LINK="https://aka.ms/azdata" +# export REQUIREMENTS_LINK="https://aka.ms/azdata" # Kube version. # -KUBE_DPKG_VERSION=1.15.0-00 -KUBE_VERSION=1.15.0 +KUBE_DPKG_VERSION=1.16.3-00 +KUBE_VERSION=1.16.3 # Wait for 5 minutes for the cluster to be ready. # @@ -46,7 +46,7 @@ RETRY_INTERVAL=5 # export DOCKER_REGISTRY="mcr.microsoft.com" export DOCKER_REPOSITORY="mssql/bdc" -export DOCKER_TAG="2019-CU3-ubuntu-16.04" +export DOCKER_TAG="2019-CU8-ubuntu-16.04" # Variables used for azdata cluster creation. # @@ -58,7 +58,7 @@ export STORAGE_CLASS=local-storage export PV_COUNT="30" IMAGES=( - mssql-app-service-proxy + mssql-app-service-proxy mssql-control-watchdog mssql-controller mssql-dns @@ -73,14 +73,12 @@ IMAGES=( mssql-monitor-influxdb mssql-monitor-kibana mssql-monitor-telegraf - mssql-security-domainctl mssql-security-knox mssql-security-support - mssql-server mssql-server-controller mssql-server-data mssql-ha-operator - mssql-ha-supervisor + mssql-ha-supervisor mssql-service-proxy mssql-ssis-app-runtime ) @@ -93,7 +91,7 @@ cd $BDCDEPLOY_DIR/ touch $LOG_FILE { -# Install all necessary packages: kuberenetes, docker, python3, python3-pip, request, azdata. +# Install all necessary packages: kubernetes, docker, python3, python3-pip, request, azdata. # echo "" echo "######################################################################################" @@ -107,39 +105,51 @@ apt --yes install \ software-properties-common \ apt-transport-https \ ca-certificates \ + lsb-release \ + gnupg \ + wget \ curl + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt update -q -apt-get install -q --yes docker-ce=18.06.2~ce~3-0~ubuntu --allow-downgrades -apt-mark hold docker-ce +apt-cache policy docker-ce +apt --yes install docker-ce usermod --append --groups docker $USER # Install python3, python3-pip, requests. # -apt-get install -q -y python3 -apt-get install -q -y python3-pip -apt-get install -y libkrb5-dev -apt-get install -y libsqlite3-dev -apt-get install -y unixodbc-dev - -pip3 install requests --upgrade +apt install -y libodbc1 odbcinst odbcinst1debian2 unixodbc apt-transport-https libkrb5-dev -# Install and create virtualenv. +# Download and install azdata package # -pip3 install --upgrade virtualenv -virtualenv -p python3 $VIRTUALENV_NAME -source $VIRTUALENV_NAME/bin/activate +echo "" -# Install azdata cli. -# -pip3 install -r $REQUIREMENTS_LINK -echo "Packages installed." +curl -sL https://packages.microsoft.com/keys/microsoft.asc | +gpg --dearmor | +tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null + +code=$(lsb_release -cs) +if [ $code == "focal" ]; then + add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/20.04/prod.list)" +elif [ $code == "bionic" ]; then + add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/18.04/prod.list)" +elif [ $code == "xenial" ]; then + add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/16.04/prod.list)" +fi + +apt-get update +apt-get install -y azdata-cli + +cd - + +azdata --version +echo "Azdata has been successfully installed." # Load all pre-requisites for Kubernetes. # @@ -333,10 +343,3 @@ kubectl config set-context --current --namespace $CLUSTER_NAME # azdata login -n $CLUSTER_NAME azdata bdc endpoint list --output table - -if [ -d "$HOME/.azdata/" ]; then - sudo chown -R $(id -u $SUDO_USER):$(id -g $SUDO_USER) $HOME/.azdata/ -fi - -echo "alias azdata='$BDCDEPLOY_DIR/$VIRTUALENV_NAME/bin/azdata'" >> $HOME/.bashrc -}| tee $LOG_FILE diff --git a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu/README.md b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu/README.md index 067ac95417..3063bb97a7 100644 --- a/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu/README.md +++ b/samples/features/sql-big-data-cluster/deployment/kubeadm/ubuntu/README.md @@ -31,3 +31,40 @@ In this example, we will deploy Kubernetes over multiple Linux machines (physica Simply type in "local-storage" twice (once for data, once for logs) when facing the following prompt by azdata : `Kubernetes Storage Class - Config Path: spec.storage.data.className - Description: This indicates the name of the Kubernetes Storage Class to use. You must pre-provision the storage class and the persistent volumes or you can use a built in storage class if the platform you are deploying provides this capability. - Please provide a value:` + +### local-storage clean up + +If you removed BDC cluster that was previously deployed on Kubernetes cluster that was built using the sample scripts in this guide, you may want to clean the local-storage before using the cluster to deploy new BDC + +to clean the storage you need to follow these steps + +1) on each worker node make sure ‘/mnt/local-storage’ has only folder structure with no files, you can run ‘tree /mnt/local-storage’ for quick check +2) if you see any files you need to remove them +3) remount the volumes + +You can use the following script to clean the volumes. + +**WARNNING**: running this script will **REMOVE** all files that may exists under /mnt/local-storage folders + +run the following command to create the script + +```sh +cat > clean-volumes-agents.sh <", - "text/html": "\n
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
12application_1581458669418_0041pysparkidleLinkLink
" - }, - "metadata": {} - }, - { - "output_type": "display_data", - "data": { - "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", - "application/vnd.jupyter.widget-view+json": { - "version_major": 2, - "version_minor": 0, - "model_id": "ae4ec82192fb473e8b77e4065f4c1927" - } - }, - "metadata": {} - }, - { - "output_type": "stream", - "name": "stdout", - "text": "SparkSession available as 'spark'.\n" - }, - { - "output_type": "display_data", "data": { "text/plain": "", - "text/html": "Current session configs: {'conf': {'spark.files': '/user/user1/user1.keytab', 'spark.executor.memory': '4g', 'spark.driver.memory': '4g', 'spark.executor.cores': 2, 'spark.driver.cores': 1, 'spark.executor.instances': 4}, 'kind': 'pyspark'}
" + "text/html": "Current session configs: {'conf': {'spark.files': '/user/testusera1/testusera1.keytab', 'spark.executor.memory': '4g', 'spark.driver.memory': '4g', 'spark.executor.cores': 2, 'spark.driver.cores': 1, 'spark.executor.instances': 4}, 'kind': 'pyspark'}
" }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "display_data", "data": { "text/plain": "", - "text/html": "\n
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
6application_1581458669418_0035pysparkidleLinkLink
" + "text/html": "No active sessions." }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" } ], - "execution_count": 8 + "execution_count": 2 }, { "cell_type": "markdown", @@ -268,54 +183,54 @@ }, "outputs": [ { - "output_type": "stream", "name": "stdout", - "text": "Starting Spark application\n" + "text": "Starting Spark application\n", + "output_type": "stream" }, { - "output_type": "display_data", "data": { "text/plain": "", - "text/html": "\n
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
7application_1581458669418_0036pysparkidleLinkLink
" + "text/html": "\n
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
4application_1597953190209_0006pysparkidleLinkLink
" }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "display_data", "data": { "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "52afbfffaf3545e28a2d09864d1c4ced" + "model_id": "0f33eba1feef441fa9b77e82bdf2c5ee" } }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "stream", "name": "stdout", - "text": "SparkSession available as 'spark'.\n" + "text": "SparkSession available as 'spark'.\n", + "output_type": "stream" }, { - "output_type": "display_data", "data": { "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "7e03eb6a81cd41e4878f12df5ee31dc7" + "model_id": "e97636b10a734032a1cdae8c2a16e08a" } }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "stream", "name": "stdout", - "text": "+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n|age| workclass|fnlwgt|education|education-num| marital-status| occupation| relationship| race| sex|capital-gain|capital-loss|hours-per-week|native-country|income|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n| 39| State-gov| 77516|Bachelors| 13| Never-married| Adm-clerical|Not-in-family|White| Male| 2174| 0| 40| United-States| <=50K|\n| 50|Self-emp-not-inc| 83311|Bachelors| 13|Married-civ-spouse| Exec-managerial| Husband|White| Male| 0| 0| 13| United-States| <=50K|\n| 38| Private|215646| HS-grad| 9| Divorced|Handlers-cleaners|Not-in-family|White| Male| 0| 0| 40| United-States| <=50K|\n| 53| Private|234721| 11th| 7|Married-civ-spouse|Handlers-cleaners| Husband|Black| Male| 0| 0| 40| United-States| <=50K|\n| 28| Private|338409|Bachelors| 13|Married-civ-spouse| Prof-specialty| Wife|Black|Female| 0| 0| 40| Cuba| <=50K|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\nonly showing top 5 rows\n\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n|age| workclass|fnlwgt|education|education_num| marital_status| occupation| relationship| race| sex|capital_gain|capital_loss|hours_per_week|native_country|income|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n| 39| State-gov| 77516|Bachelors| 13| Never-married| Adm-clerical|Not-in-family|White| Male| 2174| 0| 40| United-States| <=50K|\n| 50|Self-emp-not-inc| 83311|Bachelors| 13|Married-civ-spouse| Exec-managerial| Husband|White| Male| 0| 0| 13| United-States| <=50K|\n| 38| Private|215646| HS-grad| 9| Divorced|Handlers-cleaners|Not-in-family|White| Male| 0| 0| 40| United-States| <=50K|\n| 53| Private|234721| 11th| 7|Married-civ-spouse|Handlers-cleaners| Husband|Black| Male| 0| 0| 40| United-States| <=50K|\n| 28| Private|338409|Bachelors| 13|Married-civ-spouse| Prof-specialty| Wife|Black|Female| 0| 0| 40| Cuba| <=50K|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\nonly showing top 5 rows" + "text": "+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n|age| workclass|fnlwgt|education|education-num| marital-status| occupation| relationship| race| sex|capital-gain|capital-loss|hours-per-week|native-country|income|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n| 39| State-gov| 77516|Bachelors| 13| Never-married| Adm-clerical|Not-in-family|White| Male| 2174| 0| 40| United-States| <=50K|\n| 50|Self-emp-not-inc| 83311|Bachelors| 13|Married-civ-spouse| Exec-managerial| Husband|White| Male| 0| 0| 13| United-States| <=50K|\n| 38| Private|215646| HS-grad| 9| Divorced|Handlers-cleaners|Not-in-family|White| Male| 0| 0| 40| United-States| <=50K|\n| 53| Private|234721| 11th| 7|Married-civ-spouse|Handlers-cleaners| Husband|Black| Male| 0| 0| 40| United-States| <=50K|\n| 28| Private|338409|Bachelors| 13|Married-civ-spouse| Prof-specialty| Wife|Black|Female| 0| 0| 40| Cuba| <=50K|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\nonly showing top 5 rows\n\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n|age| workclass|fnlwgt|education|education_num| marital_status| occupation| relationship| race| sex|capital_gain|capital_loss|hours_per_week|native_country|income|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n| 39| State-gov| 77516|Bachelors| 13| Never-married| Adm-clerical|Not-in-family|White| Male| 2174| 0| 40| United-States| <=50K|\n| 50|Self-emp-not-inc| 83311|Bachelors| 13|Married-civ-spouse| Exec-managerial| Husband|White| Male| 0| 0| 13| United-States| <=50K|\n| 38| Private|215646| HS-grad| 9| Divorced|Handlers-cleaners|Not-in-family|White| Male| 0| 0| 40| United-States| <=50K|\n| 53| Private|234721| 11th| 7|Married-civ-spouse|Handlers-cleaners| Husband|Black| Male| 0| 0| 40| United-States| <=50K|\n| 28| Private|338409|Bachelors| 13|Married-civ-spouse| Prof-specialty| Wife|Black|Female| 0| 0| 40| Cuba| <=50K|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\nonly showing top 5 rows", + "output_type": "stream" } ], - "execution_count": 5 + "execution_count": 3 }, { "cell_type": "markdown", @@ -336,7 +251,7 @@ "#Write from Spark to SQL table using MSSQL Spark Connector\r\n", "print(\"MSSQL Spark Connector write(overwrite) start \")\r\n", "\r\n", - "servername = \"jdbc:sqlserver://master-p-svc:1433\"\r\n", + "servername = \"jdbc:sqlserver://mssql.azdata.local:31433\"\r\n", "dbname = \"spark_mssql_db\"\r\n", "security_spec = \";integratedSecurity=true;authenticationScheme=JavaKerberos;\"\r\n", "url = servername + \";\" + \"databaseName=\" + dbname + security_spec\r\n", @@ -364,24 +279,24 @@ }, "outputs": [ { - "output_type": "display_data", "data": { "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, - "model_id": "644bfe3ba48142f38f52717cab9eb19d" + "model_id": "82fe4fdfbb0c4110871ab3f0e4011600" } }, - "metadata": {} + "metadata": {}, + "output_type": "display_data" }, { - "output_type": "stream", "name": "stdout", - "text": "Use MSSQL connector to write to master SQL instance \nMSSQL Connector write(overwrite) succeeded" + "text": "MSSQL Spark Connector write(overwrite) start \nMSSQL Connector write(overwrite) done", + "output_type": "stream" } ], - "execution_count": 7 + "execution_count": 11 }, { "cell_type": "code", @@ -406,12 +321,24 @@ }, "outputs": [ { - "output_type": "stream", + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "3148b605ab214b408412efb9bfe6b14c" + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { "name": "stdout", - "text": "read data from SQL server table \n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n|age| workclass|fnlwgt|education|education_num| marital_status| occupation| relationship| race| sex|capital_gain|capital_loss|hours_per_week|native_country|income|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n| 39| State-gov| 77516|Bachelors| 13| Never-married| Adm-clerical|Not-in-family|White| Male| 2174| 0| 40| United-States| <=50K|\n| 50|Self-emp-not-inc| 83311|Bachelors| 13|Married-civ-spouse| Exec-managerial| Husband|White| Male| 0| 0| 13| United-States| <=50K|\n| 38| Private|215646| HS-grad| 9| Divorced|Handlers-cleaners|Not-in-family|White| Male| 0| 0| 40| United-States| <=50K|\n| 53| Private|234721| 11th| 7|Married-civ-spouse|Handlers-cleaners| Husband|Black| Male| 0| 0| 40| United-States| <=50K|\n| 28| Private|338409|Bachelors| 13|Married-civ-spouse| Prof-specialty| Wife|Black|Female| 0| 0| 40| Cuba| <=50K|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\nonly showing top 5 rows" + "text": "MSSQL Spark Connector read start \n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n|age| workclass|fnlwgt|education|education_num| marital_status| occupation| relationship| race| sex|capital_gain|capital_loss|hours_per_week|native_country|income|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n| 39| State-gov| 77516|Bachelors| 13| Never-married| Adm-clerical|Not-in-family|White| Male| 2174| 0| 40| United-States| <=50K|\n| 50|Self-emp-not-inc| 83311|Bachelors| 13|Married-civ-spouse| Exec-managerial| Husband|White| Male| 0| 0| 13| United-States| <=50K|\n| 38| Private|215646| HS-grad| 9| Divorced|Handlers-cleaners|Not-in-family|White| Male| 0| 0| 40| United-States| <=50K|\n| 53| Private|234721| 11th| 7|Married-civ-spouse|Handlers-cleaners| Husband|Black| Male| 0| 0| 40| United-States| <=50K|\n| 28| Private|338409|Bachelors| 13|Married-civ-spouse| Prof-specialty| Wife|Black|Female| 0| 0| 40| Cuba| <=50K|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\nonly showing top 5 rows\n\nMSSQL Spark Connector read done", + "output_type": "stream" } ], - "execution_count": 7 + "execution_count": 13 }, { "cell_type": "markdown", @@ -436,7 +363,7 @@ "#Write from Spark to datapools using Spark Connector\r\n", "print(\"MSSQL Spark Connector write(overwrite) start \")\r\n", "\r\n", - "servername = \"jdbc:sqlserver://master-p-svc:1433\"\r\n", + "servername = \"jdbc:sqlserver://mssql.azdata.local:31433\"\r\n", "dbname = \"spark_mssql_db\"\r\n", "security_spec = \";integratedSecurity=true;authenticationScheme=JavaKerberos;\"\r\n", "url = servername + \";\" + \"databaseName=\" + dbname + security_spec\r\n", @@ -465,8 +392,26 @@ "metadata": { "azdata_cell_guid": "9cbe5af3-6ddb-4f19-8423-d10cbb7d48a7" }, - "outputs": [], - "execution_count": null + "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "17795c5c901e469da197644ce432836b" + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "text": "MSSQL Spark Connector write(overwrite) start \nMSSQL Connector write(overwrite) done", + "output_type": "stream" + } + ], + "execution_count": 12 }, { "cell_type": "code", @@ -489,8 +434,26 @@ "metadata": { "azdata_cell_guid": "5550bfce-4852-4fb8-9caa-1120c05dafb7" }, - "outputs": [], - "execution_count": null + "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "19c6e7b6076b42718229d4ae61ccd61c" + } + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "text": "MSSQL Spark Connector read data pool external table start \n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n|age| workclass|fnlwgt|education|education_num| marital_status| occupation| relationship| race| sex|capital_gain|capital_loss|hours_per_week|native_country|income|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\n| 39| State-gov| 77516|Bachelors| 13| Never-married| Adm-clerical|Not-in-family|White| Male| 2174| 0| 40| United-States| <=50K|\n| 50|Self-emp-not-inc| 83311|Bachelors| 13|Married-civ-spouse| Exec-managerial| Husband|White| Male| 0| 0| 13| United-States| <=50K|\n| 38| Private|215646| HS-grad| 9| Divorced|Handlers-cleaners|Not-in-family|White| Male| 0| 0| 40| United-States| <=50K|\n| 53| Private|234721| 11th| 7|Married-civ-spouse|Handlers-cleaners| Husband|Black| Male| 0| 0| 40| United-States| <=50K|\n| 28| Private|338409|Bachelors| 13|Married-civ-spouse| Prof-specialty| Wife|Black|Female| 0| 0| 40| Cuba| <=50K|\n+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+--------------+--------------+------+\nonly showing top 5 rows\n\nMSSQL Connector read from data pool external table succeeded", + "output_type": "stream" + } + ], + "execution_count": 14 } ] } \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/spark/data-virtualization/mssql_spark_connector_user_creation.ipynb b/samples/features/sql-big-data-cluster/spark/data-virtualization/mssql_spark_connector_user_creation.ipynb index 9042a514fa..9d038ff346 100644 --- a/samples/features/sql-big-data-cluster/spark/data-virtualization/mssql_spark_connector_user_creation.ipynb +++ b/samples/features/sql-big-data-cluster/spark/data-virtualization/mssql_spark_connector_user_creation.ipynb @@ -27,14 +27,32 @@ "azdata_cell_guid": "4d6539fc-aa99-4cd8-a9de-357e2d6424e2" } }, + { + "cell_type": "markdown", + "source": [ + "## For non-AD cluster, run the following cells to prepare user and table:" + ], + "metadata": { + "azdata_cell_guid": "9642f940-770f-4bfd-85ee-e0159ccb5689" + } + }, { "cell_type": "code", "source": [ - "-- Start with creating a testdatabase. \r\n", - "Create DATABASE connector_test_db" + "-- Create a database named \"connector_test_db\"\r\n", + "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'connector_test_db')\r\n", + "BEGIN\r\n", + " Create DATABASE connector_test_db\r\n", + "END\r\n", + "\r\n", + "-- Create a login\r\n", + "IF NOT EXISTS (select name from sys.server_principals where name='connector_user')\r\n", + "BEGIN\r\n", + " CREATE LOGIN connector_user WITH PASSWORD ='password123!#' \r\n", + "END" ], "metadata": { - "azdata_cell_guid": "8fdf2f56-f89d-4bf9-81be-1dfb92631251" + "azdata_cell_guid": "84932473-88cd-433e-baf7-eeee178021aa" }, "outputs": [ { @@ -47,32 +65,44 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:01.345" + "text/html": "Total execution time: 00:00:00.335" }, "metadata": {} } ], - "execution_count": 1 + "execution_count": 6 }, { "cell_type": "code", "source": [ - "Use connector_test_db;\n", - "CREATE LOGIN connector_user WITH PASSWORD ='password123!#' \n", - "CREATE USER connector_user FROM LOGIN connector_user\n", - "\n", - "-- To create external tables in data pools\n", - "grant alter any external data source to connector_user;\n", - "\n", - "-- To create external table\n", - "grant create table to connector_user;\n", - "grant alter any schema to connector_user;\n", - "\n", - "ALTER ROLE [db_datareader] ADD MEMBER connector_user\n", - "ALTER ROLE [db_datawriter] ADD MEMBER connector_user" + "Use connector_test_db;\r\n", + "\r\n", + "-- Create a database user\r\n", + "CREATE USER connector_user FROM LOGIN connector_user\r\n", + "\r\n", + "-- To view data pool node configuration\r\n", + "grant VIEW DATABASE STATE to connector_user;\r\n", + "\r\n", + "-- To create external tables in data pools\r\n", + "grant alter any external data source to connector_user;\r\n", + "\r\n", + "-- To create external table\r\n", + "grant create table to connector_user;\r\n", + "grant alter any schema to connector_user;\r\n", + "\r\n", + "ALTER ROLE [db_datareader] ADD MEMBER connector_user;\r\n", + "ALTER ROLE [db_datawriter] ADD MEMBER connector_user;\r\n", + "\r\n", + "-- Create external table in data pool\r\n", + "CREATE EXTERNAL DATA SOURCE connector_ds WITH (LOCATION = 'sqldatapool://controller-svc/default');\r\n", + "EXECUTE('USE connector_test_db; CREATE EXTERNAL TABLE [dummy3] ([number] int, [word] nvarchar(2048)) WITH (DATA_SOURCE = connector_ds, DISTRIBUTION = ROUND_ROBIN)')\r\n", + "\r\n", + "-- Create a login in data pools and Provide right permissions to this user\r\n", + "EXECUTE( ' Use connector_test_db; CREATE LOGIN connector_user WITH PASSWORD = ''password123!#'' ; ' ) AT DATA_SOURCE connector_ds;\r\n", + "EXECUTE( ' Use connector_test_db; CREATE USER connector_user ; ALTER ROLE [db_datareader] ADD MEMBER connector_user; ALTER ROLE [db_datawriter] ADD MEMBER connector_user ;') AT DATA_SOURCE connector_ds;" ], "metadata": { - "azdata_cell_guid": "4dd976a3-1ed7-43d3-ad29-657fe1046fb3" + "azdata_cell_guid": "8fdf2f56-f89d-4bf9-81be-1dfb92631251" }, "outputs": [ { @@ -85,25 +115,39 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.087" + "text/html": "Total execution time: 00:00:10.334" }, "metadata": {} } ], - "execution_count": 2 + "execution_count": 1 + }, + { + "cell_type": "markdown", + "source": [ + "## For AD cluster, run the following cells to prepare user and table:" + ], + "metadata": { + "azdata_cell_guid": "11ea89a5-5f60-495d-864e-a80ef7a10510" + } }, { "cell_type": "code", "source": [ - "-- Add this user to a data pool user.\r\n", - "Use connector_test_db;\r\n", - "CREATE EXTERNAL DATA SOURCE connector_ds WITH (LOCATION = 'sqldatapool://controller-svc/default');\r\n", - "EXECUTE('USE connector_test_db; CREATE EXTERNAL TABLE [dummy3] ([number] int, [word] nvarchar(2048)) WITH (DATA_SOURCE = connector_ds, DISTRIBUTION = ROUND_ROBIN)')\r\n", + "-- Create a database named \"spark_mssql_db\"\r\n", + "IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'spark_mssql_db')\r\n", + "BEGIN\r\n", + " CREATE DATABASE spark_mssql_db\r\n", + "END\r\n", "\r\n", - "" + "-- Create a login from a domain user\r\n", + "IF NOT EXISTS (select name from sys.server_principals where name='AZDATA\\testusera1')\r\n", + "BEGIN\r\n", + " CREATE LOGIN [AZDATA\\testusera1] FROM WINDOWS\r\n", + "END" ], "metadata": { - "azdata_cell_guid": "0b06540d-0787-493d-aba6-83420200da14" + "azdata_cell_guid": "819012ba-db8f-4c25-9606-1801f46d60e4" }, "outputs": [ { @@ -116,22 +160,45 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:04.496" + "text/html": "Total execution time: 00:00:10.921" }, "metadata": {} } ], - "execution_count": 3 + "execution_count": 18 }, { "cell_type": "code", "source": [ + "Use spark_mssql_db;\r\n", + "\r\n", + "-- Create a database user\r\n", + "CREATE USER [AZDATA\\testusera1];\r\n", + "\r\n", + "-- To view data pool node configuration\r\n", + "GRANT VIEW DATABASE STATE to [AZDATA\\testusera1];\r\n", + "\r\n", + "-- To create external tables in data pools\r\n", + "grant alter any external data source to [AZDATA\\testusera1];\r\n", + "\r\n", + "-- To create external table\r\n", + "grant create table to [AZDATA\\testusera1];\r\n", + "grant alter any schema to [AZDATA\\testusera1];\r\n", + "\r\n", + "ALTER ROLE [db_datareader] ADD MEMBER [AZDATA\\testusera1];\r\n", + "ALTER ROLE [db_datawriter] ADD MEMBER [AZDATA\\testusera1];\r\n", + "\r\n", + "-- Create external table in data pool\r\n", + "CREATE EXTERNAL DATA SOURCE connector_ds WITH (LOCATION = 'sqldatapool://controller-svc/default');\r\n", + "EXECUTE('USE spark_mssql_db; CREATE EXTERNAL TABLE [dummy3] ([number] int, [word] nvarchar(2048)) WITH (DATA_SOURCE = connector_ds, DISTRIBUTION = ROUND_ROBIN)')\r\n", + "\r\n", "-- Create a login in data pools and Provide right permissions to this user\r\n", - "EXECUTE( ' Use connector_test_db; CREATE LOGIN connector_user WITH PASSWORD = ''password123!#'' ; ' ) AT DATA_SOURCE connector_ds;\r\n", - "EXECUTE( ' Use connector_test_db; CREATE USER connector_user ; ALTER ROLE [db_datareader] ADD MEMBER connector_user; ALTER ROLE [db_datawriter] ADD MEMBER connector_user ;') AT DATA_SOURCE connector_ds;" + "EXECUTE( ' USE spark_mssql_db; CREATE LOGIN [AZDATA\\testusera1] FROM WINDOWS ' ) AT DATA_SOURCE connector_ds;\r\n", + "\r\n", + "EXECUTE( ' USE spark_mssql_db; CREATE USER [AZDATA\\testusera1] ; ALTER ROLE [db_datareader] ADD MEMBER [AZDATA\\testusera1]; ALTER ROLE [db_datawriter] ADD MEMBER [AZDATA\\testusera1] ;') AT DATA_SOURCE connector_ds;" ], "metadata": { - "azdata_cell_guid": "5079dfe9-22e3-4a8f-919b-c6219f5a901a" + "azdata_cell_guid": "2c853db3-e081-4229-a66f-5c248fb8eb0d" }, "outputs": [ { @@ -144,12 +211,12 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:01.174" + "text/html": "Total execution time: 00:00:10.628" }, "metadata": {} } ], - "execution_count": 5 + "execution_count": 19 } ] } \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/spark/sparkml/train_score_export_ml_models_with_spark.ipynb b/samples/features/sql-big-data-cluster/spark/sparkml/train_score_export_ml_models_with_spark.ipynb index c3219ad826..4d33912367 100644 --- a/samples/features/sql-big-data-cluster/spark/sparkml/train_score_export_ml_models_with_spark.ipynb +++ b/samples/features/sql-big-data-cluster/spark/sparkml/train_score_export_ml_models_with_spark.ipynb @@ -1,17 +1,17 @@ { "metadata": { "kernelspec": { - "name": "pyspark3kernel", - "display_name": "PySpark3" + "name": "pysparkkernel", + "display_name": "PySpark" }, "language_info": { - "name": "pyspark3", + "name": "pyspark", "mimetype": "text/x-python", "codemirror_mode": { "name": "python", - "version": 3 + "version": 2 }, - "pygments_lexer": "python3" + "pygments_lexer": "python2" } }, "nbformat_minor": 2, @@ -19,18 +19,80 @@ "cells": [ { "cell_type": "markdown", - "source": "# Machine learning with SPARK in SQL Server 2019 Big Data Cluster\r\nSpark in Unified Big data compute engine that enables big data processing, Machine learning and AI\r\n\r\nKey Spark advantages are \r\n1. Distributed compute enging \r\n2. Choice of langauge (Python, R, Scala, Java)\r\n3. Single engine for Batch and Streaming jobs\r\n\r\nIn this tutorial we'll cover how we can use Spark to create and deploy machine learning models. The example is a python(PySpark) sample. The same can also be done using Scala and R ( SparkR) in Spark.\r\n\r\n\"drawing\"\r\n\r\n## Steps\r\n1. Explore your Data\r\n2. Data Prep and split Data as Training and Test set\r\n3. Model Training\r\n4. Model Scoring \r\n5. Persist as Spark Model\r\n6. Persist as Portable Model\r\n\r\nE2E machine learning involves several additional step e.g data exploration, feature selection and principal component analysis,model selection etc. Many of these steps are ignored here for brevity.\r\n\r\n\r\n\r\n", - "metadata": {} + "source": [ + "# Machine learning with SPARK in SQL Server 2019 Big Data Cluster\r\n", + "Spark in Unified Big data compute engine that enables big data processing, Machine learning and AI\r\n", + "\r\n", + "Key Spark advantages are \r\n", + "1. Distributed compute enging \r\n", + "2. Choice of langauge (Python, R, Scala, Java)\r\n", + "3. Single engine for Batch and Streaming jobs\r\n", + "\r\n", + "In this tutorial we'll cover how we can use Spark to create and deploy machine learning models. The example is a python(PySpark) sample. The same can also be done using Scala and R ( SparkR) in Spark.\r\n", + "\r\n", + "\"drawing\"\r\n", + "\r\n", + "## Steps\r\n", + "1. Explore your Data\r\n", + "2. Data Prep and split Data as Training and Test set\r\n", + "3. Model Training\r\n", + "4. Model Scoring \r\n", + "5. Persist as Spark Model\r\n", + "6. Persist as Portable Model\r\n", + "\r\n", + "E2E machine learning involves several additional step e.g data exploration, feature selection and principal component analysis,model selection etc. Many of these steps are ignored here for brevity.\r\n", + "\r\n", + "\r\n", + "\r\n", + "" + ], + "metadata": { + "azdata_cell_guid": "3002b009-3bf8-4d80-b748-7a3c79151bba" + } }, { "cell_type": "markdown", - "source": "## Step 1 - Explore your data\r\n### Load the data\r\nFor this example we'll use **AdultCensusIncome** data from [here]( https://amldockerdatasets.azureedge.net/AdultCensusIncome.csv ). From your Azure Data Studio connect to the HDFS/Spark gateway and create a directory called spark_data under HDFS. \r\nDownload [AdultCensusIncome.csv]( https://amldockerdatasets.azureedge.net/AdultCensusIncome.csv ) to your local machine and upload to HDFS.Upload AdultCensusIncome.csv to the folder we created.\r\n\r\n### Exploratory Analysis\r\n- Baisc exploration on the data\r\n- Labels & Features\r\n1. **Label** - This refers to predicted value. This is represented as a column in the data. Label is **income** \r\n2. **Features** - This refers to the characteristics that are used to predict. **age**, **hours_per_week**, and **education**\r\n\r\nNote : In reality features are chosen by applying some correlations techniques to understand what best characterize the Label we are predicting.\r\n\r\n### The Model we will build\r\nIn AdultCensusIncome.csv contains several columsn like Income range, age, hours-per-week, education, occupation etc. We'll build a model that can predict income range would be >50K or <50K.\r\n", - "metadata": {} + "source": [ + "## Step 1 - Explore your data\r\n", + "### Load the data\r\n", + "For this example we'll use **AdultCensusIncome** data from [here]( https://amldockerdatasets.azureedge.net/AdultCensusIncome.csv ). From your Azure Data Studio connect to the HDFS/Spark gateway and create a directory called spark_data under HDFS. \r\n", + "Download [AdultCensusIncome.csv]( https://amldockerdatasets.azureedge.net/AdultCensusIncome.csv ) to your local machine and upload to HDFS.Upload AdultCensusIncome.csv to the folder we created.\r\n", + "\r\n", + "### Exploratory Analysis\r\n", + "- Baisc exploration on the data\r\n", + "- Labels & Features\r\n", + "1. **Label** - This refers to predicted value. This is represented as a column in the data. Label is **income** \r\n", + "2. **Features** - This refers to the characteristics that are used to predict. **age**, **hours_per_week**, and **education**\r\n", + "\r\n", + "Note : In reality features are chosen by applying some correlations techniques to understand what best characterize the Label we are predicting.\r\n", + "\r\n", + "### The Model we will build\r\n", + "In AdultCensusIncome.csv contains several columsn like Income range, age, hours-per-week, education, occupation etc. We'll build a model that can predict income range would be >50K or <50K.\r\n", + "" + ], + "metadata": { + "azdata_cell_guid": "7c5aea92-c1bd-4195-a9b4-8e5a1a69de23" + } }, { "cell_type": "code", - "source": "datafile = \"/spark_data/AdultCensusIncome.csv\"\r\n\r\n#Read the data to a spark data frame.\r\ndata_all = spark.read.format('csv').options(header='true', inferSchema='true', ignoreLeadingWhiteSpace='true', ignoreTrailingWhiteSpace='true').load(datafile)\r\nprint(\"Number of rows: {}, Number of coulumns : {}\".format(data_all.count(), len(data_all.columns)))\r\ndata_all.printSchema() \r\n\r\n#Replace \"-\" with \"_\" in column names\r\ncolumns_new = [col.replace(\"-\", \"_\") for col in data_all.columns]\r\ndata_all = data_all.toDF(*columns_new)\r\ndata_all.printSchema()\r\n", - "metadata": {}, + "source": [ + "datafile = \"/spark_data/AdultCensusIncome.csv\"\r\n", + "\r\n", + "#Read the data to a spark data frame.\r\n", + "data_all = spark.read.format('csv').options(header='true', inferSchema='true', ignoreLeadingWhiteSpace='true', ignoreTrailingWhiteSpace='true').load(datafile)\r\n", + "print(\"Number of rows: {}, Number of coulumns : {}\".format(data_all.count(), len(data_all.columns)))\r\n", + "data_all.printSchema() \r\n", + "\r\n", + "#Replace \"-\" with \"_\" in column names\r\n", + "columns_new = [col.replace(\"-\", \"_\") for col in data_all.columns]\r\n", + "data_all = data_all.toDF(*columns_new)\r\n", + "data_all.printSchema()\r\n", + "" + ], + "metadata": { + "azdata_cell_guid": "9fb741a4-ea63-45d0-ad37-373092b0ba36" + }, "outputs": [ { "name": "stdout", @@ -40,7 +102,19 @@ { "data": { "text/plain": "", - "text/html": "\n
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
20application_1559313998190_0086pyspark3idleLinkLink
" + "text/html": "\n
IDYARN Application IDKindStateSpark UIDriver logCurrent session?
0application_1582749467073_0001pysparkidleLinkLink
" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "91567484ce714d2ea856ce1ae23d09d7" + } }, "metadata": {}, "output_type": "display_data" @@ -50,129 +124,430 @@ "text": "SparkSession available as 'spark'.\n", "output_type": "stream" }, + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "aa11297baa07447c980a3ce97657fe75" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "text": "Number of rows: 32561, Number of coulumns : 15\nroot\n |-- age: integer (nullable = true)\n |-- workclass: string (nullable = true)\n |-- fnlwgt: integer (nullable = true)\n |-- education: string (nullable = true)\n |-- education-num: integer (nullable = true)\n |-- marital-status: string (nullable = true)\n |-- occupation: string (nullable = true)\n |-- relationship: string (nullable = true)\n |-- race: string (nullable = true)\n |-- sex: string (nullable = true)\n |-- capital-gain: integer (nullable = true)\n |-- capital-loss: integer (nullable = true)\n |-- hours-per-week: integer (nullable = true)\n |-- native-country: string (nullable = true)\n |-- income: string (nullable = true)\n\nroot\n |-- age: integer (nullable = true)\n |-- workclass: string (nullable = true)\n |-- fnlwgt: integer (nullable = true)\n |-- education: string (nullable = true)\n |-- education_num: integer (nullable = true)\n |-- marital_status: string (nullable = true)\n |-- occupation: string (nullable = true)\n |-- relationship: string (nullable = true)\n |-- race: string (nullable = true)\n |-- sex: string (nullable = true)\n |-- capital_gain: integer (nullable = true)\n |-- capital_loss: integer (nullable = true)\n |-- hours_per_week: integer (nullable = true)\n |-- native_country: string (nullable = true)\n |-- income: string (nullable = true)", "output_type": "stream" } ], - "execution_count": 2 + "execution_count": 3 }, { "cell_type": "code", - "source": "#Basic data exploration\r\n\r\n##1. Sub set the data and print some important columns\r\nprint(\"Select few columns to see the data\")\r\ndata_all.select(['income','age','hours_per_week', 'education']).show(10)\r\n\r\n## Find the number of distict values\r\nprint(\"Number of distinct values for income\")\r\nds_sub = data_all.select('income').distinct()\r\nds_sub.show()\r\n\r\n##Add a numberic column(income_code) derived from income column\r\nprint(\"Added numeric column(income_code) derived from income column\")\r\nfrom pyspark.sql.functions import expr\r\n\r\ndf_new = data_all.withColumn(\"income_code\", expr(\"case \\\r\n when income like '%<=50K%' then 0 \\\r\n when income like '%>50K%' then 1 \\\r\n else 2 end \"))\r\n\r\ndf_new.select(['income', 'age', 'hours_per_week', 'education', 'income_code']).show(10)\r\n\r\n##Summary statistical operations on dataframe\r\nprint(\"Print a statistical summary of a few columns\")\r\ndf_new.select(['income','age','hours_per_week', 'education','income_code']).describe().show()\r\n\r\nprint(\"Calculate Co variance between a few columns to understand features to use\")\r\nmycov = df_new.stat.cov('income_code','hours_per_week')\r\nprint(\"Covariance between income and hours_per_week is\", round(mycov,1))\r\n\r\nmycov = df_new.stat.cov('income_code','age')\r\nprint(\"Covariance between income and age is\", round(mycov,1))\r\n\r\n", - "metadata": {}, + "source": [ + "#Basic data exploration\r\n", + "\r\n", + "##1. Sub set the data and print some important columns\r\n", + "print(\"Select few columns to see the data\")\r\n", + "data_all.select(['income','age','hours_per_week', 'education']).show(10)\r\n", + "\r\n", + "## Find the number of distict values\r\n", + "print(\"Number of distinct values for income\")\r\n", + "ds_sub = data_all.select('income').distinct()\r\n", + "ds_sub.show()\r\n", + "\r\n", + "##Add a numberic column(income_code) derived from income column\r\n", + "print(\"Added numeric column(income_code) derived from income column\")\r\n", + "from pyspark.sql.functions import expr\r\n", + "\r\n", + "df_new = data_all.withColumn(\"income_code\", expr(\"case \\\r\n", + " when income like '%<=50K%' then 0 \\\r\n", + " when income like '%>50K%' then 1 \\\r\n", + " else 2 end \"))\r\n", + "\r\n", + "df_new.select(['income', 'age', 'hours_per_week', 'education', 'income_code']).show(10)\r\n", + "\r\n", + "##Summary statistical operations on dataframe\r\n", + "print(\"Print a statistical summary of a few columns\")\r\n", + "df_new.select(['income','age','hours_per_week', 'education','income_code']).describe().show()\r\n", + "\r\n", + "print(\"Calculate Co variance between a few columns to understand features to use\")\r\n", + "mycov = df_new.stat.cov('income_code','hours_per_week')\r\n", + "print(\"Covariance between income and hours_per_week is\", round(mycov,1))\r\n", + "\r\n", + "mycov = df_new.stat.cov('income_code','age')\r\n", + "print(\"Covariance between income and age is\", round(mycov,1))\r\n", + "\r\n", + "" + ], + "metadata": { + "azdata_cell_guid": "bed46457-a3b0-4972-afc0-f73107af7769" + }, "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "793343b1c2c545da975144505a58cb27" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "text": "Select few columns to see the data\n+------+---+--------------+---------+\n|income|age|hours_per_week|education|\n+------+---+--------------+---------+\n| <=50K| 39| 40|Bachelors|\n| <=50K| 50| 13|Bachelors|\n| <=50K| 38| 40| HS-grad|\n| <=50K| 53| 40| 11th|\n| <=50K| 28| 40|Bachelors|\n| <=50K| 37| 40| Masters|\n| <=50K| 49| 16| 9th|\n| >50K| 52| 45| HS-grad|\n| >50K| 31| 50| Masters|\n| >50K| 42| 40|Bachelors|\n+------+---+--------------+---------+\nonly showing top 10 rows\n\nNumber of distinct values for income\n+------+\n|income|\n+------+\n| <=50K|\n| >50K|\n+------+\n\nAdded numeric column(income_code) derived from income column\n+------+---+--------------+---------+-----------+\n|income|age|hours_per_week|education|income_code|\n+------+---+--------------+---------+-----------+\n| <=50K| 39| 40|Bachelors| 0|\n| <=50K| 50| 13|Bachelors| 0|\n| <=50K| 38| 40| HS-grad| 0|\n| <=50K| 53| 40| 11th| 0|\n| <=50K| 28| 40|Bachelors| 0|\n| <=50K| 37| 40| Masters| 0|\n| <=50K| 49| 16| 9th| 0|\n| >50K| 52| 45| HS-grad| 1|\n| >50K| 31| 50| Masters| 1|\n| >50K| 42| 40|Bachelors| 1|\n+------+---+--------------+---------+-----------+\nonly showing top 10 rows\n\nPrint a statistical summary of a few columns\n+-------+------+------------------+------------------+------------+-------------------+\n|summary|income| age| hours_per_week| education| income_code|\n+-------+------+------------------+------------------+------------+-------------------+\n| count| 32561| 32561| 32561| 32561| 32561|\n| mean| null| 38.58164675532078|40.437455852092995| null| 0.2408095574460244|\n| stddev| null|13.640432553581356|12.347428681731838| null|0.42758148856469247|\n| min| <=50K| 17| 1| 10th| 0|\n| max| >50K| 90| 99|Some-college| 1|\n+-------+------+------------------+------------------+------------+-------------------+\n\nCalculate Co variance between a few columns to understand features to use\nCovariance between income and hours_per_week is 1.2\nCovariance between income and age is 1.4", "output_type": "stream" } ], - "execution_count": 3 + "execution_count": 4 }, { "cell_type": "code", - "source": "# Choose feature columns and the label column.\r\nlabel = \"income\"\r\nxvars = [\"age\", \"hours_per_week\", 'education'] #numeric and string\r\n\r\nprint(\"label = {}\".format(label))\r\nprint(\"features = {}\".format(xvars))\r\n\r\n#Check label counts to check data bias\r\nprint(\"Count of rows that are <=50K\", data_all[data_all.income==\"<=50K\"].count())\r\nprint(\"Count of rows that are >50K\", data_all[data_all.income==\">50K\"].count())\r\n\r\n\r\nselect_cols = xvars\r\nselect_cols.append(label)\r\ndata = data_all.select(select_cols)", - "metadata": {}, + "source": [ + "# Choose feature columns and the label column.\r\n", + "label = \"income\"\r\n", + "xvars = [\"age\", \"hours_per_week\", 'education'] #numeric and string\r\n", + "\r\n", + "print(\"label = {}\".format(label))\r\n", + "print(\"features = {}\".format(xvars))\r\n", + "\r\n", + "#Check label counts to check data bias\r\n", + "print(\"Count of rows that are <=50K\", data_all[data_all.income==\"<=50K\"].count())\r\n", + "print(\"Count of rows that are >50K\", data_all[data_all.income==\">50K\"].count())\r\n", + "\r\n", + "\r\n", + "select_cols = xvars\r\n", + "select_cols.append(label)\r\n", + "data = data_all.select(select_cols)" + ], + "metadata": { + "azdata_cell_guid": "86f0640c-c2f4-4b4c-ae98-6e6806d4e77f" + }, "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "b0be4b8053684bbaadc38b1acfb4ea00" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "text": "label = income\nfeatures = ['age', 'hours_per_week', 'education']\nCount of rows that are <=50K 24720\nCount of rows that are >50K 7841", "output_type": "stream" } ], - "execution_count": 4 + "execution_count": 5 }, { "cell_type": "markdown", - "source": "## Step 2 - Split as training and test set\r\nWe'll use 75% of rows to train the model and rest of the 25% to evaluate the model. Additionally we persist the train and test data sets to HDFS storage. The step is not necessary , but shown to demonstrate saving and loading with ORC format. Other format e.g. Parquet may also be used. Post this step you should see 2 directories created with the name \"AdultCensusIncomeTrain\" and \"AdultCensusIncomeTest\"\r\n", - "metadata": {} + "source": [ + "## Step 2 - Split as training and test set\r\n", + "We'll use 75% of rows to train the model and rest of the 25% to evaluate the model. Additionally we persist the train and test data sets to HDFS storage. The step is not necessary , but shown to demonstrate saving and loading with ORC format. Other format e.g. Parquet may also be used. Post this step you should see 2 directories created with the name \"AdultCensusIncomeTrain\" and \"AdultCensusIncomeTest\"\r\n", + "" + ], + "metadata": { + "azdata_cell_guid": "bcaaaac9-6efc-4dfe-87b0-ef375a9a0758" + } }, { "cell_type": "code", - "source": "train, test = data.randomSplit([0.75, 0.25], seed=123)\r\n\r\nprint(\"train ({}, {})\".format(train.count(), len(train.columns)))\r\nprint(\"test ({}, {})\".format(test.count(), len(test.columns)))\r\n\r\ntrain_data_path = \"/spark_ml/AdultCensusIncomeTrain\"\r\ntest_data_path = \"/spark_ml/AdultCensusIncomeTest\"\r\n\r\ntrain.write.mode('overwrite').orc(train_data_path)\r\ntest.write.mode('overwrite').orc(test_data_path)\r\nprint(\"train and test datasets saved to {} and {}\".format(train_data_path, test_data_path))", - "metadata": {}, + "source": [ + "train, test = data.randomSplit([0.75, 0.25], seed=123)\r\n", + "\r\n", + "print(\"train ({}, {})\".format(train.count(), len(train.columns)))\r\n", + "print(\"test ({}, {})\".format(test.count(), len(test.columns)))\r\n", + "\r\n", + "train_data_path = \"/spark_ml/AdultCensusIncomeTrain\"\r\n", + "test_data_path = \"/spark_ml/AdultCensusIncomeTest\"\r\n", + "\r\n", + "train.write.mode('overwrite').orc(train_data_path)\r\n", + "test.write.mode('overwrite').orc(test_data_path)\r\n", + "print(\"train and test datasets saved to {} and {}\".format(train_data_path, test_data_path))" + ], + "metadata": { + "azdata_cell_guid": "7e487878-958b-4cd8-97fe-0199c29059a8" + }, "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "e48983c1085b4e1e936352672e8368e4" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "text": "train (24469, 4)\ntest (8092, 4)\ntrain and test datasets saved to /spark_ml/AdultCensusIncomeTrain and /spark_ml/AdultCensusIncomeTest", "output_type": "stream" } ], - "execution_count": 5 + "execution_count": 6 }, { "cell_type": "markdown", - "source": "## Step 3 - Train a model\r\n[Spark ML pipelines](https://spark.apache.org/docs/latest/ml-pipeline.html) allow to sequence all steps as a workflow and make it easier to experiment with various algorithms and their parameters. The following code first constructs the stages and then puts these stages together in Ml pipeline. LogisticRegression is used to create the model.", - "metadata": {} + "source": [ + "## Step 3 - Train a model\r\n", + "[Spark ML pipelines](https://spark.apache.org/docs/latest/ml-pipeline.html) allow to sequence all steps as a workflow and make it easier to experiment with various algorithms and their parameters. The following code first constructs the stages and then puts these stages together in Ml pipeline. LogisticRegression is used to create the model." + ], + "metadata": { + "azdata_cell_guid": "eb03e212-5450-47bf-8fb9-e4d412f1ab74" + } }, { "cell_type": "code", - "source": "from pyspark.ml import Pipeline, PipelineModel\r\nfrom pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer, VectorAssembler\r\nfrom pyspark.ml.classification import LogisticRegression\r\n\r\nreg = 0.1\r\nprint(\"Using LogisticRegression model with Regularization Rate of {}.\".format(reg))\r\n\r\n# create a new Logistic Regression model.\r\nlr = LogisticRegression(regParam=reg)\r\n\r\ndtypes = dict(train.dtypes)\r\ndtypes.pop(label)\r\n\r\nsi_xvars = []\r\nohe_xvars = []\r\nfeatureCols = []\r\nfor idx,key in enumerate(dtypes):\r\n if dtypes[key] == \"string\":\r\n featureCol = \"-\".join([key, \"encoded\"])\r\n featureCols.append(featureCol)\r\n \r\n tmpCol = \"-\".join([key, \"tmp\"])\r\n si_xvars.append(StringIndexer(inputCol=key, outputCol=tmpCol, handleInvalid=\"skip\")) #, handleInvalid=\"keep\"\r\n ohe_xvars.append(OneHotEncoderEstimator(inputCols=[tmpCol], outputCols=[featureCol]))\r\n else:\r\n featureCols.append(key)\r\n\r\n# string-index the label column into a column named \"label\"\r\nsi_label = StringIndexer(inputCol=label, outputCol='label')\r\n\r\n# assemble the encoded feature columns in to a column named \"features\"\r\nassembler = VectorAssembler(inputCols=featureCols, outputCol=\"features\")\r\n\r\n\r\nstages = []\r\nstages.extend(si_xvars)\r\nstages.extend(ohe_xvars)\r\nstages.append(si_label)\r\nstages.append(assembler)\r\nstages.append(lr)\r\npipe = Pipeline(stages=stages)\r\nprint(\"Pipeline Created\")\r\n\r\nmodel = pipe.fit(train)\r\nprint(\"Model Trained\")\r\nprint(\"Model is \", model)\r\nprint(\"Model Stages\", model.stages)", - "metadata": {}, + "source": [ + "from pyspark.ml import Pipeline, PipelineModel\r\n", + "from pyspark.ml.feature import OneHotEncoderEstimator, StringIndexer, VectorAssembler\r\n", + "from pyspark.ml.classification import LogisticRegression\r\n", + "\r\n", + "reg = 0.1\r\n", + "print(\"Using LogisticRegression model with Regularization Rate of {}.\".format(reg))\r\n", + "\r\n", + "# create a new Logistic Regression model.\r\n", + "lr = LogisticRegression(regParam=reg)\r\n", + "\r\n", + "dtypes = dict(train.dtypes)\r\n", + "dtypes.pop(label)\r\n", + "\r\n", + "si_xvars = []\r\n", + "ohe_xvars = []\r\n", + "featureCols = []\r\n", + "for idx,key in enumerate(dtypes):\r\n", + " if dtypes[key] == \"string\":\r\n", + " featureCol = \"-\".join([key, \"encoded\"])\r\n", + " featureCols.append(featureCol)\r\n", + " \r\n", + " tmpCol = \"-\".join([key, \"tmp\"])\r\n", + " si_xvars.append(StringIndexer(inputCol=key, outputCol=tmpCol, handleInvalid=\"skip\")) #, handleInvalid=\"keep\"\r\n", + " ohe_xvars.append(OneHotEncoderEstimator(inputCols=[tmpCol], outputCols=[featureCol]))\r\n", + " else:\r\n", + " featureCols.append(key)\r\n", + "\r\n", + "# string-index the label column into a column named \"label\"\r\n", + "si_label = StringIndexer(inputCol=label, outputCol='label')\r\n", + "\r\n", + "# assemble the encoded feature columns in to a column named \"features\"\r\n", + "assembler = VectorAssembler(inputCols=featureCols, outputCol=\"features\")\r\n", + "\r\n", + "\r\n", + "stages = []\r\n", + "stages.extend(si_xvars)\r\n", + "stages.extend(ohe_xvars)\r\n", + "stages.append(si_label)\r\n", + "stages.append(assembler)\r\n", + "stages.append(lr)\r\n", + "pipe = Pipeline(stages=stages)\r\n", + "print(\"Pipeline Created\")\r\n", + "\r\n", + "model = pipe.fit(train)\r\n", + "print(\"Model Trained\")\r\n", + "print(\"Model is \", model)\r\n", + "print(\"Model Stages\", model.stages)" + ], + "metadata": { + "azdata_cell_guid": "3e3c1258-3073-4ede-b3e4-84776b67ba3e" + }, "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "3acc417b6c9b47acadcbc71acf0bc3eb" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", - "text": "Using LogisticRegression model with Regularization Rate of 0.1.\nPipeline Created\nModel Trained\nModel is PipelineModel_1adfacc01e7a\nModel Stages [StringIndexer_ee8506a28443, OneHotEncoderEstimator_cb5dbefb5cce, StringIndexer_38769cda5ab3, VectorAssembler_a3c2d358bd55, LogisticRegressionModel: uid = LogisticRegression_18837c9488f5, numClasses = 2, numFeatures = 17]", + "text": "Using LogisticRegression model with Regularization Rate of 0.1.\nPipeline Created\nModel Trained\nModel is PipelineModel_dd10dea16fcc\nModel Stages [StringIndexer_a72809f2344f, OneHotEncoderEstimator_bff5847e2bae, StringIndexer_e62df3c26c82, VectorAssembler_e84f4c37608c, LogisticRegressionModel: uid = LogisticRegression_96385e6ff190, numClasses = 2, numFeatures = 17]", "output_type": "stream" } ], - "execution_count": 6 + "execution_count": 7 }, { "cell_type": "markdown", - "source": "## Step 4 - Model scoring\r\n\r\nPredict using the model and Evaluate the model accuracy\r\n \r\nThe code below use test data set to predict the outcome using the model created in the step above. We measure accuracy of the model with areaUnderROC and areaUnderPR metric.", - "metadata": {} + "source": [ + "## Step 4 - Model scoring\r\n", + "\r\n", + "Predict using the model and Evaluate the model accuracy\r\n", + " \r\n", + "The code below use test data set to predict the outcome using the model created in the step above. We measure accuracy of the model with areaUnderROC and areaUnderPR metric." + ], + "metadata": { + "azdata_cell_guid": "c03ed2fd-6a23-40c3-b71c-608f14cde6af" + } }, { "cell_type": "code", - "source": "from pyspark.ml.evaluation import BinaryClassificationEvaluator\r\n\r\n# make prediction\r\npred = model.transform(test)\r\n\r\n# evaluate. note only 2 metrics are supported out of the box by Spark ML.\r\nbce = BinaryClassificationEvaluator(rawPredictionCol='rawPrediction')\r\nau_roc = bce.setMetricName('areaUnderROC').evaluate(pred)\r\nau_prc = bce.setMetricName('areaUnderPR').evaluate(pred)\r\n\r\nprint(\"Area under ROC: {}\".format(au_roc))\r\nprint(\"Area Under PR: {}\".format(au_prc))\r\n\r\npred[pred.prediction==1.0][pred.income,pred.label,pred.prediction].show()", - "metadata": {}, + "source": [ + "from pyspark.ml.evaluation import BinaryClassificationEvaluator\r\n", + "\r\n", + "# make prediction\r\n", + "pred = model.transform(test)\r\n", + "\r\n", + "# evaluate. note only 2 metrics are supported out of the box by Spark ML.\r\n", + "bce = BinaryClassificationEvaluator(rawPredictionCol='rawPrediction')\r\n", + "au_roc = bce.setMetricName('areaUnderROC').evaluate(pred)\r\n", + "au_prc = bce.setMetricName('areaUnderPR').evaluate(pred)\r\n", + "\r\n", + "print(\"Area under ROC: {}\".format(au_roc))\r\n", + "print(\"Area Under PR: {}\".format(au_prc))\r\n", + "\r\n", + "pred[pred.prediction==1.0][pred.income,pred.label,pred.prediction].show()" + ], + "metadata": { + "azdata_cell_guid": "b1f5b3e5-a279-4d74-886f-e89789cb3f95" + }, "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "381712d1e2e8407db531b071056ed753" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "text": "Area under ROC: 0.7964496884726682\nArea Under PR: 0.5358180243123482\n+------+-----+----------+\n|income|label|prediction|\n+------+-----+----------+\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n| <=50K| 0.0| 1.0|\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n| <=50K| 0.0| 1.0|\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n| <=50K| 0.0| 1.0|\n| <=50K| 0.0| 1.0|\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n| <=50K| 0.0| 1.0|\n| >50K| 1.0| 1.0|\n+------+-----+----------+\nonly showing top 20 rows", "output_type": "stream" } ], - "execution_count": 7 + "execution_count": 8 }, { "cell_type": "markdown", - "source": "## Step 5 - Persist the Spark Models\r\nFinally we persist the model in HDFS for later use. Post this step the created model get saved as /spark_ml/AdultCensus.mml\r\n\r\n", - "metadata": {} + "source": [ + "## Step 5 - Persist the Spark Models\r\n", + "Finally we persist the model in HDFS for later use. Post this step the created model get saved as /spark_ml/AdultCensus.mml\r\n", + "\r\n", + "" + ], + "metadata": { + "azdata_cell_guid": "095b7da6-6af7-4e15-b984-450ae22c3621" + } }, { "cell_type": "code", - "source": "model_name = \"AdultCensus.mml\"\r\nmodel_fs = \"/spark_ml/\" + model_name\r\n\r\nmodel.write().overwrite().save(model_fs)\r\nprint(\"saved model to {}\".format(model_fs))\r\n\r\n# load the model file and check its same as the in-memory model\r\nmodel2 = PipelineModel.load(model_fs)\r\nassert str(model2) == str(model)\r\nprint(\"Successfully loaded from {}\".format(model_fs))", - "metadata": {}, + "source": [ + "model_name = \"AdultCensus.mml\"\r\n", + "model_fs = \"/spark_ml/\" + model_name\r\n", + "\r\n", + "model.write().overwrite().save(model_fs)\r\n", + "print(\"saved model to {}\".format(model_fs))\r\n", + "\r\n", + "# load the model file and check its same as the in-memory model\r\n", + "model2 = PipelineModel.load(model_fs)\r\n", + "assert str(model2) == str(model)\r\n", + "print(\"Successfully loaded from {}\".format(model_fs))" + ], + "metadata": { + "azdata_cell_guid": "53dcb180-3b03-451e-b2cc-58ce16a62c13" + }, "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "fdb264031f4c444aa0f52718d6c7ac86" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "text": "saved model to /spark_ml/AdultCensus.mml\nSuccessfully loaded from /spark_ml/AdultCensus.mml", "output_type": "stream" } ], - "execution_count": 8 + "execution_count": 9 }, { "cell_type": "markdown", - "source": "## Step 6 - Persist as Portable Model\r\nHere we persist the Model in as Portable Mleap bundle for use outside Spark.", - "metadata": {} + "source": [ + "## Step 6 - Persist as Portable Model\r\n", + "Here we persist the Model in as Portable Mleap bundle for use outside Spark." + ], + "metadata": { + "azdata_cell_guid": "92161ae4-60b6-4725-b0c4-f7b09c0cedf2" + } }, { "cell_type": "code", - "source": "import os\r\nfrom mleap.pyspark.spark_support import SimpleSparkSerializer\r\n# serialize the model to a zip file in JSON format\r\nmodel_name_export = \"adult_census_pipeline.zip\"\r\nmodel_name_path = os.getcwd()\r\nmodel_file = os.path.join(model_name_path, model_name_export)\r\n\r\n# remove an old model file, if needed.\r\ntry:\r\n os.remove(model_file)\r\nexcept OSError:\r\n pass\r\n\r\nmodel_file_path = \"jar:file:{}\".format(model_file)\r\nmodel.serializeToBundle(model_file_path, model.transform(train))\r\n\r\nprint(\"persist the mleap bundle from local to hdfs\")\r\nfrom subprocess import Popen, PIPE\r\nproc = Popen([\"hadoop\", \"fs\", \"-put\", \"-f\", model_file, os.path.join(\"/spark_ml\", model_name_export)], stdout=PIPE, stderr=PIPE)\r\ns_output, s_err = proc.communicate()\r\n", - "metadata": {}, + "source": [ + "import os\r\n", + "from mleap.pyspark.spark_support import SimpleSparkSerializer\r\n", + "# serialize the model to a zip file in JSON format\r\n", + "model_name_export = \"adult_census_pipeline.zip\"\r\n", + "model_name_path = os.getcwd()\r\n", + "model_file = os.path.join(model_name_path, model_name_export)\r\n", + "\r\n", + "# remove an old model file, if needed.\r\n", + "try:\r\n", + " os.remove(model_file)\r\n", + "except OSError:\r\n", + " pass\r\n", + "\r\n", + "model_file_path = \"jar:file:{}\".format(model_file)\r\n", + "model.serializeToBundle(model_file_path, model.transform(train))\r\n", + "\r\n", + "print(\"persist the mleap bundle from local to hdfs\")\r\n", + "\r\n", + "from subprocess import Popen, PIPE\r\n", + "proc = Popen([\"/opt/hadoop/bin/hdfs\", \"dfs\", \"-put\", \"-f\", model_file, os.path.join(\"/spark_ml\", model_name_export)], stdout=PIPE, stderr=PIPE)\r\n", + "s_output, s_err = proc.communicate()\r\n", + "" + ], + "metadata": { + "azdata_cell_guid": "e06fa992-1569-4fc0-95e3-372ae7dbf889" + }, "outputs": [ + { + "data": { + "text/plain": "FloatProgress(value=0.0, bar_style='info', description='Progress:', layout=Layout(height='25px', width='50%'),…", + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "a3c85cc2e90c49a4a2cdd303243fd8d2" + } + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", - "text": "persist the mleap bundle from local to hdfs", + "text": "persist the mleap bundle from local to hdfs\n/tmp/nm-local-dir/usercache/root/appcache/application_1582749467073_0001/container_1582749467073_0001_01_000001/adult_census_pipeline.zip\nadult_census_pipeline.zip\n/opt/hadoop/bin/hdfs/spark_ml/adult_census_pipeline.zip", "output_type": "stream" } ], - "execution_count": 9 + "execution_count": 27 } ] } \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql b/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql index 55c58e8f65..040244a79a 100644 --- a/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql +++ b/samples/features/ssms-templates/Sql/External Data Source/Create External Data Source.sql @@ -7,7 +7,7 @@ GO IF EXISTS ( SELECT * FROM sys.external_data_sources - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO diff --git a/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql b/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql index 0b767cae33..2e83e39c2c 100644 --- a/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql +++ b/samples/features/ssms-templates/Sql/External Data Source/Drop External Data Source.sql @@ -6,8 +6,8 @@ GO IF EXISTS ( SELECT * - FROM sys.external_data_sources - WHERE name = N'' + FROM sys.external_data_sources + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql index 08c1127541..eeb19c1edf 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Create Database.sql @@ -1,5 +1,5 @@ -- =================================================================================================================================== --- Create database template for Azure SQL Database and Azure SQL Data Warehouse Database +-- Create database template for Azure SQL Database and Azure Synapse Analytics Database -- -- This script will only run in the context of the master database. To manage this database in -- SQL Server Management Studio, either connect to the created database, or connect to master. @@ -9,27 +9,30 @@ -- continuity, data protection and security, and near-zero administration � all backed by the power -- and reach of Microsoft Azure. -- --- SQL Database is available in the following service tiers: Basic, Standard, Premium , DataWarehouse, Web (Retired) +-- SQL Database is available in the following service tiers: GeneralPurpose, Basic, Standard, Premium , DataWarehouse, Web (Retired) -- and Business (Retired). +-- General Purpose service tier is a default service tier in Azure SQL Database that is designed for most of the generic workloads. +-- If you need a fully managed database engine with 99.99% SLA with storage latency between 5 and 10 ms that match Azure SQL +-- IaaS in most of the cases, General Purpose tier is the option for you. -- Standard is the go-to option for getting started with cloud-designed business applications and -- offers mid-level performance and business continuity features. Performance objectives for Standard -- deliver predictable per minute transaction rates. -- --- See http://go.microsoft.com/fwlink/p/?LinkId=306622 for more information about Azure SQL Database. +-- See https://go.microsoft.com/fwlink/p/?LinkId=306622 for more information about Azure SQL Database. -- --- See http://go.microsoft.com/fwlink/?LinkId=787140 for more information about Azure SQL Data Warehouse. +-- See https://go.microsoft.com/fwlink/?LinkId=787140 for more information about Azure Synapse Analytics. -- --- See http://go.microsoft.com/fwlink/p/?LinkId=402063 for more information about CREATE DATABASE for Azure SQL Database. +-- See https://go.microsoft.com/fwlink/p/?LinkId=402063 for more information about CREATE DATABASE for Azure SQL Database. -- --- See http://go.microsoft.com/fwlink/?LinkId=787139 for more information about CREATE DATABASE for Azure SQL Data Warehouse Database. +-- See https://go.microsoft.com/fwlink/?LinkId=787139 for more information about CREATE DATABASE for Azure Synapse Analytics Database. -- =================================================================================================================================== CREATE DATABASE COLLATE ( - EDITION = '', - SERVICE_OBJECTIVE='', - MAXSIZE = + EDITION = '', + SERVICE_OBJECTIVE='', + MAXSIZE = ) GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql index 6b1c679034..e782dae8d2 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Database/Drop Database.sql @@ -1,5 +1,5 @@ --- =================================================================================== --- Drop database template for Azure SQL Database and Azure SQL Data Warehouse Database --- =================================================================================== +-- =================================================================================================================================== +-- Drop database template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand Database +-- =================================================================================================================================== DROP DATABASE GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql index 77a403559c..c8923004f8 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Alter External Data Source DW.sql @@ -1,6 +1,6 @@ --- ========================================================================= --- Alter external data source template for Azure SQL Data Warehouse Database --- ========================================================================= +-- ======================================================================== +-- Alter external data source template for Azure Synapse Analytics Database +-- ======================================================================== ALTER EXTERNAL DATA SOURCE SET LOCATION = N'', diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql index 886d87b664..1f7b36b378 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source DW.sql @@ -1,20 +1,20 @@ --- ========================================================================== --- Create external data source template for Azure SQL Data Warehouse Database --- ========================================================================== +-- ========================================================================= +-- Create external data source template for Azure Synapse Analytics Database +-- ========================================================================= IF EXISTS ( SELECT * - FROM sys.external_data_sources - WHERE name = N'' + FROM sys.external_data_sources + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO CREATE EXTERNAL DATA SOURCE WITH ( - TYPE = , - LOCATION = N'', - RESOURCE_MANAGER_LOCATION = N'', - CREDENTIAL = + TYPE = , + LOCATION = N'', + RESOURCE_MANAGER_LOCATION = N'', + CREDENTIAL = ) GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql index 13b90e80ef..200cbce94f 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Create External Data Source.sql @@ -4,7 +4,7 @@ IF EXISTS ( SELECT * FROM sys.external_data_sources - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql index 69e66fd3c2..1072e9f901 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External Data Source/Drop External Data Source.sql @@ -1,11 +1,11 @@ --- =============================================================================================== --- Drop external data source template for Azure SQL Database and Azure SQL Data Warehouse Database --- =============================================================================================== +-- ====================================================================================================================================== +-- Drop external data source template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ====================================================================================================================================== IF EXISTS ( SELECT * - FROM sys.external_data_sources - WHERE name = N'' + FROM sys.external_data_sources + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql index 6f0a5fdfa6..1772c506d2 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Create External File Format.sql @@ -1,6 +1,6 @@ --- ========================================================================== --- Create external file format template for Azure SQL Data Warehouse Database --- ========================================================================== +-- ========================================================================= +-- Create external file format template for Azure Synapse Analytics Database +-- ========================================================================= IF EXISTS ( SELECT * diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql index e39fec07b3..352a56178a 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/External File Format/Drop External File Format.sql @@ -1,6 +1,6 @@ --- ======================================================================== --- Drop external file format template for Azure SQL Data Warehouse Database --- ======================================================================== +-- ================================================================================================================== +-- Drop external file format template for Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ================================================================================================================== IF EXISTS ( SELECT * diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql index bc24016a65..1827a58482 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Scalar Function DW (New Menu).sql @@ -1,6 +1,6 @@ --- ===================================================================== --- Create Scalar Function Template for Azure SQL Data Warehouse Database --- ===================================================================== +-- ==================================================================== +-- Create Scalar Function Template for Azure Synapse Analytics Database +-- ==================================================================== SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql index acce825a39..f7b2d7cd27 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Drop Function.sql @@ -1,6 +1,6 @@ - --=================================================================================== --- Drop function template for Azure SQL Database and Azure SQL Data Warehouse Database ---==================================================================================== + --================================================================================== +-- Drop function template for Azure SQL Database and Azure Synapse Analytics Database +--=================================================================================== IF OBJECT_ID (N'.') IS NOT NULL DROP FUNCTION . GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql index 861fea58cd..b37b8b6f28 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Index.sql @@ -1,6 +1,6 @@ --- ================================================================================== --- Create index template for Azure SQL Database and Azure SQL Data Warehouse Database --- ================================================================================== +-- ================================================================================= +-- Create index template for Azure SQL Database and Azure Synapse Analytics Database +-- ================================================================================= CREATE INDEX ON . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql index 7da059546f..4f8f08817f 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Drop Index.sql @@ -1,6 +1,6 @@ ---======================================================================== --- Drop index template for Azure SQL Database and Azure SQL Data Warehouse ---======================================================================== +--======================================================================= +-- Drop index template for Azure SQL Database and Azure Synapse Analytics +--======================================================================= IF EXISTS ( SELECT * FROM sys.indexes diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql index a060f4921f..519f58f2ea 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Create Login.sql @@ -1,6 +1,6 @@ --- ====================================================================================== --- Create SQL Login template for Azure SQL Database and Azure SQL Data Warehouse Database --- ====================================================================================== +-- ============================================================================================================================= +-- Create SQL Login template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ============================================================================================================================= CREATE LOGIN WITH PASSWORD = '' diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql index ce3904559b..ed021dd888 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Login/Drop Login.sql @@ -1,6 +1,6 @@ --- ==================================================================================== --- Drop SQL Login template for Azure SQL Database and Azure SQL Data Warehouse Database --- ==================================================================================== +-- =========================================================================================================================== +-- Drop SQL Login template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- =========================================================================================================================== DROP LOGIN Go diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql index 216bc3de0e..174dd2bbda 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Create Role.sql @@ -1,6 +1,6 @@ --- ========================================================================================== --- Create Database Role template for Azure SQL Database and Azure SQL Data Warehouse Database --- ========================================================================================== +-- ========================================================================================= +-- Create Database Role template for Azure SQL Database and Azure Synapse Analytics Database +-- ========================================================================================= -- Create the database role CREATE ROLE AUTHORIZATION [dbo] GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql index 2f00d1eca4..ae45b76bec 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Role/Drop Role.sql @@ -1,6 +1,6 @@ --- ======================================================================================== --- Drop Database Role template for Azure SQL Database and Azure SQL Data Warehouse Database --- ======================================================================================== +-- =============================================================================================================================== +-- Drop Database Role template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- =============================================================================================================================== -- Drop the role DROP ROLE ; diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql index 5db793fa2e..a1f5fa8406 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Create Schema.sql @@ -1,6 +1,6 @@ --- =================================================================================== --- Create Schema Template for Azure SQL Database and Azure SQL Data Warehouse Database --- =================================================================================== +-- ========================================================================================================================== +-- Create Schema Template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ========================================================================================================================== CREATE SCHEMA AUTHORIZATION diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql index ca204abab5..608621871a 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Schema/Drop Schema.sql @@ -1,6 +1,6 @@ ---================================================================================== --- Drop Schema template for Azure SQL Database and Azure SQL Data Warehouse Database ---================================================================================== +--========================================================================================================================= +-- Drop Schema template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--========================================================================================================================= IF EXISTS( SELECT * FROM sys.schemas diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql index 8010ace896..61e4940397 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Create Statistics.sql @@ -1,6 +1,6 @@ --- =============================================================================================== --- Create Sampled Statistics Template for Azure SQL Database and Azure SQL Data Warehouse Database --- =============================================================================================== +-- ====================================================================================================================================== +-- Create Sampled Statistics Template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- ====================================================================================================================================== CREATE STATISTICS ON . ( diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql index be0d700a00..bbc6cf1c71 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Statistics/Drop Statistics.sql @@ -1,6 +1,6 @@ ---====================================================================================== --- Drop Statistics template for Azure SQL Database and Azure SQL Data Warehouse Database ---====================================================================================== +--============================================================================================================================= +-- Drop Statistics template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--============================================================================================================================= IF EXISTS ( SELECT * FROM sys.stats as st diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql index a723c18f43..cb91930155 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Stored Procedure DW (New Menu).sql @@ -1,6 +1,6 @@ --- ====================================================================== --- Create Stored Procedure Template for Azure SQL Data Warehouse Database --- ====================================================================== +-- ===================================================================== +-- Create Stored Procedure Template for Azure Synapse Analytics Database +-- ===================================================================== SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql index 8914ee500e..7af30c9ea9 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Drop Stored Procedure.sql @@ -1,6 +1,6 @@ --- =========================================================================================== --- Drop Stored Procedure Template for Azure SQL Database and Azure SQL Data Warehouse Database --- =========================================================================================== +-- ========================================================================================== +-- Drop Stored Procedure Template for Azure SQL Database and Azure Synapse Analytics Database +-- ========================================================================================== -- Drop stored procedure if it already exists IF EXISTS ( diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql index ff56e7883f..753e1079e7 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create External Table DW.sql @@ -1,6 +1,6 @@ --- ==================================================================== --- Create External Table Template for Azure SQL Data Warehouse Database --- ==================================================================== +-- =================================================================== +-- Create External Table Template for Azure Synapse Analytics Database +-- =================================================================== IF OBJECT_ID('.', 'U') IS NOT NULL DROP EXTERNAL TABLE . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql index 9c520ee581..d396703076 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Graph Edge Table.sql @@ -1,24 +1,32 @@ -- ========================================= --- Create Graph Edge Template +-- Create Graph Edge Table Template -- ========================================= +USE +GO -IF OBJECT_ID('.', 'U') IS NOT NULL - DROP TABLE . +DROP TABLE IF EXISTS . GO CREATE TABLE . ( - -- Columns are optional for Edge Tables. + -- Columns are optional for Graph Edge Tables. -- , , , + -- System generated edge constraint. + -- + CONNECTION (), + + CONSTRAINT EC_ CONNECTION (, TO ), -- Unique index on $edge_id is required. - -- If no user-defined index is specified, a default index is created instead. + -- If no user-defined index is specified, a default index is created. + -- INDEX ix_graphid UNIQUE ($edge_id), -- indexes on $from_id and $to_id are optional, but support faster lookups. + -- INDEX ix_fromid ($from_id, $to_id), INDEX ix_toid ($to_id, $from_id) ) diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql index 6762010ebe..ad6873dd59 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Partitioned Table.sql @@ -1,6 +1,6 @@ --- ======================================================================= --- Create Partitioned Table Template for Azure SQL Data Warehouse Database --- ======================================================================= +-- ====================================================================== +-- Create Partitioned Table Template for Azure Synapse Analytics Database +-- ====================================================================== IF OBJECT_ID('.', 'U') IS NOT NULL DROP TABLE . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql index ee646172ba..ad8859e69d 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create SQL DW Table.sql @@ -1,6 +1,6 @@ --- =========================================================== --- Create Table Template for Azure SQL Data Warehouse Database --- =========================================================== +-- ========================================================== +-- Create Table Template for Azure Synapse Analytics Database +-- ========================================================== IF OBJECT_ID('.', 'U') IS NOT NULL DROP TABLE . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql index fff691c835..2496fbf99c 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create System-Versioned Table.sql @@ -13,7 +13,7 @@ BEGIN --If table is system-versioned, SYSTEM_VERSIONING must be set to OFF first - IF ((SELECT temporal_type FROM SYS.TABLES WHERE object_id = OBJECT_ID('.', 'U')) = 2) + IF ((SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('.', 'U')) = 2) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) END diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql index 1bb161fa75..fad276b06f 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop External Table.sql @@ -1,6 +1,6 @@ ---========================================================================================== --- Drop External Table template for Azure SQL Database and Azure SQL Data Warehouse Database ---========================================================================================== +--================================================================================================================================= +-- Drop External Table template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--================================================================================================================================= IF EXISTS ( SELECT * FROM sys.tables diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql index 7758c8b979..8bca0fcf36 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Drop Table.sql @@ -1,6 +1,6 @@ ---================================================================================= --- Drop Table template for Azure SQL Database and Azure SQL Data Warehouse Database ---================================================================================= +--================================================================================ +-- Drop Table template for Azure SQL Database and Azure Synapse Analytics Database +--================================================================================ IF EXISTS ( SELECT * FROM sys.tables diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql index 61de5bf70b..cb838af2d2 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Create User.sql @@ -1,6 +1,6 @@ --- ======================================================================================== --- Create User as DBO template for Azure SQL Database and Azure SQL Data Warehouse Database --- ======================================================================================== +-- ======================================================================================= +-- Create User as DBO template for Azure SQL Database and Azure Synapse Analytics Database +-- ======================================================================================= -- For login , create a user in the database CREATE USER FOR LOGIN diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql index f1a830b465..f21cca8a10 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/User/Drop User.sql @@ -1,5 +1,5 @@ --- ======================================================================================== --- Create User as DBO template for Azure SQL Database and Azure SQL Data Warehouse Database --- ======================================================================================== +-- =============================================================================================================================== +-- Create User as DBO template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +-- =============================================================================================================================== DROP USER GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql index 93570399db..151b410659 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Create View.sql @@ -1,6 +1,6 @@ --- ================================================================================= --- Create View template for Azure SQL Database and Azure SQL Data Warehouse Database --- ================================================================================= +-- ================================================================================ +-- Create View template for Azure SQL Database and Azure Synapse Analytics Database +-- ================================================================================ IF object_id(N'.', 'V') IS NOT NULL DROP VIEW . diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql index a5aeb66f55..b65c834569 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/View/Drop View.sql @@ -1,6 +1,6 @@ ---================================================================================ --- Drop View template for Azure SQL Database and Azure SQL Data Warehouse Database ---================================================================================ +--======================================================================================================================= +-- Drop View template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand +--======================================================================================================================= IF EXISTS ( SELECT * FROM sys.views diff --git a/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql b/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql index c56b10e4b2..d396703076 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Graph Edge Table.sql @@ -1,26 +1,32 @@ -- ========================================= --- Create Graph Edge Template +-- Create Graph Edge Table Template -- ========================================= USE GO -IF OBJECT_ID('.', 'U') IS NOT NULL - DROP TABLE . +DROP TABLE IF EXISTS . GO CREATE TABLE . ( - -- Columns are optional for Edge Tables. + -- Columns are optional for Graph Edge Tables. -- , , , + -- System generated edge constraint. + -- + CONNECTION (), + + CONSTRAINT EC_ CONNECTION (, TO ), -- Unique index on $edge_id is required. -- If no user-defined index is specified, a default index is created. + -- INDEX ix_graphid UNIQUE ($edge_id), -- indexes on $from_id and $to_id are optional, but support faster lookups. + -- INDEX ix_fromid ($from_id, $to_id), INDEX ix_toid ($to_id, $from_id) ) diff --git a/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql b/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql index 2061a1cd9f..371dfa33d5 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Memory Optimized System-Versioned Table.sql @@ -19,7 +19,7 @@ USE GO BEGIN - IF ((SELECT temporal_type FROM SYS.TABLES WHERE object_id = OBJECT_ID('.', 'U')) = 2) + IF ((SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('.', 'U')) = 2) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) END diff --git a/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql b/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql index 420f0300ff..58231ac62b 100644 --- a/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create System-Versioned Table.sql @@ -16,7 +16,7 @@ GO BEGIN --If table is system-versioned, SYSTEM_VERSIONING must be set to OFF first - IF ((SELECT temporal_type FROM SYS.TABLES WHERE object_id = OBJECT_ID('.', 'U')) = 2) + IF ((SELECT temporal_type FROM sys.tables WHERE object_id = OBJECT_ID('.', 'U')) = 2) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) END diff --git a/samples/features/ssms-templates/Sql/Table/drop constraint.sql b/samples/features/ssms-templates/Sql/Table/drop constraint.sql index 893d85fa43..15c30a7bdd 100644 --- a/samples/features/ssms-templates/Sql/Table/drop constraint.sql +++ b/samples/features/ssms-templates/Sql/Table/drop constraint.sql @@ -3,6 +3,11 @@ -- -- This template creates a table with a CHECK CONSTRAINT, -- then it removes the CHECK CONSTRAINT from the table + +-- Note: The DROP syntax can also be used to drop +-- Edge Constraint object types. To achieve this replace +-- the constraint_name attribute with the name of the +-- respective Edge Constraint object -- ======================================================== USE GO diff --git a/samples/features/unicode/DataType_WesternMyth.sql b/samples/features/unicode/DataType_WesternMyth.sql index 2ef4b9d924..cfd1a3cb84 100644 --- a/samples/features/unicode/DataType_WesternMyth.sql +++ b/samples/features/unicode/DataType_WesternMyth.sql @@ -7,7 +7,13 @@ -- Test Latin character strings with Latin collation -- Set size limit of data types to be the same under Basic Multilingual Plane (BMP) -- Characters between 1-byte (ASCII) and 3-bytes (East Asian) +USE master; +DROP DATABASE IF EXISTS UnicodeDatabase; +CREATE DATABASE UnicodeDatabase COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8 +GO +USE UnicodeDatabase +GO DROP TABLE IF EXISTS t1; CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, c2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); @@ -46,7 +52,8 @@ GO -- uh-oh data loss on the varchar example. Why? --- varchar is bound to code page enconding, and these code points cannot be found in the Latin code page. +-- varchar is bound to code page enconding, +-- and these code points cannot be found in the Latin code page. SELECT ASCII('敏' COLLATE Latin1_General_100_CI_AI), CHAR(63) SELECT ASCII('捷' COLLATE Latin1_General_100_CI_AI), CHAR(63) @@ -152,10 +159,10 @@ GO -- But the majority of my data is set to Latin (ASCII) DROP TABLE IF EXISTS t4; -CREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC); +CREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC_UTF8); INSERT INTO t4 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') -SELECT LEN(c1) AS [varchar UTF16 LEN], - DATALENGTH(c1) AS [varchar UTF16 DATALENGTH], c1 +SELECT LEN(c1) AS [varchar UTF8 LEN], + DATALENGTH(c1) AS [varchar UTF8 DATALENGTH], c1 FROM t4; GO @@ -164,8 +171,8 @@ GO -- Where are the savings? SELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], DATALENGTH(N'敏捷的棕色狐狸跳') AS [Chinese_UTF16_2bytes], - DATALENGTH(N'👶👦') AS [SC_UTF16_4bytes] + DATALENGTH(N'👶') AS [SC_UTF16_4bytes] SELECT DATALENGTH('MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Latin_UTF8_1byte], DATALENGTH('敏捷的棕色狐狸跳' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Chinese_UTF8_3bytes], - DATALENGTH('👶👦' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes] + DATALENGTH('👶' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes] GO \ No newline at end of file diff --git a/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb b/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb index 92a4160f8a..bcd928bc58 100644 --- a/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb +++ b/samples/features/unicode/notebooks/DataType_WesternMyth.ipynb @@ -15,45 +15,18 @@ "cells": [ { "cell_type": "markdown", - "source": [ - "# Data type sizes - a western myth" - ], - "metadata": { - "azdata_cell_guid": "9e602698-2ef8-4fed-872f-5bad8c440600" - } + "source": "# Data type sizes - a western myth", + "metadata": {} }, { "cell_type": "markdown", - "source": [ - "## Test Latin character strings with Latin collation\r\n", - "\r\n", - "**Note:** My server default is SQL_Latin1_General_CP1_CI_AS\r\n", - "\r\n", - "Set size limit of data types to be the same under Basic Multilingual Plane (BMP)\r\n", - "Characters between 1-byte (ASCII) and 3-bytes (East Asian)" - ], - "metadata": { - "azdata_cell_guid": "78fc4a30-52e8-407d-8807-04097ad12348" - } + "source": "## Test Latin character strings with Latin collation\r\n\r\n**Note:** My server default is SQL_Latin1_General_CP1_CI_AS\r\n\r\nSet size limit of data types to be the same under Basic Multilingual Plane (BMP)\r\nCharacters: ranging from 1-byte (ASCII) to 3-bytes (East Asian) per character. So a max of 24-bytes for an East Asian 8 character string.", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t1;\r\n", - "CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n", - "\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\n", - "INSERT INTO t1 VALUES (N'MyString', N'MyString') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t1; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t1;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "4a7b199e-3117-4fcb-b149-776f4da6cf71" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t1;\r\nCREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\nINSERT INTO t1 VALUES (N'MyString', N'MyString') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t1; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t1;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -79,14 +52,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.068" + "text/html": "Total execution time: 00:00:00.1996267" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 15, + "execution_count": 1, "data": { "application/vnd.dataresource+json": { "schema": { @@ -111,12 +83,12 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
88MyString
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 15, + "execution_count": 1, "data": { "application/vnd.dataresource+json": { "schema": { @@ -141,47 +113,26 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
816MyString
" - } + }, + "metadata": {} } ], "execution_count": 15 }, { "cell_type": "markdown", - "source": [ - "That's as expected. So what was I talking about?" - ], - "metadata": { - "azdata_cell_guid": "8615ddba-64e7-4abc-9df6-ec5648f39788" - } + "source": "That's as expected on bothe cases. So what was I talking about?\r\n\r\nRun next example with Chinese characters.", + "metadata": {} }, { "cell_type": "markdown", - "source": [ - "# Test Chinese character strings with Latin collation" - ], - "metadata": { - "azdata_cell_guid": "4a85f77d-fd22-46a6-b7aa-5d6fca65dd99" - } + "source": "# Test Chinese character strings with Latin collation", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t1;\r\n", - "CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n", - "\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\n", - "INSERT INTO t1 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t1; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t1;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "f5d3d422-588c-4cc9-9bbd-2664b392b0fb" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t1;\r\nCREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, \r\n\tc2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); \r\nINSERT INTO t1 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t1; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t1;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -213,7 +164,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 16, "data": { "application/vnd.dataresource+json": { @@ -239,11 +189,11 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
88????????
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 16, "data": { "application/vnd.dataresource+json": { @@ -269,32 +219,29 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
816敏捷的棕色狐狸跳
" - } + }, + "metadata": {} } ], "execution_count": 16 }, { "cell_type": "markdown", - "source": [ - "uh-oh data loss on the varchar example. Why?\r\n", - "\r\n", - "varchar is bound to code page enconding, and these code points cannot be found in the Latin code page." - ], - "metadata": { - "azdata_cell_guid": "d77295e2-75eb-487e-861e-ca1634b90740" - } + "source": "uh-oh data loss on the varchar example. Why?\r\n\r\nVarchar is bound to code page encoding by default, and these code points cannot be found in the Latin code page.\r\n\r\nBut why didn't it happen in the nvarchar example? \r\n\r\nThese Chinese characters are double-byte and within the *Basic Multilingual Plane* (BMP), and nvarchar with this non-SC collation encodes in UCS-2 (BMP), not the code page.\r\n\r\nRun the next example:", + "metadata": {} }, { "cell_type": "code", - "source": [ - "SELECT ASCII('敏' COLLATE Latin1_General_100_CI_AI), CHAR(63)\r\n", - "SELECT ASCII('捷' COLLATE Latin1_General_100_CI_AI), CHAR(63)" - ], - "metadata": { - "azdata_cell_guid": "9dd9bce0-c073-42ec-9faa-8ebc142fd025" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nSELECT ASCII('敏' COLLATE Latin1_General_100_CI_AI), CHAR(63);\r\nSELECT ASCII('捷' COLLATE Latin1_General_100_CI_AI), CHAR(63);", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -312,14 +259,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.046" + "text/html": "Total execution time: 00:00:00.017" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 3, + "execution_count": 4, "data": { "application/vnd.dataresource+json": { "schema": { @@ -340,12 +286,12 @@ ] }, "text/html": "
(No column name)(No column name)
63?
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 3, + "execution_count": 4, "data": { "application/vnd.dataresource+json": { "schema": { @@ -366,129 +312,29 @@ ] }, "text/html": "
(No column name)(No column name)
63?
" - } + }, + "metadata": {} } ], - "execution_count": 3 + "execution_count": 4 }, { "cell_type": "markdown", - "source": [ - "But why didn't it happen in the nvarchar example?\r\n", - "\r\n", - "These Chinese characters are double-byte and within the *Basic Multilingual Plane* (BMP)\r\n", - "\r\n", - "nvarchar with this non-SC collation encodes in UCS-2 (BMP), not the code page" - ], - "metadata": { - "azdata_cell_guid": "75416bff-a350-4f27-9de5-7b407b59ac81" - } + "source": "The ASCII function returns the ASCII code value of the leftmost character of a character expression. We know the Latin code page that's chosen can't represent a double-byte character, so it can only read the first byte, which is incorrectly translated to code point 63. Using the CHAR function, we see that the 63 code point is a question mark character. \r\n\r\nRun the next example:", + "metadata": {} }, { "cell_type": "code", - "source": [ - "SELECT UNICODE(N'敏' COLLATE Latin1_General_100_CI_AI), NCHAR(25935)\r\n", - "SELECT UNICODE(N'捷' COLLATE Latin1_General_100_CI_AI), NCHAR(25463)" - ], - "metadata": { - "azdata_cell_guid": "ffed888f-da51-4cad-a88e-b0ccf2a38f10" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nSELECT UNICODE(N'敏' COLLATE Latin1_General_100_CI_AI), NCHAR(25935);\r\nSELECT UNICODE(N'捷' COLLATE Latin1_General_100_CI_AI), NCHAR(25463);", + "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { - "text/html": "(1 row affected)" - }, - "metadata": {} - }, - { - "output_type": "display_data", - "data": { - "text/html": "(1 row affected)" - }, - "metadata": {} - }, - { - "output_type": "display_data", - "data": { - "text/html": "Total execution time: 00:00:00.021" + "text/html": "Commands completed successfully." }, "metadata": {} }, - { - "output_type": "execute_result", - "metadata": {}, - "execution_count": 5, - "data": { - "application/vnd.dataresource+json": { - "schema": { - "fields": [ - { - "name": "(No column name)" - }, - { - "name": "(No column name)" - } - ] - }, - "data": [ - { - "0": "25935", - "1": "敏" - } - ] - }, - "text/html": "
(No column name)(No column name)
25935
" - } - }, - { - "output_type": "execute_result", - "metadata": {}, - "execution_count": 5, - "data": { - "application/vnd.dataresource+json": { - "schema": { - "fields": [ - { - "name": "(No column name)" - }, - { - "name": "(No column name)" - } - ] - }, - "data": [ - { - "0": "25463", - "1": "捷" - } - ] - }, - "text/html": "
(No column name)(No column name)
25463
" - } - } - ], - "execution_count": 5 - }, - { - "cell_type": "markdown", - "source": [ - "Irrespective of collation now. With a Unicode capable data type, collation only sets linguistic algorithms (Compare = sort; Case sensitivity = Upper/Lowercase)" - ], - "metadata": { - "azdata_cell_guid": "d6db32d2-033f-4800-a492-3494b65dbc36" - } - }, - { - "cell_type": "code", - "source": [ - "SELECT UNICODE(N'敏' COLLATE Chinese_PRC_90_CI_AI), NCHAR(25935)\r\n", - "SELECT UNICODE(N'捷' COLLATE Chinese_PRC_90_CI_AI), NCHAR(25463)" - ], - "metadata": { - "azdata_cell_guid": "ba6107ed-50d8-4e3f-8e59-3eb1cb56e983" - }, - "outputs": [ { "output_type": "display_data", "data": { @@ -506,14 +352,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.039" + "text/html": "Total execution time: 00:00:00.024" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 9, + "execution_count": 5, "data": { "application/vnd.dataresource+json": { "schema": { @@ -534,12 +379,12 @@ ] }, "text/html": "
(No column name)(No column name)
25935
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 9, + "execution_count": 5, "data": { "application/vnd.dataresource+json": { "schema": { @@ -560,38 +405,26 @@ ] }, "text/html": "
(No column name)(No column name)
25463
" - } + }, + "metadata": {} } ], - "execution_count": 9 + "execution_count": 5 }, { "cell_type": "markdown", - "source": [ - "## Now test Chinese character strings with Chinese collation" - ], - "metadata": { - "azdata_cell_guid": "041d9858-808d-4a6b-9bc7-302feddf4036" - } + "source": "Works irrespective of collation now. By adding the N prefix we force the use of a [Unicode constant](https://docs.microsoft.com/sql/t-sql/data-types/constants-transact-sql#unicode-strings), and collation only sets linguistic algorithms (Compare = sort; Case sensitivity = Upper/Lowercase), not the encoding. Using the UNICODE function, we can correctly identify the code points for the string characters, which the NCHAR function can represent accurately.", + "metadata": {} + }, + { + "cell_type": "markdown", + "source": "## Now test Chinese character strings with Chinese collation", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI, \r\n", - "\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI); \r\n", - "INSERT INTO t2 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "d8fecb5c-9120-46b5-b34c-d75fc8664a80" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI, \r\n\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI); \r\nINSERT INTO t2 VALUES (N'敏捷的棕色狐狸跳', N'敏捷的棕色狐狸跳') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -623,7 +456,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 17, "data": { "application/vnd.dataresource+json": { @@ -649,11 +481,11 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
816敏捷的棕色狐狸跳
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 17, "data": { "application/vnd.dataresource+json": { @@ -679,57 +511,31 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
816敏捷的棕色狐狸跳
" - } + }, + "metadata": {} } ], "execution_count": 17 }, { "cell_type": "markdown", - "source": [ - "Now the varchar example is correct. But there's 2 bytes per character?...\r\n", - "\r\n", - "**Myth buster:** code page defines string length for varchar. It's not always 1 byte per character. \r\n", - "\r\n", - "Wasn't East-Asian 3 bytes? Yes, on UTF-8, but under Chinese collation code page, they are encoded using 2 bytes just like UCS-2/UTF-16\r\n", - "" - ], - "metadata": { - "azdata_cell_guid": "0bb36f33-1fb1-499e-97a9-a071f5332eba" - } + "source": "Now the varchar example is correct because the code page can recognize Chinese characters. But there's 2 bytes per character, not 3?...\r\n\r\n**Myth buster:** code page defines string length for varchar. Varchar is **not** always 1 byte per character. \r\n\r\nOk, but wasn't East-Asian 3 bytes? Yes, with UTF-8, but under Chinese collation code page, they are encoded using 2 bytes just like UCS-2/UTF-16\r\n", + "metadata": {} }, { "cell_type": "markdown", - "source": [ - "## Test with Supplementary Characters (4 bytes)" - ], - "metadata": { - "azdata_cell_guid": "cdc78270-6de2-4bb9-9c49-8ac7aae92b8b" - } + "source": "## Test with Supplementary Characters (4 bytes)", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n", - "\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\n", - "INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "c8fa69ca-590b-414c-88eb-d4892816d324" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n\tc2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\nINSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "error", - "evalue": "Msg 2628, Level 16, State 1, Line 4\r\nString or binary data would be truncated in table 'master.dbo.t2', column 'c2'. Truncated value: '👶👦👧👨'.", "ename": "", + "evalue": "Msg 2628, Level 16, State 1, Line 4\r\nString or binary data would be truncated in table 'master.dbo.t2', column 'c2'. Truncated value: '👶👦👧👨'.", "traceback": [] }, { @@ -762,7 +568,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 20, "data": { "application/vnd.dataresource+json": { @@ -782,11 +587,11 @@ "data": [] }, "text/html": "
varchar LENvarchar DATALENGTHc1
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 20, "data": { "application/vnd.dataresource+json": { @@ -806,38 +611,21 @@ "data": [] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
" - } + }, + "metadata": {} } ], "execution_count": 20 }, { "cell_type": "markdown", - "source": [ - "uh-oh, let's set the proper data type length" - ], - "metadata": { - "azdata_cell_guid": "0c643441-2b73-4880-82d7-0b019c14416c" - } + "source": "uh-oh, let's set the proper data type length from 8 to 16 byte-pairs (so a 32-byte encoding limit)", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n", - "\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\n", - "INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "ba341c74-d2ca-4477-82f2-0c39bcc38af7" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, \r\n\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\nINSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -869,7 +657,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 21, "data": { "application/vnd.dataresource+json": { @@ -895,11 +682,11 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
1616????????????????
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 21, "data": { "application/vnd.dataresource+json": { @@ -925,40 +712,29 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
832👶👦👧👨👩👴👵👨
" - } + }, + "metadata": {} } ], "execution_count": 21 }, { "cell_type": "markdown", - "source": [ - "\r\n", - "Varchar still doesn't encode? " - ], - "metadata": { - "azdata_cell_guid": "d062a6e7-2a91-48d4-b81b-0bfb530df450" - } + "source": "Nvarchar looks good. But varchar still doesn't encode? \r\n\r\nSet a larger data type length. For example double from 24 to 48 bytes. Now try again:", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t2;\r\n", - "CREATE TABLE t2 (c1 varchar(48) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC_UTF8, \r\n", - "\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\n", - "INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\n", - "SELECT LEN(c1) AS [varchar LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\n", - "FROM t2; \r\n", - "SELECT LEN(c2) AS [nvarchar LEN], \r\n", - "\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\n", - "FROM t2;\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "d8082437-485c-4c9d-84ca-16acd6e63849" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t2;\r\nCREATE TABLE t2 (c1 varchar(48) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC_UTF8, \r\n\tc2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); \r\nINSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') \r\nSELECT LEN(c1) AS [varchar LEN], \r\n\tDATALENGTH(c1) AS [varchar DATALENGTH], c1\r\nFROM t2; \r\nSELECT LEN(c2) AS [nvarchar LEN], \r\n\tDATALENGTH(c2) AS [nvarchar DATALENGTH], c2 \r\nFROM t2;\r\nGO", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -983,14 +759,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.071" + "text/html": "Total execution time: 00:00:00.033" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 22, + "execution_count": 3, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1015,12 +790,12 @@ ] }, "text/html": "
varchar LENvarchar DATALENGTHc1
832👶👦👧👨👩👴👵👨
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 22, + "execution_count": 3, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1045,36 +820,21 @@ ] }, "text/html": "
nvarchar LENnvarchar DATALENGTHc2
832👶👦👧👨👩👴👵👨
" - } + }, + "metadata": {} } ], - "execution_count": 22 + "execution_count": 3 }, { "cell_type": "markdown", - "source": [ - "Finally!\r\n", - "\r\n", - "What if I needed all these in one database? Easy, I could just use nvarchar." - ], - "metadata": { - "azdata_cell_guid": "544ee63a-67fa-4b24-b974-4fa4e809949c" - } + "source": "Finally!\r\n\r\nWhat if I needed all these characters in one database? Easy, I could just use nvarchar which encodes in UTF-16.", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t3;\r\n", - "CREATE TABLE t3 (c1 nvarchar(110) COLLATE Latin1_General_100_CI_AI_SC); \r\n", - "INSERT INTO t3 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\n", - "SELECT LEN(c1) AS [nvarchar UTF16 LEN], \r\n", - "\tDATALENGTH(c1) AS [nvarchar UTF16 DATALENGTH], c1\r\n", - "FROM t3; \r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "87e6c383-d9ab-48da-a4d7-f1cc0cf3aee3" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t3;\r\nCREATE TABLE t3 (c1 nvarchar(110) COLLATE Latin1_General_100_CI_AI_SC); \r\nINSERT INTO t3 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\nSELECT LEN(c1) AS [nvarchar UTF16 LEN], \r\n\tDATALENGTH(c1) AS [nvarchar UTF16 DATALENGTH], c1\r\nFROM t3; \r\nGO", + "metadata": {}, "outputs": [ { "output_type": "display_data", @@ -1099,7 +859,6 @@ }, { "output_type": "execute_result", - "metadata": {}, "execution_count": 23, "data": { "application/vnd.dataresource+json": { @@ -1125,35 +884,29 @@ ] }, "text/html": "
nvarchar UTF16 LENnvarchar UTF16 DATALENGTHc1
65134MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦
" - } + }, + "metadata": {} } ], "execution_count": 23 }, { "cell_type": "markdown", - "source": [ - "But the majority of my data is set to Latin (ASCII)" - ], - "metadata": { - "azdata_cell_guid": "808dc693-ca7b-4ee5-b71f-9cf9cbcef31f" - } + "source": "But wait. The majority of my data is set to Latin (ASCII), can we do better?", + "metadata": {} }, { "cell_type": "code", - "source": [ - "DROP TABLE IF EXISTS t4;\r\n", - "CREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC); \r\n", - "INSERT INTO t4 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\n", - "SELECT LEN(c1) AS [varchar UTF16 LEN], \r\n", - "\tDATALENGTH(c1) AS [varchar UTF16 DATALENGTH], c1\r\n", - "FROM t4; \r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "8597dfb2-ec28-4c82-865a-ec7a8d01c663" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nDROP TABLE IF EXISTS t4;\r\nCREATE TABLE t4 (c1 varchar(110) COLLATE Latin1_General_100_CI_AI_SC_UTF8); \r\nINSERT INTO t4 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦') \r\nSELECT LEN(c1) AS [varchar UTF8 LEN], \r\n\tDATALENGTH(c1) AS [varchar UTF8 DATALENGTH], c1\r\nFROM t4; \r\nGO", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -1171,23 +924,22 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.013" + "text/html": "Total execution time: 00:00:00.253" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 24, + "execution_count": 1, "data": { "application/vnd.dataresource+json": { "schema": { "fields": [ { - "name": "varchar UTF16 LEN" + "name": "varchar UTF8 LEN" }, { - "name": "varchar UTF16 DATALENGTH" + "name": "varchar UTF8 DATALENGTH" }, { "name": "c1" @@ -1196,42 +948,36 @@ }, "data": [ { - "0": "67", - "1": "67", - "2": "MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii????????????" + "0": "65", + "1": "87", + "2": "MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦" } ] }, - "text/html": "
varchar UTF16 LENvarchar UTF16 DATALENGTHc1
6767MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii????????????
" - } + "text/html": "
varchar UTF8 LENvarchar UTF8 DATALENGTHc1
6587MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii敏捷的棕色狐狸跳👶👦
" + }, + "metadata": {} } ], - "execution_count": 24 + "execution_count": 1 }, { "cell_type": "markdown", - "source": [ - "Where are the savings?" - ], - "metadata": { - "azdata_cell_guid": "e8d09b41-c69d-43de-8b67-43ad7e25bb03" - } + "source": "With this data pattern the savings are obvious. Where are the savings? Let's compare breaking down to individual Latin, Chinese, and Emoji strings.", + "metadata": {} }, { "cell_type": "code", - "source": [ - "SELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], \r\n", - "\tDATALENGTH(N'敏捷的棕色狐狸跳') AS [Chinese_UTF16_2bytes], \r\n", - "\tDATALENGTH(N'👶👦') AS [SC_UTF16_4bytes]\r\n", - "SELECT DATALENGTH('MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Latin_UTF8_1byte], \r\n", - "\tDATALENGTH('敏捷的棕色狐狸跳' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Chinese_UTF8_3bytes], \r\n", - "\tDATALENGTH('👶👦' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes]\r\n", - "GO" - ], - "metadata": { - "azdata_cell_guid": "79351524-1cba-412a-8111-2cc93871612d" - }, + "source": "USE UnicodeDatabase\r\nGO\r\nSELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], \r\n\tDATALENGTH(N'敏捷的棕色狐狸跳') AS [Chinese_UTF16_2bytes], \r\n\tDATALENGTH(N'👶👦') AS [SC_UTF16_4bytes]\r\nSELECT DATALENGTH('MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Latin_UTF8_1byte], \r\n\tDATALENGTH('敏捷的棕色狐狸跳' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [Chinese_UTF8_3bytes], \r\n\tDATALENGTH('👶👦' COLLATE Latin1_General_100_CI_AI_SC_UTF8) AS [SC_UTF8_4bytes]\r\nGO", + "metadata": {}, "outputs": [ + { + "output_type": "display_data", + "data": { + "text/html": "Commands completed successfully." + }, + "metadata": {} + }, { "output_type": "display_data", "data": { @@ -1249,14 +995,13 @@ { "output_type": "display_data", "data": { - "text/html": "Total execution time: 00:00:00.043" + "text/html": "Total execution time: 00:00:00.024" }, "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 25, + "execution_count": 2, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1281,12 +1026,12 @@ ] }, "text/html": "
Latin_UTF16_2bytesChinese_UTF16_2bytesSC_UTF16_4bytes
110168
" - } + }, + "metadata": {} }, { "output_type": "execute_result", - "metadata": {}, - "execution_count": 25, + "execution_count": 2, "data": { "application/vnd.dataresource+json": { "schema": { @@ -1305,16 +1050,17 @@ "data": [ { "0": "55", - "1": "8", - "2": "4" + "1": "24", + "2": "8" } ] }, - "text/html": "
Latin_UTF8_1byteChinese_UTF8_3bytesSC_UTF8_4bytes
5584
" - } + "text/html": "
Latin_UTF8_1byteChinese_UTF8_3bytesSC_UTF8_4bytes
55248
" + }, + "metadata": {} } ], - "execution_count": 25 + "execution_count": 2 } ] } \ No newline at end of file diff --git a/samples/manage/README.md b/samples/manage/README.md index 9ddaf4fb3c..8b6072e327 100644 --- a/samples/manage/README.md +++ b/samples/manage/README.md @@ -8,13 +8,12 @@ This includes samples for setting up Azure Automation and exporting your databas ## Collect and monitor resource usage data across multiple pools in a subscription This Solution Quick Start provides a solution for collecting and monitoring Azure SQL Database resource usage across multiple pools in a subscription. When you have a large number of databases in a subscription, it is cumbersome to monitor each elastic pool separately. To solve this, you can combine SQL database PowerShell cmdlets and T-SQL queries to collect resource usage data from multiple pools and their databases for monitoring and analysis of resource usage. -[Manage Mulitiple Elastic Pools in SQL Database Using PowerShell and Power BI](/~https://github.com/Microsoft/sql-server-samples/tree/master/samples/manage/azure-sql-db-elastic-pools) in the GitHub SQL Server samples repository provides a set of powershell scripts and T-SQL queries along with documentation on what it does and how to use it. +[Manage Multiple Elastic Pools in SQL Database Using PowerShell and Power BI](/~https://github.com/Microsoft/sql-server-samples/tree/master/samples/manage/azure-sql-db-elastic-pools) in the GitHub SQL Server samples repository provides a set of powershell scripts and T-SQL queries along with documentation on what it does and how to use it. ## Get started using Elastic Pools in a SaaS scenario -This Solution Quick Start provides a solution for a Softwware-as-a-Solution (SaaS) scenario that leverages Elastic Pools to provide a cost-effective, scalable database back-end of a SaaS application. In this solution, you will walk-though the implementation of a web app that lets you visualize the load created on an Elastic Pool by a load generator using a custom dashboard that supplements the Azure Portal. +This Solution Quick Start provides a solution for a Software-as-a-Solution (SaaS) scenario that leverages Elastic Pools to provide a cost-effective, scalable database back-end of a SaaS application. In this solution, you will walk-though the implementation of a web app that lets you visualize the load created on an Elastic Pool by a load generator using a custom dashboard that supplements the Azure Portal. [saas-scenario-with-elastic-pools](/~https://github.com/Microsoft/sql-server-samples/tree/master/samples/manage/azure-sql-db-elastic-pools-custom-dashboard) in the GitHub SQL Server samples repository provides a load generator and monitoring web app along with the documentation on what it does and how to use it. ## Windows Containers -This includes samples for setting up mssql-server in Windows Containers. Currently it includes the following: -- __[windows-containers] (windows-containers/)__ +This includes samples for setting up mssql-server in Windows Containers. Currently it only includes a link to the separately maintained [mssql-docker](/~https://github.com/Microsoft/mssql-docker/blob/master/windows/README.md) instructions. diff --git a/samples/manage/azure-arc-enabled-sql-server/README.md b/samples/manage/azure-arc-enabled-sql-server/README.md new file mode 100644 index 0000000000..b0aa6a5f51 --- /dev/null +++ b/samples/manage/azure-arc-enabled-sql-server/README.md @@ -0,0 +1,30 @@ +--- +services: Azure Arc enabled SQL Server +platforms: Azure +author: anosov1960 +ms.author: sashan +ms.date: 12/08/2020 +--- + +# Running the script using Cloud Shell + +Use the following steps to migrate your existing SQL Server - Azure Arc resources from Microsoft.AzureData namespace to Microsoft.AzureArcData namespace. + +1. Launch the [Cloud Shell](https://shell.azure.com/). For details, [read more about PowerShell in Cloud Shell](https://aka.ms/pscloudshell/docs). + +2. Upload the script to the shell using the following command: + + ```console + curl https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 -o migrate-to-azure-arc-data.ps1 + ``` + +3. Run the script. + + ```console + ./migrate-to-azure-arc-data.ps1 + ``` + +> [!NOTE] +> - To paste the commands into the shell, use `Ctrl-Shift-V` on Windows or `Cmd-v` on MacOS. +> - The script will be uploaded directly to the home folder associated with your Cloud Shell session. +> - The script will prompt for the resource group name and print a message when migration is completed. diff --git a/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 b/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 new file mode 100644 index 0000000000..a4521a1d4b --- /dev/null +++ b/samples/manage/azure-arc-enabled-sql-server/migrate-to-azure-arc-data.ps1 @@ -0,0 +1,50 @@ +# ---------------------------------------------------------------------------------- +# +# Copyright Microsoft Corporation +# 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 +# http://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. +# --------------------------------------------------------------------------------- +# +# Sample script for migrating the existing SQL Server - Azure Arc resources from Microsoft.AzureData namespace to Microsoft.AzureArcData namespace +# within a single Resource Group +# + +$ResourceGroup=read-host -Prompt "Enter Resource Group Name" + +$SqlArcResources = Get-AzResource -ExpandProperties -ResourceType Microsoft.AzureData/sqlServerInstances -ResourceGroupName $ResourceGroup +foreach ($r in $SqlArcResources) { + Write-Host ("Migrating resource: {0}" -f $r.Name) + + if ( ! ($r.Properties.containerResourceId -match "Microsoft.HybridCompute/machines") ) { + $arcResource = Get-AzResource -ResourceType Microsoft.HybridCompute/machines -Name $r.Properties.containerResourceId + if($null -eq $arcResource) { + Write-Warning ("Could not locate the Machine - Azure Arc resource associated with this SQL Server Instance. You should manually un-register and re-register this instance.") + continue + } else { + $r.Properties.containerResourceId = $arcResource.ResourceId + } + } + + if( $null -ne $r.Properties.tcpPorts ){ + Write-Warning "The property `"tcpPorts`" has been renamed to `"tcpStaticPorts`". The property name will be updated during resource migration." + $r.Properties | Add-Member -MemberType NoteProperty -Name "tcpStaticPorts" -Value $r.Properties.tcpPorts + $r.Properties.psobject.properties.remove("tcpPorts") + } + + if( $null -ne $r.Properties.createTime ){ + Write-Warning "There is a known bug in the createTime property. This property will be removed during resource migration." + $r.Properties.psobject.properties.remove("createTime") + } + + New-AzResource -ResourceName $r.Name -Location $r.Location -Properties $r.Properties -ResourceGroupName $r.ResourceGroupName ` + -ResourceType Microsoft.AzureArcData/sqlServerInstances -Force +} + +Write-Host "Namespace migration completed for SQL Server - Azure Arc resources." diff --git a/samples/manage/azure-hybrid-benefit/README.md b/samples/manage/azure-hybrid-benefit/README.md new file mode 100644 index 0000000000..b48286bf38 --- /dev/null +++ b/samples/manage/azure-hybrid-benefit/README.md @@ -0,0 +1,61 @@ +--- +services: Azure SQL +platforms: Azure +author: anosov1960 +ms.author: sashan +ms.date: 12/17/2020 +--- + +# Overview + +This script is provided to help you manage the SQL Server licenses that are consumed by the SQL Servers deployed to Azure. The script writes the results to a `sql-license-usage.csv` file. If the file with this name already exists, the new results will be appended to it. The report includes the following information for each scanned subscription as well as the totals for each category. +| **Category** | **Description** | +|:--|:--| +|Date|Date of the scan| +|Time|Time of the scan| +|Subscription name|The name of the subscription| +|Subscription ID|The unique subscription ID| +|AHB Std vCores|Total vCores used by General Purpose service tier or SQL Server Standard edition billed with AHB discount| +|AHB Ent vCores|Total vCores used by Business Critical service tier or SQL Server Enterprise edition billed with AHB discount| +|PAYG Std vCores|Total vCores used by General Purpose service tier or SQL Server Standard edition billed at full price| +|PAYG Ent vCores|Total vCores used by Business Critical service tier or SQL Server Enterprise edition billed at full price| +|HADR Std vCores|Total vCores used by HADR replicas running SQL Server Standard edition| +|HADR Ent vCores|Total vCores used by HADR replicas running SQL Server Enterprise edition| +|Developer vCores|Total vCores used by SQL Server Developer edition| +|Express vCores|Total vCores used by SQL Server Express edition| + +>[!NOTE] +> - The usage data is a snapshot at the time of the script execution based on the size of the deployed SQL resources in vCores. +> - For IaaS workloads, such as SQL Server in Virtual Machines or SSIS integration runtimes, each vCPU is counted as one vCore. +> - For PaaS workloads, each vCore of Business Critical service tier is counted as one Enterprise vCore and each vCore of General Purpose service tier is counted as one Standard vCore. + +# Running the script using Cloud Shell + +Use the following steps to calculate the SQL Server license usage: + +1. Launch the [Cloud Shell](https://shell.azure.com/). For details, read [PowerShell in Cloud Shell](https://aka.ms/pscloudshell/docs). + +2. Upload the script to the shell using the following command: + + ```console + curl https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 -o sql-license-usage.ps1 + ``` + +3. Run the script with a specific subscriptions ID or the file name as the parameter. The file should be used if you need to scan a subset of the subscriptions. If the parameter is not specified, the script will scan all the subscriptions in your account. + + ```console + ./sql-license-usage.ps1 or .csv + ``` + +If the a file is specified, it must be a `.csv` file with the list of subscriptions. To create a file containing all subscriptions in your account, use the following command. You can then edit the file to remove the subscriptions you don't want to scan. + + ```console + Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation + ``` +> [!NOTE] +> - To paste the commands into the shell, use `Ctrl-Shift-V` on Windows or `Cmd-v` on MacOS. +> - The `curl` command will copy the script directly to the home folder associated with your Cloud Shell session. + +# Tracking SQL license usage over time + +You can track your license utilization over time by periodically running this script. Each new scan will add the results to `sql-license-usage.csv`, which you can use for reporting the license usage over time in Excel or other tools. To run this script on schedule using Azure automation, read [Create a PowerShell runbook tutorial](https://docs.microsoft.com/azure/automation/learn/automation-tutorial-runbook-textual-powershell). diff --git a/samples/manage/azure-hybrid-benefit/ahb-usage-in-subscription.ps1 b/samples/manage/azure-hybrid-benefit/ahb-usage-in-subscription.ps1 new file mode 100644 index 0000000000..1ddf88650b --- /dev/null +++ b/samples/manage/azure-hybrid-benefit/ahb-usage-in-subscription.ps1 @@ -0,0 +1,112 @@ +# ---------------------------------------------------------------------------------- +# +# Copyright Microsoft Corporation +# 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 +# http://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. +# --------------------------------------------------------------------------------- +# +# This script calculates the usage of different types of SQL Server licenses by the SQL resources +# in the specific subscriptions. +# +# NOTE: +# 1. The script requires a .csv file with the list of subscriptions. Use Export-Csv comlet to create the file. +# 2. SQL Database resources that use the DTU based business model are excluded. +# + +# Set the subscription Id +$SubcriptionId = read-host -Prompt "Enter Subscription ID" +Set-AzContext -SubscriptionId $SubcriptionId + +# Variables to keep track of SQL VMs and VCPUs count +$total_std_vcores = 0 +$total_ent_vcores = 0 + +#Get all SQL databases in the subscription +$databases = Get-AzSqlServer | Get-AzSqlDatabase + +# Get the databases with License Included and add to VCore count +foreach ($db in $databases){ + if (($db.SkuName -ne "ElasticPool") -and ($db.LicenseType -eq "LicenseIncluded")) { + if ($db.Edition -eq "BusinessCritical") { + $total_ent_vcores += $db.Capacity + } elseif ($db.Edition -eq "GeneralPurpose") { + $total_std_vcores += $db.Capacity + } + } +} + +#Get all SQL elastic pools in the subscription +$pools = Get-AzSqlServer | Get-AzSqlElasticPool + +# Get the elastic pools with License Included and and add to VCore count +foreach ($pool in $pools){ + if ($pool.LicenseType -eq "LicenseIncluded") { + if ($pool.Edition -eq "BusinessCritical") { + $total_ent_vcores += $pool.Capacity + } elseif ($pool.Edition -eq "GeneralPurpose") { + $total_std_vcores += $pool.Capacity + } + } +} + +#Get all SQL managed instances in the subscription +$instances = Get-AzSqlInstance + +# Get the SQL managed instances with License Included and add to VCore count +foreach ($ins in $instances){ + if (($ins.InstancePoolName -eq $null) -and ($ins.LicenseType -eq "LicenseIncluded")) { + if ($ins.Sku.Tier -eq "BusinessCritical") { + $total_ent_vcores += $ins.VCores + } elseif ($ins.Sku.Tier -eq "GeneralPurpose") { + $total_std_vcores += $ins.VCores + } + } +} + +#Get all instance pools in the subscription +$ipools = Get-AzSqlInstancePool + +# Get the instance pools with License Included and add to VCore count +foreach ($ip in $ipools){ + if ($ip.LicenseType -eq "LicenseIncluded") { + if ($ip.Edition -eq "BusinessCritical") { + $total_ent_vcores += $ip.VCores + } elseif ($ip.Edition -eq "GeneralPurpose") { + $total_std_vcores += $ip.VCores + } + } +} + +#Get All Sql VMs with AHB license configured +$sql_vms= Get-AzSqlVM | where {$_.LicenseType.Contains("AHUB")} + +# Get the VM size, match it with the corresponding VCPU count and add to VCore count +foreach ($sql_vm in $sql_vms){ + $vm = Get-AzVm -Name $sql_vm.Name -ResourceGroupName $sql_vm.ResourceGroupName + $vm_size = $vm.HardwareProfile.VmSize + # Select first size and get the VCPus available + $size_info = Get-AzComputeResourceSku | where {$_.ResourceType.Contains('virtualMachines') -and $_.Name -like $vm_size} | Select-Object -First 1 + # Save the VCPU count + $vcpu= $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} + + if ($vcpu){ + $data = [pscustomobject]@{vm_resource_uri=$vm.Id;sku=$sql_vm.Sku;size=$vm_size;vcpus=$vcpu.value} + $array += $data + + if ($data.sku -like "Enterprise"){ + $total_ent_vcores += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $total_std_vcores += $data.vcpus + } + } +} + +Write-Host "Total number of VCores for SQL Enterprise: " $total_ent_vcores +Write-Host "Total number of VCores for SQL Standard: " $total_std_vcores \ No newline at end of file diff --git a/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 b/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 new file mode 100644 index 0000000000..24452f640b --- /dev/null +++ b/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 @@ -0,0 +1,263 @@ +# ---------------------------------------------------------------------------------- +# +# Copyright Microsoft Corporation +# 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 +# http://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. +# --------------------------------------------------------------------------------- +# +# Sample script to calculate the consolidated SQL Server license usage by all of the SQL resources in a specific subscription or the entire the account. +# +# This script accepts a .csv file or a subscription ID as a parameter. The file must include a list of subscriptions to be scanned for the license usage. You can create +# such a file by the following command and then edit to remove the subscriptions you don't want to scan: +# > Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation +# +# If no parameter is provided, the script will prompt for a file or subscriptiobn ID. If no value is provided, the scipt will scan all the subscriptions you account +# has access to. +# +# +# NOTE: The script does not calculate usage for Azure SQL resources that use the DTU-based purchasing model +# + +# Subscriptions to scan + +if ($args[0] -like "*.csv") { + $subscriptions = Import-Csv $args[0] +}elseif($args[0] -ne $null){ + $subscriptions = [PSCustomObject]@{SubscriptionId = $args[0]} | Get-AzSubscription +}else{ + $subscriptions = Get-AzSubscription +} + + +#Initialize tables and arrays + +[System.Collections.ArrayList]$usage = @() +if ($includeEC -eq $null){ + $usage += ,(@("Date", "Time", "Subscription Name", "Subscription ID", "AHB Std vCores", "AHB Ent vCores", "PAYG Std vCores", "PAYG Ent vCores", "HADR Std vCores", "HADR Ent vCores", "Developer vCores", "Express vCores")) +}else{ + $usage += ,(@("Date", "Time", "Subscription Name", "Subscription ID", "AHB ECs", "PAYG ECs", "AHB Std vCores", "AHB Ent vCores", "PAYG Std vCores", "PAYG Ent vCores", "HADR Std vCores", "HADR Ent vCores", "Developer vCores", "Express vCores")) +} + +$subtotal = [pscustomobject]@{ahb_std=0; ahb_ent=0; payg_std=0; payg_ent=0; hadr_std=0; hadr_ent=0; developer=0; express=0} +$total = [pscustomobject]@{} +$subtotal.psobject.properties.name | %{$total | Add-Member -MemberType NoteProperty -Name $_ -Value 0} + +#Save the VM SKU table for future use + +$VM_SKUs = Get-AzComputeResourceSku + +Write-Host ([Environment]::NewLine + "-- Scanning subscriptions --") + +# Calculate usage for each subscription + +foreach ($sub in $subscriptions){ + + if ($sub.State -ne "Enabled") {continue} + + try { + Set-AzContext -SubscriptionId $sub.Id + }catch { + write-host "Invalid subscription: " $sub.Id + {continue} + } + + # Reset the subtotals + $subtotal.psobject.properties.name | %{$subtotal.$_ = 0} + + #Get all logical servers + $servers = Get-AzSqlServer + + #Get all SQL database resources in the subscription + $databases = $servers | Get-AzSqlDatabase + + # Process the vCore-based databases + foreach ($db in $databases ){ + if ($db.SkuName -eq "ElasticPool") {continue} + + if ($db.LicenseType -eq "LicenseIncluded") { + if ($db.Edition -eq "BusinessCritical") { + $subtotal.ahb_ent += $db.Capacity + } elseif ($db.Edition -eq "GeneralPurpose") { + $subtotal.ahb_std += $db.Capacity + } + }else{ + if ($db.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $db.Capacity + } elseif ($db.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $db.Capacity + } + } + } + + #Get all SQL elastic pool resources in the subscription + $pools = $servers | Get-AzSqlElasticPool + + # Process the vCore-based elastic pools + foreach ($pool in $pools){ + if ($pool.LicenseType -eq "LicenseIncluded") { + if ($pool.Edition -eq "BusinessCritical") { + $subtotal.ahb_ent += $pool.Capacity + } elseif ($pool.Edition -eq "GeneralPurpose") { + $subtotal.ahb_std += $pool.Capacity + } + }else{ + if ($pool.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $pool.Capacity + } elseif ($pool.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $pool.Capacity + } + } + } + + #Get all SQL managed instance resources in the subscription + $instances = Get-AzSqlInstance + + # Process the SQL managed instances with License Included and add to VCore count + foreach ($ins in $instances){ + if ($ins.InstancePoolName -eq $null){ + if ($ins.LicenseType -eq "LicenseIncluded") { + if ($ins.Sku.Tier -eq "BusinessCritical") { + $subtotal.ahb_ent += $ins.VCores + } elseif ($ins.Sku.Tier -eq "GeneralPurpose") { + $subtotal.ahb_std += $ins.VCores + } + }else{ + if ($ins.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $pool.Capacity + } elseif ($ins.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $ins.Capacity + } + } + } + } + + #Get all instance pool resources in the subscription + $ipools = Get-AzSqlInstancePool + + # Process the instance pools + foreach ($ip in $ipools){ + if ($ip.LicenseType -eq "LicenseIncluded") { + if ($ip.Edition -eq "BusinessCritical") { + $subtotal.ahb_ent += $ip.VCores + } elseif ($ip.Edition -eq "GeneralPurpose") { + $subtotal.ahb_std += $ip.VCores + } + }else{ + if ($ip.Edition -eq "BusinessCritical") { + $subtotal.payg_ent += $ip.Capacity + } elseif ($ip.Edition -eq "GeneralPurpose") { + $subtotal.payg_std += $ip.Capacity + } + } + } + + + #Get all SSIS imtegration runtime resources in the subscription + $ssis_irs = Get-AzResourceGroup | Get-AzDataFactoryV2 | Get-AzDataFactoryV2IntegrationRuntime + + # Get the VM size, match it with the corresponding VCPU count and add to VCore count + foreach ($ssis_ir in $ssis_irs){ + # Select first size and get the VCPus available + $size_info = $VM_SKUs | where { $_.Name -like $ssis_ir.NodeSize} | Select-Object -First 1 + + # Save the VCPU count + $vcpu= $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} + + if ($ssis_ir.State -eq "Started"){ + if ($ssis_ir.LicenseType -like "LicenseIncluded"){ + if ($ssis_ir.Edition -like "Enterprise"){ + $subtotal.ahb_ent += $vcpu.value + }elseif ($ssis_ir.Edition -like "Standard"){ + $subtotal.ahb_std += $vcpu.value + } + }elseif ($data.license -like "BasePrice"){ + if ($ssis_ir.Edition -like "Enterprise"){ + $subtotal.payg_ent += $vcpu.value + }elseif ($ssis_ir.Edition -like "Standard"){ + $subtotal.payg_std += $vcpu.value + }elseif ($ssis_ir.Edition -like "Developer"){ + $subtotal.developer += $vcpu.value + }elseif ($ssis_ir.Edition -like "Express"){ + $subtotal.express += $vcpu.value + } + } + } + } + + + #Get All SQL VMs resources in the subscription + $sql_vms = Get-AzSqlVM + + # Get the VM size, match it with the corresponding VCPU count and add to VCore count + foreach ($sql_vm in $sql_vms){ + $vm = Get-AzVm -Name $sql_vm.Name -ResourceGroupName $sql_vm.ResourceGroupName + $vm_size = $vm.HardwareProfile.VmSize + # Select first size and get the VCPus available + $size_info = $VM_SKUs | where {$_.ResourceType.Contains('virtualMachines') -and $_.Name -like $vm_size} | Select-Object -First 1 + # Save the VCPU count + $vcpu= $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} + + if ($vcpu){ + $data = [pscustomobject]@{vm_resource_uri=$vm.Id;sku=$sql_vm.Sku;license=$sql_vm.LicenseType;size=$vm_size;vcpus=$vcpu.value} + + if ($data.license -like "DR"){ + if ($data.sku -like "Enterprise"){ + $subtotal.hadr_ent += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $subtotal.hadr_std += $data.vcpus + } + }elseif ($data.license -like "AHUB"){ + if ($data.sku -like "Enterprise"){ + $subtotal.ahb_ent += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $subtotal.ahb_std += $data.vcpus + } + }elseif ($data.license -like "PAYG"){ + if ($data.sku -like "Enterprise"){ + $subtotal.payg_ent += $data.vcpus + }elseif ($data.sku -like "Standard"){ + $subtotal.payg_std += $data.vcpus + }elseif ($data.sku -like "Developer"){ + $subtotal.developer += $data.vcpus + }elseif ($data.sku -like "Express"){ + $subtotal.express += $data.vcpus + } + } + } + } + + # Increment the totals and add subtotals to the usage array + + $subtotal.psobject.properties.name | %{$total.$_ += $subtotal.$_} + + if ($includeEC -eq $null){ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), $sub.Name, $sub.Id, $subtotal.ahb_std, $subtotal.ahb_ent, $subtotal.payg_std, $subtotal.payg_ent, $subtotal.hadr_std, $subtotal.hadr_ent, $subtotal.developer, $subtotal.express)) + }else{ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), $sub.Name, $sub.Id, ($subtotal.ahb_std + $subtotal.ahb_ent*4), ($subtotal.payg_std + $subtotal.payg_ent*4), $subtotal.ahb_std, $subtotal.ahb_ent, $subtotal.payg_std, $subtotal.payg_ent, $subtotal.hadr_std, $subtotal.hadr_ent, $subtotal.developer, $subtotal.express)) + } +} + +# Add the total numbers to the usage array + +if ($includeEC -eq $null){ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), "Total", $null, $total.ahb_std, $total.ahb_ent, $total.payg_std, $total.payg_ent, $total.hadr_std, $total.hadr_ent, $total.developer, $total.express)) +}else{ + $usage += ,(@((Get-Date -Format d), (Get-Date -Format t), "Total", $null, ($total.ahb_std + $total.ahb_ent*4), ($total.payg_std + $total.payg_ent*4), $total.ahb_std, $total.ahb_ent, $total.payg_std, $total.payg_ent, $total.hadr_std, $total.hadr_ent, $total.developer, $total.express)) +} + +# Append to '.\sql-license-usage.csv' + +$table = ConvertFrom-Csv ($usage | %{ $_ -join ','} ) +$table | Format-table +#$fileName = '.\sql-license-usage_' + (Get-Date -f yyyy-MM-dd_HH-mm-ss) + '.csv' +$fileName = '.\sql-license-usage.csv' +$table | Export-Csv $fileName -NoTypeInformation -Append + +Write-Host ([Environment]::NewLine + "-- The usage data is saved to " + $fileName + "--") diff --git a/samples/manage/azure-sql-db-managed-instance/attach-jumpbox/attachJumpbox.ps1 b/samples/manage/azure-sql-db-managed-instance/attach-jumpbox/attachJumpbox.ps1 index 252e9c9b71..c0b481832b 100644 --- a/samples/manage/azure-sql-db-managed-instance/attach-jumpbox/attachJumpbox.ps1 +++ b/samples/manage/azure-sql-db-managed-instance/attach-jumpbox/attachJumpbox.ps1 @@ -2,6 +2,7 @@ $parameters = $args[0] $scriptUrlBase = $args[1] $subscriptionId = $parameters['subscriptionId'] +$environmentName = $parameters['environmentName'] $resourceGroupName = $parameters['resourceGroupName'] $virtualMachineName = $parameters['virtualMachineName'] $virtualNetworkName = $parameters['virtualNetworkName'] @@ -9,6 +10,11 @@ $managementSubnetName = $parameters['subnetName'] $administratorLogin = $parameters['administratorLogin'] $administratorLoginPassword = $parameters['administratorLoginPassword'] +if ($environmentName -eq '' -or ($null -eq $environmentName)) { + $environmentName = 'AzureCloud' + Write-Host "Environment: AzureCloud." -ForegroundColor Green +} + if ($virtualMachineName -eq '' -or ($null -eq $virtualMachineName)) { $virtualMachineName = 'Jumpbox' Write-Host "VM Name: 'Jumpbox'." -ForegroundColor Green @@ -59,11 +65,14 @@ function EnsureAzModule { } } -function EnsureLogin () { +function EnsureLogin { + param ( + $environmentName + ) $context = Get-AzContext If ($null -eq $context.Subscription) { Write-Host "Sign-in..." - If ($null -eq (Connect-AzAccount -ErrorAction SilentlyContinue -ErrorVariable Errors)) { + If ($null -eq (Connect-AzAccount -Environment $environmentName -ErrorAction SilentlyContinue -ErrorVariable Errors)) { Write-Host ("Sign-in failed: {0}" -f $Errors[0].Exception.Message) -ForegroundColor Red Break } @@ -180,7 +189,7 @@ function CalculateVpnClientAddressPoolPrefix { VerifyPSVersion EnsureAzModule -EnsureLogin +EnsureLogin -environmentName $environmentName SelectSubscriptionId -subscriptionId $subscriptionId $virtualNetwork = LoadVirtualNetwork -resourceGroupName $resourceGroupName -virtualNetworkName $virtualNetworkName diff --git a/samples/manage/azure-sql-db-managed-instance/attach-vpn-gateway/attachVPNGateway.ps1 b/samples/manage/azure-sql-db-managed-instance/attach-vpn-gateway/attachVPNGateway.ps1 index 84ddb7d4ca..e6d77704bc 100644 --- a/samples/manage/azure-sql-db-managed-instance/attach-vpn-gateway/attachVPNGateway.ps1 +++ b/samples/manage/azure-sql-db-managed-instance/attach-vpn-gateway/attachVPNGateway.ps1 @@ -2,11 +2,17 @@ $parameters = $args[0] $scriptUrlBase = $args[1] $subscriptionId = $parameters['subscriptionId'] +$environmentName = $parameters['environmentName'] $resourceGroupName = $parameters['resourceGroupName'] $virtualNetworkName = $parameters['virtualNetworkName'] $certificateNamePrefix = $parameters['certificateNamePrefix'] $clientCertificatePassword = $parameters['clientCertificatePassword'] #used only when certificates are created using openssl +if ($environmentName -eq '' -or ($null -eq $environmentName)) { + $environmentName = 'AzureCloud' + Write-Host "Environment: AzureCloud." -ForegroundColor Green +} + if ($clientCertificatePassword -eq '' -or ($null -eq $clientCertificatePassword)) { $clientCertificatePassword = 'S0m3Str0nGP@ssw0rd' } @@ -52,11 +58,14 @@ function EnsureAzModule { } } -function EnsureLogin () { +function EnsureLogin { + param ( + $environmentName + ) $context = Get-AzContext If ($null -eq $context.Subscription) { Write-Host "Sign-in..." - If ($null -eq (Connect-AzAccount -ErrorAction SilentlyContinue -ErrorVariable Errors)) { + If ($null -eq (Connect-AzAccount -Environment $environmentName -ErrorAction SilentlyContinue -ErrorVariable Errors)) { Write-Host ("Sign-in failed: {0}" -f $Errors[0].Exception.Message) -ForegroundColor Red Break } @@ -220,9 +229,8 @@ function CreateCertificate() { VerifyPSVersion EnsureAzModule -EnsureLogin +EnsureLogin -environmentName $environmentName SelectSubscriptionId -subscriptionId $subscriptionId - $virtualNetwork = LoadVirtualNetwork -resourceGroupName $resourceGroupName -virtualNetworkName $virtualNetworkName $subnets = $virtualNetwork.Subnets.Name @@ -265,4 +273,4 @@ $templateParameters = @{ New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri ($scriptUrlBase + '/azuredeploy.json?t=' + [DateTime]::Now.Ticks) -TemplateParameterObject $templateParameters -Write-Host "Deployment completed." \ No newline at end of file +Write-Host "Deployment completed." diff --git a/samples/manage/sql-assessment-api/DefaultRuleset.csv b/samples/manage/sql-assessment-api/DefaultRuleset.csv index c593badc6f..d4de2f06a6 100644 --- a/samples/manage/sql-assessment-api/DefaultRuleset.csv +++ b/samples/manage/sql-assessment-api/DefaultRuleset.csv @@ -1,202 +1,182 @@ -id,level,displayName,message,tags,description,helpLink,probes,target.type,target.platform,target.engineEdition,target.version,target.name.not,level,threshold,RetryCountPct -AutoCreateStats,Warning,Auto-Create Statistics should be on,Turn Auto-Create Statistics option on to improve query performance.,"['DefaultRuleset', 'Performance', 'Statistics', 'QueryOptimizer']","The Query Optimizer determines whether an index is useful for a specific query by evaluating the stored statistics. If the statistics become out of date and significant changes have occurred against the underlying data, this can result in less than optimal query performance. In most cases, it's best to let SQL Server maintain the statistics. If you turn 'Auto Create Stats' and 'Auto Update Stats' off, then it is up to you to keep the statistics up-to-date somehow. Failure to do so will lead to poor query performance. Most applications should have these options ON. When the Auto Create statistics setting is ON, the Query Optimizer creates statistics on one or more columns of a table or an indexed view, as necessary, to improve query plans and query performance.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics#CreateStatistics,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AutoUpdateStats,Warning,Auto-Update Statistics should be on,Turn Auto-Update Statistics option on to improve query performance.,"['DefaultRuleset', 'Performance', 'Statistics', 'QueryOptimizer']","The Query Optimizer determines whether an index is useful for a specific query by evaluating the stored statistics. If the statistics become out of date and significant changes have occurred against the underlying data, this can result in less than optimal query performance. In most cases, it's best to let SQL Server maintain the statistics. If you turn 'Auto Create Stats' and 'Auto Update Stats' off, then it is up to you to keep the statistics up-to-date somehow. Failure to do so will lead to poor query performance. Most applications should have these options ON. When the Auto Update Statistics setting is ON, the Query Optimizer updates statistics when they are used by a query and when they might be out-of-date. Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. The Query Optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. The threshold is based on the number of rows in the table or indexed view. The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Before compiling a query, the Query Optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Before executing a cached query plan, the Database Engine verifies that the query plan references up-to-date statistics. The AUTO_UPDATE_STATISTICS option applies to statistics created for indexes, single-columns in query predicates, and statistics that are created by using the CREATE STATISTICS statement. This option also applies to filtered statistics.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics#UpdateStatistics,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -QueryStoreOn,Warning,Query Store should be active,Make sure Query Store actual operation mode is 'Read Write' to keep your performance analysis accurate,"['DefaultRuleset', 'Performance', 'QueryStore', 'Statistics']","The Query Store feature provides you with insight on query plan choice and performance. It simplifies performance troubleshooting by helping you quickly find performance differences caused by query plan changes. Query Store automatically captures a history of queries, plans, and runtime statistics, and retains these for your review. It separates data by time windows so you can see database usage patterns and understand when query plan changes happened on the server. While Query Store collects queries, execution plans and statistics, its size in the database grows until this limit is reached. When that happens, Query Store automatically changes the operation mode to read-only and stops collecting new data, which means that your performance analysis is no longer accurate.",https://docs.microsoft.com/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0,)","['master', 'tempdb', 'model']",Warning,, -TF174,Information,TF 174 increases the plan cache bucket count,Consider enabling trace flag 174 to increase the plan cache bucket count.,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance']","Trace Flag 174 increases the SQL Server plan cache bucket count from 40,009 to 160,001 on 64-bit systems. - When the SQL Server plan cache reaches its entry limit, plans that have low cost must be evicted in order to insert new plans. This can cause severe contention on the SOS_CACHESTORE spinlock and a high CPU usage occurs in SQL Server. - On 64-bit systems, the number of buckets for the SQL Server plan cache is 40,009. Therefore, the maximum number of entries that can fit inside the SQL Server plan cache is 160,036. Enabling trace flag 174 on high performance systems increases the size of the cache and can avoid SOS_CACHESTORE spinlock contention.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"['[11.0.3368,12.0)', '[12.0.2480,13.0)', '[13.0,)']",,Information,, -TF634,Information,TF 634 disables background columnstore compression,Trace Flag 634 disables the background columnstore compression task. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance', 'ColumnStore']","Trace Flag 634 disables the background columnstore compression task. - SQL Server periodically runs the Tuple Mover background task that compresses columnstore index rowgroups with uncompressed data, one such rowgroup at a time. - Columnstore compression improves query performance but also consumes system resources. - You can control the timing of columnstore compression manually, by disabling the background compression task with trace flag 634, and then explicitly invoking ALTER INDEX...REORGANIZE or ALTER INDEX...REBUILD at the time of your choice.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Information,, -TF652,Information,TF 652 disables page pre-fetching scans,Trace Flag 652 disables Page Pre-fetching Scans. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Memory', 'Pages']","Trace Flag 652 disables page pre-fetching for scans. - The read-ahead process reads the full extent of a referenced database page into the buffer pool, before those contiguous database pages are consumed by scans. - Enabling the trace flag can lead to performance issues on queries that leverage pre-fetching.",http://support.microsoft.com/kb/920093,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Information,, -TF661,Information,TF 661 disables Ghost Cleanup Task,Trace flag 661 disables the background ghost cleanup task. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace Flag 661 disables the ghost record removal process. A ghost record is the result of a delete operation. - When you delete a record, the deleted record is kept as a ghost record. Later, the deleted record is purged by the ghost record removal process. When you disable this process, the deleted record is not purged. - Therefore, the space that the deleted record consumes is not freed. This behavior affects space consumption and the performance of scan operations. - If you turn off this trace Flag, the ghost record removal process works correctly.",https://support.microsoft.com/help/920093,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Information,, -TF834,Information,TF 834 enables large-page allocations,Enable trace flag 834 to use large-page allocations to improve analytical and data warehousing workloads.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Memory', 'ColumnStore']","Trace Flag 834 causes the server to use large-page memory (LPM) model for the buffer pool allocations. Consider enabling TF 834 if you have a server that has a lot of memory, particularly for an analytical or data warehousing workload. Trace flag 834 is NOT recommended on SQL Server instances that use columnstore indexes.",https://support.microsoft.com/help/4465518,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Information,, -TF845,Warning,TF 845 is not needed in SQL Server 2012 and higher versions,Disable trace flag 845 in SQL Server 2012 and higher versions.,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance']","Trace Flag 845 supports locking pages in memory in SQL Server Standard edition, which is needed together with trace flag 834 to use the large-page memory (LPM) model for the buffer pool allocations. - Consider enabling TF 834 if you have a server that has a lot of memory, particularly for an analytical or data warehousing workload. - Starting with SQL Server 2012 this behavior is enabled by default for Standard edition, and trace flag 845 must not be used.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF902,Warning,TF 902: Database Upgrade Bypass should be disabled,Disable trace flag 902 which bypasses database upgrade.,"['DefaultRuleset', 'TraceFlag', 'UpdateIssues']","Trace Flag 902 bypasses execution of database upgrade script when installing a Cumulative Update or Service Pack. - This trace flag is not supported to run it continuously in a production environment. - If you encounter an error during script upgrade mode, it is recommended to contact Microsoft SQL Customer Service and Support (CSS) for further guidance.",https://support.microsoft.com/help/2163980,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF1117,Information,TF 1117 Enables Filegroup-level Autogrow,Consider enabling trace flag 1117 to enable filegroup autogrow.,"['DefaultRuleset', 'TraceFlag', 'DBFileConfiguration', 'Performance']","Trace Flag 1117 initiates the growth of every file in the filegroup, when a file in the filegroup meets the autogrow threshold, and together with trace flag 1118, can help reduce allocation contention in the SQL Server TempDB database. - This trace flag affects all databases and is recommended only if every database is safe to be grow all files in a filegroup by the same amount.",https://support.microsoft.com/help/2154845,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Information,, -TF1118,Information,TF 1118 Disables Single Page Allocations,Consider enabling trace flag 1118 to force page allocations on uniform extents.,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance', 'Pages']","Trace Flag 1118 forces page allocations on uniform extents instead of mixed extents, and together with trace flag 1117, can help reduce allocation contention in the SQL Server TempDB database. - When a new object is created, by default, the first eight pages are allocated from different extents (mixed extents). - Afterwards, when more pages are needed, those are allocated from that same extent (uniform extent). - The SGAM page is used to track these mixed extents, so can quickly become a bottleneck when numerous mixed page allocations are occurring. - This trace flag allocates all eight pages from the same extent when creating new objects, minimizing the need to scan the SGAM page and forces uniform extent allocations instead of mixed page allocations.",https://support.microsoft.com/help/328551,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Information,, -TF1204,Information,TF 1204 returns deadlock information,Trace Flag 1204 returns deadlock information.,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1204 returns the resources and types of locks that are participating in a deadlock, including the affected command. - The resulting information is recorded in the SQL Server Errorlog.",https://support.microsoft.com/help/832524,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Information,, -TF1211,Warning,TF 1211: Lock Escalation should be enabled,Disable trace flag 1211 to allow lock escalation.,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1211 disables lock escalation based on memory pressure, or based on number of locks. Because SQL Server will not escalate row or page locks to table locks, this can generate an excessive number of locks. If the lock memory grows large enough, attempts to allocate additional locks for any query may fail and cause performance issues. - This trace flag should not be used in order to avoid inability to allocate lock resources because of insufficient memory. If lock escalation needs to be disabled, use trace flag 1224 instead.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF1222,Information,TF 1222 returns deadlock information,Trace Flag 1222 returns deadlock information.,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1222 returns the resources and types of locks that are participating in a deadlock, including the affected command. - The resulting information is recorded in the SQL Server Errorlog, in XML format that does not comply with any XSD schema.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Information,, -TF1224,Warning,TF 1224 should be disabled,Disable trace flag 1224 to allow lock escalation.,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1224 disables lock escalation based on the number of locks, unless SQL Server is under memory pressure. Because SQL Server will not escalate row or page locks to table locks, this can generate an excessive number of locks.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF1229,Warning,TF 1229: Lock Partitioning should be enabled,Disable trace flag 1229 to allow lock partitioning.,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance', 'CPU']","Trace Flag 1229 disables lock partitioning regardless of the number of CPUs. By default, SQL Server enables lock partitioning when a server has 16 or more CPUs, to improve the scalability characteristics of larger systems. - Disabling lock partitioning may cause can cause spinlock contention and poor performance, or unexpected behaviors when switching partitions.",https://docs.microsoft.com/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF1236,Warning,TF 1236: Database Lock Partitioning should be enabled,Enable trace Flag 1236 to allow database lock partitioning.,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1236 enables database-level lock partitioning. - Lock Partitioning is utilized to improve the scalability characteristics on larger systems.",https://support.microsoft.com/help/2926217,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF1462,Warning,TF 1462 should be disabled to allow Log Stream Compression,Disable trace flag 1462 to allow log stream compression.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'AvailabilityGroups']","Trace Flag 1462 disables log stream compression for asynchronous availability groups. - This feature is enabled by default on asynchronous replicas to optimize network bandwidth.",https://docs.microsoft.com/sql/database-engine/availability-groups/windows/tune-compression-for-availability-group,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF2312,Warning,TF 2312 sets the default Cardinality Estimation model,Trace Flag 2312 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace Flag 2312 sets the Query Optimizer cardinality estimation model to the default version of the database compability level of SQL Server 2014 and higher versions. If the database compatibility level is lower than 120, enabling trace flag 2312 uses the cardinality estimation model of SQL Server 2014 (120).",https://support.microsoft.com/help/2801413,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF2330,Warning,TF 2330 disables recording of index usage stats,Trace Flag 2330 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Indexes']","Trace Flag 2330 disables recording of index usage stats, which could lead to a non-yielding condition in SQL 2005.",https://blogs.msdn.microsoft.com/ialonso/2012/10/08/faq-around-sys-dm_db_index_usage_stats,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF2340,Information,TF 2340 disables Batch Sorts for optimized nested loops joins,Trace Flag 2340 disables Batch Sorts for optimized nested loops joins.,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace Flag 2340 causes SQL Server not to use a sort operation (batch sort) for optimized nested loops joins when generating a plan. - Verify need to set a non-default trace flag with the current system build and configuration.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Information,, -TF2371,Information,TF 2371 enables a linear recompilation threshold for statistics,Enable trace Flag 2371 to allow a linear recompilation threshold for statistics.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Statistics']","Trace Flag 2371 causes SQL Server to change the fixed update statistics threshold to a linear update statistics threshold. - This is especially useful to keep statistics updated on large tables.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Information,, -TF2389,Information,TF 2389 enables automatic statistics for Ascending Keys,Trace Flag 2389 enables automatic statistics for ascending keys. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Statistics', 'Performance']","Trace Flag 2389 enables automatically generated quick statistics for ascending keys (histogram amendment). - This trace flag is recommended to be set in cases where queries access newly inserted ascending key values (such as an IDENTITY column), but the new values are not yet updated in the statistics histogram for the affected columns. In this case the histogram used to estimate cardinality will be adjusted at query compile time. - Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2801413,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Information,, -TF2390,Information,TF 2390 enables automatic statistics for Ascending or Unknown Keys,Trace Flag 2390 enables automatic statistics for ascending or unknown keys. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Statistics', 'Performance', 'Indexes']","Trace Flag 2390 enables automatically generated quick statistics for ascending or unknown keys (histogram amendment). - This trace flag is recommended to be set in cases where queries access newly inserted ascending key values (such as an IDENTITY column), but the new values are not yet updated in the statistics histogram for the affected columns. In this case the histogram used to estimate cardinality will be adjusted at query compile time. - Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2801413,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Information,, -TF2528,Warning,TF 2528 disables parallel operations for integrity checking,Trace Flag 2528 disables parallel operations for integrity checking.,"['DefaultRuleset', 'TraceFlag', 'DataIntegrity', 'DBCC']","Trace Flag 2528 disables parallel checking of objects by DBCC CHECKDB, DBCC CHECKFILEGROUP, and DBCC CHECKTABLE. - By default, the degree of parallelism is automatically determined by the query processor. The maximum degree of parallelism is configured just like that of parallel queries. - When parallel checks are disabled, the DBCC commands will take longer to complete. - Starting with SQL Server 2014 SP2, a MAXDOP option is available to override the max degree of parallelism configuration option of sp_configure for the DBCC statements.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF2549,Warning,TF 2549 optimizes PHYSICAL_ONLY option of DBCC CHECKDB,Trace Flag 2549 forces DBCC CHECKDB to treat different physical files as one logical file.,"['DefaultRuleset', 'TraceFlag', 'DBCC']","Trace Flag 2549 forces the DBCC CHECKDB command to assume each database file is on a unique disk drive but treating different physical files as one logical file. - This trace flag can improve the performance when using the PHYSICAL_ONLY option, but it's not recommended unless it is known that each file is based on a unique physical disk.",https://support.microsoft.com/help/2634571,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF2562,Warning,TF 2562 forces the DBCC CHECKDB command to execute in a single batch,Trace Flag 2562 forces the DBCC CHECKDB command to execute in a single batch.,"['DefaultRuleset', 'TraceFlag', 'DBCC', 'TempDB']","Trace Flag 2562 forces the DBCC CHECKDB command to execute in a single batch regardless of the number of indexes in the database. - This trace flag can improve the performance when using the PHYSICAL_ONLY option, but space requirements for TempDB may increase.",https://support.microsoft.com/help/2634571,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF2566,Warning,TF 2566 disables default data purity check,Trace Flag 2566 disables default data purity check.,"['DefaultRuleset', 'TraceFlag', 'DBCC', 'DataIntegrity']","Trace Flag 2566 forces the DBCC CHECKDB command to execute without data purity check unless the DATA_PURITY option is specified. - For databases upgraded from earlier versions of SQL Server, it is recommended to run the DBCC CHECKDB WITH DATA_PURITY command at least once, to enable column-value integrity checks to happen by default.",https://support.microsoft.com/help/945770,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF3023,Information,TF 3023 enables Backup Checksum option by default,Trace Flag 3023 enables CHECKSUM option as default for BACKUP command.,"['DefaultRuleset', 'TraceFlag', 'Backup']","Trace Flag 3023 enables the CHECKSUM option of the BACKUP command by default. - This trace flag forces the CHECKSUM option for BACKUP command even when not explicitely set. - Starting with SQL Server 2014, this behavior is controlled by setting the Backup Checksum Default configuration option.",https://support.microsoft.com/help/2656988,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Information,, -TF3042,Information,TF 3042 bypasses the default backup compression pre-allocation algorithm,Trace Flag 3042 enables the bypass of the default backup compression.,"['DefaultRuleset', 'TraceFlag', 'Backup']","Trace Flag 3042 bypasses the default backup compression pre-allocation algorithm to allow the backup file to grow only as needed to reach its final size. - This trace flag can achieve space savings by allocating only the actual size required for the compressed backup, but might increase the overall backup operation time.",https://docs.microsoft.com/sql/relational-databases/backup-restore/backup-compression-sql-server,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Information,, -TF3226,Information,TF 3226 disables ErrorLog entries for every successful backup operation,Trace Flag 3226 disables ErrorLog entries for every successful backup operation.,"['DefaultRuleset', 'TraceFlag', 'Backup']","Trace Flag 3226 prevents SQL Server from recording an entry to the Errorlog on every successful backup operation. - Backup operations are registered in the Errorlog by default. Frequent backup operations can contribute to massive Errorlog files that become unwieldy.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Information,, -TF4136,Warning,TF 4136 disables Parameter Sniffing,Trace Flag 4136 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag']","Trace Flag 4136 disables parameter sniffing unless OPTION(RECOMPILE), WITH RECOMPILE or OPTIMIZE FOR value is used, but does not apply to this SQL Server version. Starting with SQL Server 2016, to accomplish this at the database level use the PARAMETER_SNIFFING option in ALTER DATABASE SCOPED CONFIGURATION. Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/980653,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF4137,Warning,TF 4137 causes plans to use partial correlation for filters,Trace flag 4137 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace Flag 4137 causes SQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for partial correlation instead of independence, under the query optimizer cardinality estimation model of SQL Server 2012 and earlier versions (CE 70). However it does not apply to this SQL Server version. - Does not apply to CE version 120 or above. Use trace flag 9471 instead. - Starting with SQL Server 2016 SP1, to accomplish this at the query level use the USE HINT 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' query hint. - Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2658214,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF4138,Warning,TF 4138 causes plans to not use Row Goal adjustments,Trace flag 4138 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace Flag 4138 causes SQL Server to generate a plan that does not use row goal adjustments with queries that contain TOP, OPTION (FAST N), IN, or EXISTS keywords. - Starting with SQL Server 2016 SP1, to accomplish this at the query level use the USE HINT 'DISABLE_OPTIMIZER_ROWGOAL' query hint. However it does not apply to this SQL Server version. - Verify need to set a Non-default trace flag with current system build and configuration.",https://support.microsoft.com/help/2667211,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF4139,Warning,TF 4139 enables automatic statistics for any key ordering,Trace flag 4139 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Statistics']","Trace Flag 4139 enables automatically generated quick statistics (histogram amendment) regardless of key column status. - However, this trace flag does not apply to this SQL Server version. - Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2952101,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TF4199,Information,TF 4199 enables Query Optimizer fixes,Trace Flag 4199 enables Query Optimizer fixes. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer']",Trace Flag 4199 enables Query Optimizer fixes released in SQL Server Cumulative Updates and Service Packs.,http://support.microsoft.com/help/974006,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0, 14.0)",,Information,, -TF6498,Warning,TF 6498 enables additional concurrent large queries,Trace Flag 6498 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Memory']","Trace Flag 6498 enables more than one large query compilation to gain access to the big gateway when there is sufficient memory available. - However, this trace flag does not apply to this SQL Server version. - This trace flag can be used to keep memory usage for the compilation of incoming queries under control, avoiding compilation waits for concurrent large queries. - Starting with SQL Server 2014 SP2 and SQL Server 2016, this behavior is controlled by the engine and trace flag 1236 has no effect.",https://support.microsoft.com/help/3024815,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF6532,Information,TF 6532 enables performance improvements for Spatial data,Enable trace flag 6532 to enable performance improvements for Spatial data.,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace Flag 6532 enables performance improvements of query operations with spatial data types. - The performance gain will vary, depending on the configuration, the types of queries, and the objects.",https://support.microsoft.com/help/3107399,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"['[11.0.6020,11.0.6518)']",,Information,, -TF6532.6533,Warning,TF 6532 and TF 6533 enable performance improvements for Spatial data,Trace flags 6532 and 6533 do not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace flags 6532 and 6533 enable performance improvements of query operations with spatial data types. - However, this trace flag does not apply to this SQL Server version. - Starting with SQL Server 2016, this behavior is controlled by the engine and trace flags 6532 and 6533 have no effect.",https://support.microsoft.com/help/3107399,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF6534,Warning,TF 6534 enables performance improvements for Spatial data,Trace flag 6534 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace Flag 6534 enables performance improvement of query operations with spatial data types. - However, this trace flag does not apply to this SQL Server version. - Verify need to set a Non-default trace flag with current system build and configuration.",https://support.microsoft.com/help/3107399,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF7412,Information,TF 7412 enables the lightweight profiling infrastructure for live query performance troubleshooting,Enable trace flag 7412 to enables the lightweight profiling infrastructure for live query performance troubleshooting.,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace Flag 7412 enables the lightweight profiling infrastructure for live query performance troubleshooting. Consider enabling TF 7412 to have the ability to access runtime information on query execution plans for any session.,https://docs.microsoft.com/sql/relational-databases/performance/query-profiling-infrastructure,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[13.0.4001,15.0)",,Information,, -TF9024,Warning,TF 9024 converts a global log pool memory object into NUMA node partitioned memory object,Verify need to set a Non-default TF with current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'NUMA', 'Memory', 'CPU']",TF9024 converts a global log pool memory object into NUMA node partitioned memory object.,https://support.microsoft.com/help/2809338/fix-high-log-write-waits-counter-value-on-a-sql-server-2012-or-sql-ser,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,,,Warning,, -TF8048,Warning,TF 8048 converts NUMA partitioned memory objects into CPU partitioned,Verify need to set a Non-default TF with current system build and configuration.,"['DefaultRuleset', 'TraceFlag', 'Performance', 'NUMA', 'CPU', 'Memory']",TF 8048 converts NUMA partitioned memory objects into CPU partitioned.,https://support.microsoft.com/help/2809338/fix-high-log-write-waits-counter-value-on-a-sql-server-2012-or-sql-ser,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,,,Warning,, -DeprecatedFeatures,Warning,Deprecated or discontinued features should not be used,Detected deprecated or discontinued feature uses: @{DeprecatedFeature}. We recommend to replace them with features actual for SQL Server version @{ProductVersion}.,"['DefaultRuleset', 'Deprecated', 'Security', 'UpdateIssues', 'Performance']",This check detects deprecated or discontinued features used on target SQL Server instance. Deprecated features may be removed in a future release of SQL Server. Discontinued features have been removed from specific versions of SQL Server.,https://docs.microsoft.com/sql/relational-databases/performance-monitor/sql-server-deprecated-features-object,"['DeprecatedFeaturesStats', 'SQLServerVersion']",Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",Warning,, -SystemHealthSession,Warning,system_health XEvent session is not active,Start the session by using the ALTER EVENT SESSION statement or by using the Extended Events node in Object Explorer.,"['DefaultRuleset', 'XEvent', 'SystemHealth']","This session starts automatically when the SQL Server Database Engine starts, and runs without any noticeable performance effects. The session collects system data that you can use to help troubleshoot performance issues in the Database Engine. - We recommend that you do not stop, alter, or delete the system health session.",https://docs.microsoft.com/sql/relational-databases/extended-events/use-the-system-health-session,['XEvent.SystemHealth'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -SPServerDiagnosticsSession,Warning,sp_server_diagnostics xEvent session is not active,Start the session by using the ALTER EVENT SESSION statement or by using the Extended Events node in Object Explorer.,"['DefaultRuleset', 'XEvent', 'SystemHealth']","This session starts automatically when the SQL Server Database Engine starts, and runs without any noticeable performance effects. The session collects system data that you can use to help troubleshoot performance issues in the Database Engine. - We recommend that you do not stop, alter, or delete the system health session.",https://docs.microsoft.com/sql/relational-databases/system-stored-procedures/sp-server-diagnostics-transact-sql,['XEvent.SPServerDiagnostics'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -BlackboxTrace,Warning,Blackbox trace is configured and running,Make sure you still need the blackbox trace and stop it otherwise.,"['DefaultRuleset', 'Traces']","This trace is designed to behave similarly to an airplane black box, to help you diagnose intermittent server crashes. It consumes more resources than the default trace and should not be running for extended periods of time.",https://docs.microsoft.com/sql/relational-databases/system-stored-procedures/sp-trace-create-transact-sql,['CountBlackBoxTraces'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -DefaultTrace,Warning,No default trace was found or is not active,Make sure that there is enough space for SQL Server to write the default trace file. Then have the default trace run by disabling and re-enabling it.,"['DefaultRuleset', 'Traces']",Default trace provides troubleshooting assistance to database administrators by ensuring that they have the log data necessary to diagnose problems the first time they occur.,https://docs.microsoft.com/sql/relational-databases/policy-based-management/default-trace-log-files-disabled,['CountDefaultTraces'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -HintsStatistics,Information,Hints are being used,"We recommend that , , and be used only as a last resort by experienced developers and database administrators, because the SQL Server Query Optimizer typically selects the best execution plan for a query.","['DefaultRuleset', 'QueryOptimizer', 'Performance', 'Statistics']","Hints are options or strategies specified for enforcement by the SQL Server query processor on SELECT, INSERT, UPDATE, or DELETE statements. The hints override any execution plan the Query Optimizer might select for a query. Because the SQL Server Query Optimizer typically selects the best execution plan for a query, we recommend that , , and be used only as a last resort by experienced developers and database administrators.",https://docs.microsoft.com/sql/t-sql/queries/hints-transact-sql,['Hints.InstanceStatistics'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Information,, -HintsUsageInModules,Information,Hints usage in modules,@{Hint} was used in @{type_desc} @{Schema_Name}.@{Object_Name}.,"['DefaultRuleset', 'QueryOptimizer', 'Performance', 'Statistics']","Hints are options or strategies specified for enforcement by the SQL Server query processor on SELECT, INSERT, UPDATE, or DELETE statements. The hints override any execution plan the Query Optimizer might select for a query. Because the SQL Server Query Optimizer typically selects the best execution plan for a query, we recommend that , , and be used only as a last resort by experienced developers and database administrators.",https://docs.microsoft.com/sql/t-sql/queries/hints-transact-sql,['Hints.ModuleUsage'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Information,, -PlansUseRatio,Warning,Amount of single use plans in cache is high,Amount of single use plans in cache is high (@{SingleUsePlansUseRatio:P0}). Consider enabling the Optimize for ad hoc workloads setting on heavy OLTP ad-hoc workloads to conserve resources.,"['DefaultRuleset', 'Performance', 'QueryOptimizer']",Single use plans waste system resources.,https://docs.microsoft.com/sql/database-engine/configure-windows/optimize-for-ad-hoc-workloads-server-configuration-option,['CachedPlans.SingleUseRatio'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -HypotheticalIndexes,Warning,Hypothetical indexes found,Index @{IndexName} for @{Schema}.@{Object} is marked as hypothetical. It is recommended to drop hypothetical index @{IndexName} as soon as possible.,"['DefaultRuleset', 'Indexes', 'Performance']","Database has indexes that are marked as hypothetical. Hypothetical indexes are created by the Database Tuning Assistant (DTA) during its tests. If a DTA session was interrupted, these indexes may not be deleted. It is recommended to drop these objects as soon as possible.",https://blogs.technet.microsoft.com/anurag_sharma/2008/04/15/hypothetical-indexes,['Hypothetical.Indexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -HypotheticalStatistics,Warning,Hypothetical statistics found,Statistics @{StatName} for @{Schema}.@{Object} is hypothetical. It is recommended to drop hypothetical statistics @{StatName} as soon as possible.,"['DefaultRuleset', 'Statistics']","Database has statistics that are marked as hypothetical. Hypothetical statistics are created by the Database Tuning Assistant (DTA) during its tests. If a DTA session was interrupted, these statistics may not be deleted. It is recommended to drop these objects as soon as possible.",https://blogs.technet.microsoft.com/anurag_sharma/2008/04/15/hypothetical-indexes,['Hypothetical.Statistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -LatestCU,Warning,SQL Server instance is not up to date,Product version @{ProductVersion} is not the latest available. We recommend keeping your SQL Server up to date and install Service Packs and Cumulative Updates as they are released.,"['DefaultRuleset', 'Security', 'UpdateIssues']","On an installed instance of SQL Server, we recommend that you apply the latest security updates and critical updates including general distribution releases (GDRs), service packs (SPs), and cumulative updates (CUs).",https://support.microsoft.com/help/321185/how-to-determine-the-version-edition-and-update-level-of-sql-server-an,['SQLServerVersion'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -FKNoIndexes,Warning,Foreign key constraints should have corresponding indexes,Create a corresponding index for each foreign key. There is no index on the following foreign keys: @{ConstraintName}.,"['DefaultRuleset', 'Performance', 'Indexes']","Unlike primary key constraints, creating a foreign key constraint does not automatically create a corresponding index. However, manually creating an index on a foreign key is often useful.",https://docs.microsoft.com/sql/relational-databases/tables/primary-and-foreign-key-constraints,['FKNoIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -MissedIndexes,Information,Potentially missing indexes,Create an index on @{Table} with key columns @{KeyCols}@{IncludedCols: and included columns: #},"['DefaultRuleset', 'Performance', 'Indexes']",Potentially missing indexes were found based on query history. It may be important to revise them.,https://docs.microsoft.com/sql/relational-databases/sql-server-index-design-guide,['MissedIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Information,, -FullBackup,Warning,Full backup is missed or outdated,The last full backup had been created more than @{threshold} days ago. Create a new full backup.,"['DefaultRuleset', 'Backup']",Database doesn't have any full backup or the latest full backup is over 7 days.,https://docs.microsoft.com/sql/relational-databases/backup-restore/create-a-full-database-backup-sql-server,['DatabaseBackups'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['model', 'tempdb']",Warning,7.0, -OutdatedTranLogBackup,Warning,Transaction Log backup is missed or outdated,Create a backup of Transaction Log. Database recovery model: @{recovery_model_desc},"['DefaultRuleset', 'Backup']","Database does not have any transaction Log backup since the latest full or differential backup, or it's older than 24H.",https://docs.microsoft.com/sql/relational-databases/backup-restore/back-up-a-transaction-log-sql-server,['DatabaseBackups'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -DbDiffCollation,Warning,Database collation doesn't match the collation of master,Keep database collation the same as the collation for master or model,"['DefaultRuleset', 'DBConfiguration', 'Collation']","We recommend that the collations of user-defined databases match the collation of master or model. Otherwise, collation conflicts can occur that might prevent code from executing. For example, when a stored procedure joins one table to a temporary table, SQL Server might end the batch and return a collation conflict error if the collations of the user-defined database and the model database are different. This occurs because temporary tables are created in tempdb, which bases its collation on that of model.",https://docs.microsoft.com/sql/database-engine/set-collation-user-defined-databases-match-master-model-databases,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AutoClose,Warning,Auto Close Option should be OFF,Set AUTO_CLOSE option to OFF,"['DefaultRuleset', 'Performance', 'DBConfiguration']","When AUTO_CLOSE is set ON, this can cause performance degradation on frequently accessed databases because of the increased overhead of opening and closing the database after each connection. AUTO_CLOSE also flushes the procedure cache after each connection.",https://docs.microsoft.com/sql/relational-databases/policy-based-management/set-the-auto-close-database-option-to-off,['DatabaseConfiguration'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'msdb', 'tempdb']",Warning,, -AutoShrink,Warning,Auto Shrink Option should be OFF,Set AUTO_SHRINK option to OFF,"['DefaultRuleset', 'DBConfiguration', 'Performance']","Shrinking databases is the fastest way to achieve fragmentation. SQL Server goes to the last page in the database, moves it to the first free available space, and then repeats the process again. This shuffles the deck, putting your pages out of order.",https://blogs.msdn.microsoft.com/buckwoody/2009/07/01/sql-server-best-practices-auto-shrink-should-be-off,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'msdb', 'tempdb']",Warning,, -PageVerify,Warning,PAGE_VERIFY option should be CHECKSUM,Set PAGE_VERIFY option to CHECKSUM,"['DefaultRuleset', 'DBConfiguration', 'DataIntegrity']","When CHECKSUM is enabled for the PAGE_VERIFY database option, the SQL Server Database Engine calculates a checksum over the contents of the whole page, and stores the value in the page header when a page is written to disk. When the page is read from disk, the checksum is recomputed and compared to the checksum value that is stored in the page header. This helps provide a high level of data-file integrity.",https://docs.microsoft.com/sql/relational-databases/policy-based-management/set-the-page-verify-database-option-to-checksum,['DatabaseConfiguration'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'msdb', 'tempdb']",Warning,, -DbChaining,Warning,Cross-Database Access should be disabled,Set DB_CHAINING option to OFF,"['DefaultRuleset', 'DBConfiguration', 'Security']",Ownership chaining across databases is turned off by default. Microsoft recommends that you disable cross-database ownership chaining because it exposes you to the additional security risks.,https://docs.microsoft.com/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'msdb', 'tempdb']",Warning,, -AutoCreateStatsIncremental,Warning,Incremental option of auto stats should be ON,Set AUTO_CREATE_STATISTICS to ON and set INCREMENTAL to ON,"['DefaultRuleset', 'DBConfiguration', 'Statistics', 'Performance']","Incremental statistics update at partition level is a feature introduced in SQL Server 2014. When the option INCREMENTAL is turn on at the database level, newly auto created column statistics will use incremental statistics on partitioned tables by default.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'msdb', 'tempdb']",Warning,, -TrustWorthy,Warning,TRUSTWORTHY should be OFF,Set TRUSTWORTHY option to OFF,"['DefaultRuleset', 'DBConfiguration', 'Security']","You can use the TRUSTWORTHY database setting to indicate whether the instance of Microsoft SQL Server trusts the database and the contents within the database. By default, this setting is set to OFF to mitigate certain threats that may be present when a database is attached to the server.",https://support.microsoft.com/help/2183687/guidelines-for-using-the-trustworthy-database-setting-in-sql-server,['DatabaseConfiguration'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'msdb', 'tempdb']",Warning,, -ParameterizationNotSimple,Warning,PARAMETERIZATION should be SIMPLE,"Set PARAMETERIZATION = SIMPLE and use forced parameterization only on a certain class of queries, instead of all queries","['DefaultRuleset', 'DBConfiguration', 'Performance', 'QueryOptimizer']","When the PARAMETERIZATION database option is set to SIMPLE, the SQL Server query optimizer may choose to parameterize the queries. This means that any literal values that are contained in a query are substituted with parameters. This process is referred to as simple parameterization. When SIMPLE parameterization is in effect, you cannot control which queries are parameterized and which queries are not. However, you can specify that all queries in a database be parameterized by setting the PARAMETERIZATION database option to FORCED. Regardless of whether you have a Plan-Stability or not, SQL Server will always auto parameterize your SQL Statements, and reuse the cached execution plan over and over again. It doesn't matter how terrible the execution plan is. Therefore you have to know in exact detail the shape of your execution plans, and whether they can lead to some performance related problems.",https://docs.microsoft.com/sql/relational-databases/performance/specify-query-parameterization-behavior-by-using-plan-guides,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'msdb', 'tempdb']",Warning,, -TempDBFilesNotSameSize,Warning,TempDB data files are not the same size,Make all TempDB data files the same size,"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']",We recommend that you create all TempDB data files at the same size.,https://support.microsoft.com/kb/2154845,['TempDBFiles'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TempDBFilesMultiple4,Warning,Number of TempDB data files should be in multiples of 4,Make sure number of TempDB data files is in multiples of 4,"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","Number of TempDB data files should correlate with the number of (logical) processors on the machine. As a general rule, if the number of logical processors is less than or equal to 8, use the same number of data files as logical processors. If the number of logical processors is greater than 8, use 8 data files and then if contention continues, increase the number of data files by multiples of 4 until the contention is reduced to acceptable levels or make changes to the workload/code.",https://support.microsoft.com/kb/2154845,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'physical_name': 'count'}}}, 'ServerInstanceConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TempDBFiles1PerCPU,Warning,Number of TempDB data files should depend on CPU count,Make sure to have 1 data file per logical processor (processors count: @{online_logical_processors}),"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","Number of TempDB data files should correlate with the number of (logical) processors on the machine. As a general rule, if the number of logical processors is less than or equal to 8, use the same number of data files as logical processors. If the number of logical processors is greater than 8, use 8 data files and then if contention continues, increase the number of data files by multiples of 4 until the contention is reduced to acceptable levels or make changes to the workload/code.",https://support.microsoft.com/kb/2154845,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'physical_name': 'count'}}}, 'ServerInstanceConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TempDBFilesNotLess8,Warning,Number of TempDB data files should be at least 8,"Add extra data files to TempDB. There are @{physical_name} data files, should be at least 8","['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","Number of TempDB data files should correlate with the number of (logical) processors on the machine. As a general rule, if the number of logical processors is less than or equal to 8, use the same number of data files as logical processors. If the number of logical processors is greater than 8, use 8 data files and then if contention continues, increase the number of data files by multiples of 4 until the contention is reduced to acceptable levels or make changes to the workload/code.",https://support.microsoft.com/kb/2154845,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'physical_name': 'count'}}}, 'ServerInstanceConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -TempDBFilesAutoGrowth,Warning,TempDB data files have different auto growth settings,Make Autogrowth settings the same for each TempDB data file,"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","TempDB data files should be of equal size within each filegroup, as SQL Server uses a proportional-fill algorithm that favors allocations in files with more free space.",https://docs.microsoft.com/sql/relational-databases/databases/tempdb-database,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'growth': 'count', 'is_percent_growth': 'count'}}}]",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,Warning,, -FilesAutogrowth,Warning,Database files have Autogrowth setting over 1GB,Set File Growth to less than 1GB for files: @{FileName},"['DefaultRuleset', 'Performance', 'DBFileConfiguration']","A data or log file will be extended with auto-growth value to prevent the lack of free space in files. This process can perform significant impact on SQL Server performance if auto-growth value gets over 1 GB. By default, SQL Server will put zeros to a newly allocated space. And the more space it takes, the more time it takes to initialize it.",https://support.microsoft.com/help/315512/considerations-for-the-autogrow-and-autoshrink-settings-in-sql-server,['Autogrow1GB'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0.4001,)",,Warning,, -DuplicateIndexes,Warning,There are tables with duplicate indexes,Consider removing duplicate indexes in table @{Table}: @{ToDelete},"['DefaultRuleset', 'Performance', 'Indexes']",There are tables with duplicate indexes according to their definitions. We recommended to revise all these objects as soon as possible.,https://docs.microsoft.com/sql/relational-databases/sql-server-index-design-guide,"[{'id': 'IndexesDefinitions', 'transform': {'type': 'duplicateIndexes'}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -RedundantIndexes,Warning,There are tables with possibly redundant indexes,Consider removing redundant indexes in table @{Table}: @{Indexes},"['DefaultRuleset', 'Performance', 'Indexes']",There are tables with possibly redundant indexes according to the set of key and included columns. We recommended to revise all these objects as soon as possible.,https://docs.microsoft.com/sql/relational-databases/sql-server-index-design-guide,"[{'id': 'IndexesDefinitions', 'transform': {'type': 'redundantIndexes'}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -UserObjectsInMaster,Warning,User objects in database master,Remove user objects from database master: @{Object_Name},"['DefaultRuleset', 'masterDB', 'Backup']","We highly recommend you not create user objects in the master database. If it's unavoidable for some reason, make sure to back up the database more frequently.",https://docs.microsoft.com/sql/relational-databases/databases/master-database,['UserObjectsCountInMasterDB'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -HighCPUUsage,Warning,High CPU usage on server,"Investigate high CPU utilization on server hosting this instance. Last 2 hours: total CPU usage is ~@{AVGTotalCPUUsage}%, usage by SQL Server is ~@{AVGSQLCPUUsage}%","['DefaultRuleset', 'Performance', 'CPU']","Keeping CPU usage rates within normal ranges is vital for servers hosting SQL Server instances. A continually high rate of CPU usage may indicate the need to upgrade the CPU or add multiple processors. Alternatively, a high CPU usage rate may indicate a poorly tuned or designed application. Optimizing the application can lower CPU utilization.",https://docs.microsoft.com/sql/relational-databases/performance-monitor/monitor-cpu-usage,['CpuUsage'],Server,Windows,"OnPremises, ManagedInstance","[11.0,)",,Warning,70.0, -ReplErrors24H,Warning,Replication errors in the last 24 hours,Review replication errors for the following publications: @{publication},"['DefaultRuleset', 'Replication']",This check searches for errors in distribution database agent's history table for the last 24 hours.,https://docs.microsoft.com/sql/relational-databases/replication/sql-server-replication,['ReplicationErrors'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity10,Warning,Agent doesn't rise alerts for errors with severity 10,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity16,Warning,Agent doesn't rise alerts for errors with severity 16,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity17,Warning,Agent doesn't rise alerts for errors with severity 17,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity19,Warning,Agent doesn't rise alerts for errors with severity 19,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity20,Warning,Agent doesn't rise alerts for errors with severity 20,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity21,Warning,Agent doesn't rise alerts for errors with severity 21,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity22,Warning,Agent doesn't rise alerts for errors with severity 22,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity23,Warning,Agent doesn't rise alerts for errors with severity 23,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -AgentAlertsSeverity24,Warning,Agent doesn't rise alerts for errors with severity 24,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -WeakPassword,Warning,Weak password,Make sure to set strong passwords on the following logins: @{PasswordData},"['DefaultRuleset', 'Security', 'WeakPassword']",Some user logins have weak passwords.,https://docs.microsoft.com/sql/relational-databases/security/strong-passwords,['WeakPassword'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -VLFCount,Warning,VLF count,Update transaction log settings to reduce the number of VLFs (current number is: @{RecoveryUnitId}),"['DefaultRuleset', 'Backup', 'Performance']","The SQL Server Database Engine divides each physical log file internally into a number of virtual log files (VLFs). Virtual log files have no fixed size, and there is no fixed number of virtual log files for a physical log file. The Database Engine chooses the size of the virtual log files dynamically while it is creating or extending log files. The Database Engine tries to maintain a small number of virtual files. The size of the virtual files after a log file has been extended is the sum of the size of the existing log and the size of the new file increment. The size or number of virtual log files cannot be configured or set by administrators. If the log files grow to a large size in many small increments, they will have many virtual log files. This can slow down database startup and also log backup and restore operations. Conversely, if the log files are set to a large size with few or just one increment, they will have few very large virtual log files. We recommend that you assign log files a size value close to the final size required, using the required increments to achieve optimal VLF distribution, and also have a relatively large growth_increment value.",https://docs.microsoft.com/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide,"[{'id': 'VLF', 'transform': {'type': 'aggregate', 'map': {'RecoveryUnitId': {'type': 'count', 'distinct': False}}}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,50.0, -TF8015,Warning,TF 8015 disables auto-detection and NUMA setup,Disable trace flag 8015 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'CPU', 'NUMA']","SQL Server allows you to group CPUs into nodes referred to as soft-NUMA. You usually configure soft-NUMA when you have many CPUs and do not have hardware NUMA, but you can also use soft-NUMA to subdivide hardware NUMA nodes into smaller groups.",https://techcommunity.microsoft.com/t5/SQL-Server-Support/How-It-Works-Soft-NUMA-I-O-Completion-Thread-Lazy-Writer-Workers/ba-p/316044,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,11.0.3349)",,Warning,, -TF8032,Warning,TF 8032 reverts the cache limit parameters to the SQL Server 2005 RTM,The cache limit parameters reverted to the SQL Server 2005 RTM setting but can cause poor performance if large caches make less memory available for other memory consumers like BP,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace Flag 8032 reverts the cache limit parameters to the SQL Server 2005 RTM setting but can cause poor performance if large caches make less memory available for other memory consumers like BP.,,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,Warning,, -TF8744,Warning,TF 8744 disables pre-fetching for the Nested Loop operator,Disable trace flag 8744 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace flag 8744 disables pre-fetching for the Nested Loops operator. Incorrect use of this trace flag may cause additional physical reads when SQL Server executes plans that contain the Nested Loops operator.,https://support.microsoft.com/help/920093/tuning-options-for-sql-server-when-running-in-high-performance-workloa,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,12.0)",,Warning,, -TF9347,Warning,TF 9347 disables batch mode for sort operator,Disable trace flag 9347 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace flag 9347 disables batch mode for sort operator. SQL Server 2016 (13.x) introduced a new batch mode sort operator that boosts performance for many analytical queries.,,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,Warning,, -TF9349,Warning,TF 9349 disables batch mode for top N sort operator,Disable trace flag 9349 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace flag 9349 disables batch mode for top N sort operator. SQL Server 2016 (13.x) introduced a new batch mode top sort operator that boosts performance for many analytical queries.,,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,Warning,, -TF9389,Warning,TF 9389 enables dynamic memory grant for batch mode operators,Disable trace flag 9389 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance', 'TempDB']","Trace flag 9389 enables additional dynamic memory grant for batch mode operators. If a query does not get all the memory it needs, it spills data to TempDB, incurring additional I/O and potentially impacting query performance. If the dynamic memory grant trace flag is enabled, a batch mode operator may ask for additional memory and avoid spilling to TempDB if additional memory is available.",,['EnabledGlobalTraceFlags'],Server,Windows,"OnPremises, ManagedInstance","[11.0,13.0)",,Warning,, -TF9476,Warning,TF 9476 causes SQL Server to generate a plan using Simple Containment assumption,Disable trace flag 9476 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance', 'QueryOptimizer']","Trace flag 9476 causes SQL Server to generate a plan using the Simple Containment assumption instead of the default Base Containment assumption, under the query optimizer cardinality estimation model of SQL Server 2014 (12.x) through SQL Server 2017 versions.",,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,Warning,, -TF9481,Warning,"TF 9481 enables Legacy CE model, irrespective of the compatibility level of the database",Disable trace flag 9481 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace flag 9481 enables you to set the query optimizer cardinality estimation model to the SQL Server 2012 (11.x) and earlier versions, irrespective of the compatibility level of the database.",,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,12.0)",,Warning,, -TF10204,Warning,TF 10204 disables merge/recompress during columnstore index reorganization,Disable trace flag 10204 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance', 'ColumnStore']","Trace flag 10204 disables merge/recompress during columnstore index reorganization. In SQL Server 2016 (13.x), when a columnstore index is reorganized, there is new functionality to automatically merge any small compressed rowgroups into larger compressed rowgroups, as well as recompressing any rowgroups that have a large number of deleted rows.",,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,Warning,, -SPNaming,Warning,Stored Procedure Naming,Rename the following stored procedures to get rid of the sp_ prefix: @{ObjectName},"['DefaultRuleset', 'Naming']","In SQL Server, the sp_ prefix designates system stored procedures. If you use that prefix for your stored procedures, the name of your procedure might conflict with the name of a system stored procedure that will be created in the future. If such a conflict occurs, your application might break if your application refers to the procedure without qualifying the reference by schema. In this situation, the name will bind to the system procedure instead of to your procedure.",https://docs.microsoft.com/previous-versions/visualstudio/visual-studio-2010/dd172115(v=vs.100),['BadNamingSP'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -ObjectNamingSpecialChar,Warning,Object Naming,Rename the following objects to get rid of special characters: @{ObjectName},"['DefaultRuleset', 'Naming']","If you name a database object by using any character in the following table, you make it more difficult not only to reference that object but also to read code that contains the name of that object.",https://docs.microsoft.com/previous-versions/visualstudio/visual-studio-2010/dd172134(v=vs.100),['BadNamingSpecialChars'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -ColumnNamingSpecialChar,Warning,Column Naming,Rename the following columns to get rid of special characters: @{ObjectName},"['DefaultRuleset', 'Naming']","If you name a database object by using any character in the following table, you make it more difficult not only to reference that object but also to read code that contains the name of that object.",https://docs.microsoft.com/previous-versions/visualstudio/visual-studio-2010/dd172134(v=vs.100),['BadNamingSpecialCharsColumns'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -FnNaming,Warning,User Function Naming,Rename the following functions to get rid of the fn_ prefix: @{ObjectName},"['DefaultRuleset', 'Naming']","In SQL Server, the fn_ prefix designates system functions. If you use that prefix for your functions, the name of your function might conflict with the name of a system function that will be created in the future. If such a conflict occurs, your application might break if your application refers to the function without qualifying the reference by schema. In this situation, the name will bind to the system function instead of to your function.",https://docs.microsoft.com/sql/t-sql/statements/create-function-transact-sql,['BadNamingUserFunctions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -ObjectNamingResKeywords,Warning,Object names contain reserved keywords,Rename the following objects to get rid of reserved keywords: @{ObjectName},"['DefaultRuleset', 'Naming']","Microsoft SQL Server uses reserved keywords for defining, manipulating, and accessing databases. Reserved keywords are part of the grammar of the Transact-SQL language that is used by SQL Server to parse and understand Transact-SQL statements and batches. Although it is syntactically possible to use SQL Server reserved keywords as identifiers and object names in Transact-SQL scripts, you can do this only by using delimited identifiers.",https://docs.microsoft.com/sql/t-sql/language-elements/reserved-keywords-transact-sql,['BadNamingKeywords'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -DeprFeaturesInModules,Warning,Use of deprecated or discontinued features in modules,Consider getting rid of the following deprecated or discontinued features in @{ObjectName}: @{Keyword},"['DefaultRuleset', 'Security', 'Deprecated', 'LongRunningChecks', 'UpdateIssues']",Deprecated features are scheduled to be removed in a future release of SQL Server. Discontinued features have been removed from specific versions of SQL Server.,https://docs.microsoft.com/sql/relational-databases/performance-monitor/sql-server-deprecated-features-object,['DeprecatedFeaturesSQLModules'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",Warning,, -DeprFeaturesInJobs,Warning,Use of deprecated or discontinued features in modules,Consider getting rid of the following deprecated or discontinued features in job @{ObjectName}: @{Keyword},"['DefaultRuleset', 'Security', 'Deprecated', 'Agent', 'Jobs', 'LongRunningChecks', 'UpdateIssues']",Deprecated features are scheduled to be removed in a future release of SQL Server. Discontinued features have been removed from specific versions of SQL Server.,https://docs.microsoft.com/sql/relational-databases/performance-monitor/sql-server-deprecated-features-object,['DeprecatedFeaturesJobs'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -NUMANodeSingleCPU,Warning,Single CPU assigned to NUMA node,Consider assigning additional CPUs to NUMA nodes that have only one assigned CPU,"['DefaultRuleset', 'NUMA', 'CPU', 'Memory', 'Performance']","Microsoft SQL Server is non-uniform memory access (NUMA) aware. NUMA architecture provides a scalable solution to performance problem. Computers with hardware NUMA have more than one system bus, each serving a small set of processors. Each group of processors has its own memory and possibly its own I/O channels, but each CPU can access memory associated with other groups in a coherent way. Each group is called a NUMA node. The number of CPUs within a NUMA node depends on the hardware vendor. Your hardware manufacturer can tell you if your computer supports hardware NUMA.",https://docs.microsoft.com/previous-versions/sql/sql-server-2008-r2/ms178144(v=sql.105),['ServerInstanceConfiguration'],Server,Windows,"OnPremises, ManagedInstance","[11.0,)",,Warning,, -NUMANodeNoCPU,Warning,NUMA nodes without CPUs,Make sure that all NUMA nodes have assigned CPUs,"['DefaultRuleset', 'NUMA', 'Performance', 'CPU', 'Memory']","Microsoft SQL Server is non-uniform memory access (NUMA) aware. NUMA architecture provides a scalable solution to performance problem. Computers with hardware NUMA have more than one system bus, each serving a small set of processors. Each group of processors has its own memory and possibly its own I/O channels, but each CPU can access memory associated with other groups in a coherent way. Each group is called a NUMA node. The number of CPUs within a NUMA node depends on the hardware vendor. Your hardware manufacturer can tell you if your computer supports hardware NUMA.",https://docs.microsoft.com/previous-versions/sql/sql-server-2008-r2/ms178144(v=sql.105),['AffinityNUMANodeNoAssignedCPUs'],Server,Windows,"OnPremises, ManagedInstance","[11.0,)",,Warning,, -IndexKeyGuid,Warning,Guid in clustered index key column,Get rid of GUIDs in the following clustered indexes' keys: @{IndexName},"['DefaultRuleset', 'Indexes', 'Performance']","A big reason for a clustered index is when you often want to retrieve rows for a range of values for a given column. Because the data is physically arranged in that order, the rows can be extracted very efficiently. Something like a GUID, while excellent for a primary key, could be positively detrimental to performance, as there will be additional cost for inserts and no perceptible benefit on selects.",https://azure.microsoft.com/blog/uniqueidentifier-and-clustered-indexes/,['IndexesGuidKeyColumns'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",Warning,, -IndexesLargeKeys,Warning,Indexes keys with more than 900 bytes,Get rid of keys larger than 900 bytes in index @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","When you design an index that contains many key columns, or large-size columns, calculate the size of the index key to make sure that you do not exceed the maximum index key size. SQL Server retains the 900-byte limit for the maximum total size of all index key columns. This excludes nonkey columns that are included in the definition of nonclustered indexes.",http://msdn.microsoft.com/library/ms191241.aspx,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,13.0)","['master', 'model', 'msdb', 'tempdb']",Warning,, -IndexesLargeKeysNonClust,Warning,NonClustered indexes keys with more than 1700 bytes,Get rid of keys larger than 1700 bytes in index @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","When you design an index that contains many key columns, or large-size columns, calculate the size of the index key to make sure that you do not exceed the maximum index key size. SQL Server retains the 1700-byte limit for the maximum total size of all non-clustered index key columns. This excludes nonkey columns that are included in the definition of nonclustered indexes.",http://msdn.microsoft.com/library/ms191241.aspx,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -IndexesLargeKeysClust,Warning,Clustered indexes keys with more than 900 bytes,Get rid of keys larger than 900 bytes in index @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","When you design an index that contains many key columns, or large-size columns, calculate the size of the index key to make sure that you do not exceed the maximum index key size. SQL Server retains the 900-byte limit for the maximum total size of all clustered index key columns. This excludes nonkey columns that are included in the definition of nonclustered indexes.",http://msdn.microsoft.com/library/ms191241.aspx,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -DisabledIndexes,Warning,Disabled Indexes exist,Remove or enable this disabled index: @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","If you need to load a lot of data quickly, you can disable nonclustered indexes in order to improve performance. After the data load finishes, enable the nonclustered indexes again by rebuilding them. This technique works best in large data warehouse environments where entire dimension tables might be reloaded from scratch every night. Disabling nonclustered indexes is safer than dropping and recreating them because scripting indexes is hard. Unfortunately, sometimes our load processes crash before enabling the indexes again, or sometimes we manually load data and we forget to rebuild them.",https://docs.microsoft.com/sql/relational-databases/indexes/disable-indexes-and-constraints,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -IndexesFillFactor,Warning,Index fill factor lower 80%,Review index @{FullName} as its fill factor @{FillFactor} is lower than 80 percent,"['DefaultRuleset', 'Indexes', 'Performance']","The fill-factor option is provided for fine-tuning index data storage and performance. When an index is created or rebuilt, the fill-factor value determines the percentage of space on each leaf-level page to be filled with data, reserving the remainder on each page as free space for future growth. For example, specifying a fill-factor value of 80 means that 20 percent of each leaf-level page will be left empty, providing space for index expansion as data is added to the underlying table. The empty space is reserved between the index rows rather than at the end of the index.",https://docs.microsoft.com/sql/relational-databases/indexes/specify-fill-factor-for-an-index,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -NonUniqueClusterIndex,Warning,Non-unique clustered indexes,Review this clustered index @{FullName} as it is non-unique,"['DefaultRuleset', 'Indexes', 'Performance']","Index uniqueness is highly desirable attribute of a clustering key, and goes hand-in-hand with index narrowness. SQL Server does not require a clustered index to be unique, but yet it must have some means of uniquely identifying every row. That’s why, for non-unique clustered indexes, SQL Server adds to every duplicate instance of a clustering key value a 4-byte integer value called a uniqueifier. This uniqueifier is added everywhere the clustering key is stored. That means the uniqueifier is stored in both clustered and non-clustered indexes. As you can imagine, if there are many rows using the same clustering key value, this can become quite expensive.",https://docs.microsoft.com/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -SuspectPages,Warning,Suspect pages,Run DBCC CHECKDB to verify affected database. Suspect pages were found: @{EventType},"['DefaultRuleSet', 'Pages', 'DataIntegrity']","The suspect_pages table is used for maintaining information about suspect pages, and is relevant in helping to decide whether a restore is necessary.",https://docs.microsoft.com/sql/relational-databases/backup-restore/manage-the-suspect-pages-table-sql-server,['SuspectPagesValidation'],Database,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -SparseFiles,Warning,Sparse files,Get rid of sparse files: @{SparseFiles},"['DefaultRuleSet', 'Snapshots', 'Backup', 'DataIntegrity']","If the file is sparse or compressed, the NTFS file system may deallocate disk space in the file. This sets the range of bytes to zeroes (0) without extending the file size.",https://blogs.msdn.microsoft.com/jorgepc/2010/11/25/what-are-sparse-files-and-why-should-i-care-as-sql-server-dba/,['SparseFilesValidation'],Database,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -TableNoIndex,Warning,Tables without indexes,Review table @{TableName} and create reasonable indexes,"['DefaultRuleset', 'Indexes', 'Performance']","Each table in the database has one or more pages. To keep track of those pages, SQL Server uses a special set of pages, called IAM (for Index Allocation Map) pages. In spite of the word “Index” in the name, IAMs are used for non-indexed tables as well. These are called heaps. All the data is there, but the only way to find anything is to read it starting at the beginning. For a very large table, this will be terribly inefficient.",https://docs.microsoft.com/sql/relational-databases/indexes/heaps-tables-without-clustered-indexes,['TableIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",Warning,, -TableNoClusteredIndex,Warning,Tables without clustered indexes,Review table @{TableName} and consider creating a clustered index,"['DefaultRuleset', 'Indexes', 'Performance']","Tables without clustered indexes are called heaps. They’re scattered on disk anywhere that SQL Server can find a spot, and they’re not stored in any order whatsoever. This can make for really fast inserts – SQL Server can just throw the data down – but slow selects, updates, and deletes.",https://docs.microsoft.com/sql/relational-databases/indexes/heaps-tables-without-clustered-indexes,['TableIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",Warning,, -TablePSAlign,Warning,Table index not aligned with PS,Consider recreating index @{IndexName} in table @{TableName} to have it aligned with your schema,"['DefaultRuleset', 'Indexes', 'Performance']","Table partitioning is a complex way to break out your large tables into smaller, more manageable chunks, but it comes with a lot of management heartache. One of the challenges is making sure that your indexes are partitioned and aligned the same way as your clustered index.",https://docs.microsoft.com/sql/relational-databases/partitions/partitioned-tables-and-indexes,['TableIndexesPartitioned'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",Warning,, -LoginNoPassword,Warning,Logins with no passwords,Make sure to set strong passwords on the following logins: @{PasswordData},"['DefaultRuleset', 'Security', 'WeakPassword']",Password complexity policies are designed to deter brute force attacks by increasing the number of possible passwords.,https://docs.microsoft.com/sql/relational-databases/security/password-policy,['NullPassword'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -LoginEqPassword,Warning,Logins with passwords that are same as the login names,Please review logins with password equals to login: @{PasswordData},"['DefaultRuleset', 'Security', 'WeakPassword']",Password complexity policies are designed to deter brute force attacks by increasing the number of possible passwords.,https://docs.microsoft.com/sql/relational-databases/security/password-policy,['NamePassword'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -SystemHealth,Warning,System Health important messages,Error @{Error_Number} has occured @{Error_Count} times. Last time was @{Last_Logged_Days_Ago} days ago,"['DefaultRuleset', 'XEvent', 'SystemHealth', 'Performance']","The system_health session is an Extended Events session that is included by default with SQL Server. This session starts automatically when the SQL Server Database Engine starts, and runs without any noticeable performance effects. The session collects system data that you can use to help troubleshoot performance issues in the Database Engine",https://docs.microsoft.com/sql/relational-databases/extended-events/use-the-system-health-session,['SystemHealth'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,, -RarelyUsedIndex,Warning,Rarely used index,Make sure you need index @{IndexName} as it's used too rarely,"['DefaultRuleset', 'Indexes', 'Performance']","Rarely used indexes can slow down database's performance. Time of write operations is increased because of index maintenance, but index is not used quite often. It makes sense to compare impact of writing operations versus rare reading speedup.",https://docs.microsoft.com/sql/t-sql/statements/drop-index-transact-sql,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -UnusedIndex,Warning,Unused index,Make sure you need index @{IndexName} as it's unused,"['DefaultRuleset', 'Index', 'Performance']","Unused indexes can slow down database's performance. Time of write operations is increased because of index maintenance, but index is not used anywhere.",https://docs.microsoft.com/sql/t-sql/statements/drop-index-transact-sql,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -SkewedCompatibilityLevel,Warning,Database with skewed compatibility level,Update database compatibility level (current level: @{CompatibilityLevel}),"['DefaultRuleset', 'CompatibilityLevel', 'Security', 'Performance', 'UpdateIssues']",Some databases may have a compatibility level lower than the allowed level by the Database Engine.,https://docs.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-compatibility-level,"['CompatibilityLevel', 'SQLServerVersion']",Database,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -PendingDiskIORequests,Warning,Pending disk I/O requests,Investigate and solve I/O related issues to get rid of pending requests,"['DefaultRuleset', 'IO', 'Performance']","A database management system (DBMS), such as SQL Server, relies on the timeliness of file input and output (I/O) operations. The proper configuration and maintenance of the I/O subsystem is critical to a successful SQL Server deployment.",https://support.microsoft.com/en-sg/help/897284/diagnostics-in-sql-server-help-detect-stalled-and-stuck-i-o-operations,"[{'id': 'PendingIORequests', 'params': {'io_type': 'disk'}}]",Server,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -MaxDOP,Warning,MaxDOP should be less or equal number of CPUs,Update MaxDOP configuration option – it shouldn't exceed the number of processors that SQL Server uses,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,['ServerInstanceConfiguration'],Server,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -MaxDOPOver8CPU1NUMA,Warning,MaxDOP should equal number of CPUs for single NUMA node,Update MaxDOP configuration option – it should equal the number of processors that SQL Server uses,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,['ServerInstanceConfiguration'],Server,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -MaxDOP8CPU1NUMA,Warning,MaxDOP should be less 8 for single NUMA node,Update MaxDOP configuration option – it shouldn't exceed 8,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,['ServerInstanceConfiguration'],Server,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -MaxDOPFewNUMA,Warning,MaxDOP should be according to processor count ratio,"Update MaxDOP configuration option – if the number of CPUs per NUMA <= 15, then set MaxDOP the same number, if it's > 15, then set MaxDOP = half of it","['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,['ServerInstanceConfiguration'],Server,"['Windows', 'Linux']",,"[11.0,)",,Warning,, -DbIntegrity,Warning,Database Integrity Checks,Run DBCC CHECKDB since integrity checks have not been executed for over 7 days,"['DefaultRuleset', 'DBCC', 'Performance', 'DataIntegrity']","The DBCC CHECKDB command checks the integrity of the objects in a database and should be run on a regular basis. This statement is used to perform different operations in your database and can be broken down into four categories: Maintenance, Miscellaneous, Informational, and Validation.",https://msdn.microsoft.com/library/ms176064.aspx,"['DBMetaInfo', 'DatabaseConfiguration']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",tempdb,Warning,, -DirectCatalogUpdates,Warning,Direct Catalog Updates,"Do not use direct catalog update feature in new development work, and modify applications that currently use it as soon as possible","['DefaultRuleset', 'DBCC', 'Deprecated']","'allow updates' option is still present in the sp_configure stored procedure, although its functionality is unavailable in SQL Server. The setting has no effect. Starting with SQL Server 2005, direct updates to the system tables are not supported.",https://docs.microsoft.com/sql/database-engine/configure-windows/allow-updates-server-configuration-option,"['DBMetaInfo', 'DatabaseConfiguration']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",tempdb,Warning,, -DataPurityCheck,Warning,Data Purity Check,Run DBCC CHECKDB ([DatabaseName]) WITH DATA_PURITY,"['DefaultRuleset', 'DBCC', 'DataIntegrity']","The DBCC CHECKDB command checks the integrity of the objects in a database and should be run on a regular basis. One thing that this command does not check in databases created in versions prior to SQL Server 2005 is the integrity of the data in the columns until it has been run once with the DATA_PURITY option. Adding the DATA_PURITY option causes the CHECKDB command to look for column values that are invalid or out of range. Any database that was created in SQL Server 2005 or later will include the DATA_PURITY check by default; but if the database is being upgraded from an earlier version, you must run the command with the DATA_PURITY option at least once using the following command and then fix any data issues.",http://support.microsoft.com/kb/923247,"['DBMetaInfo', 'DatabaseConfiguration']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -StatSamplingRate,Warning,Statistics sampling rate,"Some statistics have sampling rates less than @{threshold:P}, consider updating with a larger sample or full scan if key is not uniformly distributed. Affected tables: @{FullName}.","['DefaultRuleset', 'Performance', 'Statistics']","For most queries, the Query Optimizer already generates the necessary statistics for a high quality query plan; in some cases, you need to create additional statistics or modify the query design for best results.",https://docs.microsoft.com/sql/t-sql/statements/update-statistics-transact-sql,"[{'id': 'StatSamplingRate', 'params': {'threshold': '@threshold'}, 'transform': {'type': 'aggregate', 'map': {'FullName': 'join'}}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,0.25, -IndexFragmentation,Warning,Index Fragmentation,Remove fragmentation of index @{IndexFullName}. It's fragmentation level: @{fragmentation:#0.##}%.,"['DefaultRuleset', 'Index', 'Performance']","The SQL Server Database Engine automatically modifies indexes whenever insert, update, or delete operations are made to the underlying data. Over time these modifications can cause the information in the index to become scattered in the database (fragmented). Fragmentation exists when indexes have pages in which the logical ordering, based on the key value, does not match the physical ordering inside the data file. Heavily fragmented indexes can degrade query performance and cause your application to respond slowly, especially scan operations.",https://docs.microsoft.com/sql/relational-databases/indexes/reorganize-and-rebuild-indexes,['IndexStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,5.0, -XTPHashAvgChainBuckets,Warning,High avg chain length and empty buckets,Index @{IndexFullName} has @{avg_chain_length} average chain length and @{EmptyBucketPct}% empty buckets count. Verify if there are many rows with duplicate index key values or there is a skew in the key values,"['DefaultRuleset', 'Index', 'Performance', 'XTP']","Memory-optimized HASH indexes behave different from NONCLUSTERED indexes. They are optimized for point-lookup operations, and do not support ordered scans or inequality seek operations. You should specify a value for the BUCKET_COUNT parameter when you create a memory-optimized table.",https://techcommunity.microsoft.com/t5/sql-server/in-memory-oltp-indexes-part-2-performance-troubleshooting-guide/ba-p/385725,['XTPIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -XTPTooManyBuckets,Warning,Too many buckets,"Make number of buckets of index @{IndexFullName} equal to distinct rows. It has @{total_bucket_count} buckets, and there are @{DistinctCnt} in the table, which is wasting memory and marginally slowing down full table scans.","['DefaultRuleset', 'Index', 'Performance', 'XTP']","Memory-optimized HASH indexes behave different from NONCLUSTERED indexes. They are optimized for point-lookup operations, and do not support ordered scans or inequality seek operations. You must specify a value for the BUCKET_COUNT parameter when you create the memory-optimized table.",https://techcommunity.microsoft.com/t5/sql-server/in-memory-oltp-indexes-part-2-performance-troubleshooting-guide/ba-p/385725,['XTPIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -XTPTooFewBuckets,Warning,Too few buckets,"Make number of buckets of index @{IndexFullName} equal to distinct rows. It has @{total_bucket_count} buckets, and there are @{DistinctCnt} in the table, which leads to chaining records.","['DefaultRuleset', 'Index', 'Performance', 'XTP']","Memory-optimized HASH indexes behave different from NONCLUSTERED indexes. They are optimized for point-lookup operations, and do not support ordered scans or inequality seek operations. You must specify a value for the BUCKET_COUNT parameter when you create the memory-optimized table.",https://techcommunity.microsoft.com/t5/sql-server/in-memory-oltp-indexes-part-2-performance-troubleshooting-guide/ba-p/385725,['XTPIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -XTPRangeIXHealth,Warning,NonClustered index retry amount,"Review index @{IndexFullName} as its retry count is over @{RetryCountPct}% of total, which is indicating possible concurrency issues.","['DefaultRuleset', 'Index', 'Performance', 'XTP']","When a database with a memory-optimized table is restarted, the index is built by inserting one row at a time into memory. The count of page splits, merges, and consolidation can help you understand the work done to build the index when a database is brought online. Large numbers of retries are indicative of concurrency issues.",https://docs.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-db-xtp-nonclustered-index-stats-transact-sql,['XTPNonClusteredIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,,5.0 -TF6533Misuse,Warning,STRelate and STAsBinary functions unexpected results due to enabled TF 6533,Disable TF 6533 to avoid unexpected results of functions STRelate and STAsBinary,"['DefaultRuleset', 'TraceFlag', 'Performance', 'TF6533']",The STRelate and STAsBinary functions may return unexpected results when trace flag 6533 is enabled. Do not use this trace flag if your workload involves either of these functions.,https://support.microsoft.com/help/3107399,"['EnabledGlobalTraceFlags', 'TF6533SpatialFunctionsUsage']",Database,Windows,OnPremises,"['[11.0.6020, 11.0.6518)']","['master', 'model', 'msdb', 'tempdb']",Warning,, -UntrustedConstraints,Warning,Untrusted Constraints,Execute ALTER TABLE WITH CHECK CHECK CONSTRAINT statement to avoid possible performance issues: @{constraint_name} constraints are not trusted for referential integrity.,"['DefaultRuleset', 'Performance', 'DataIntegrity']","If you need to load a lot of data quickly, you can disable keys and constraints in order to improve performance. After the data load finishes, enable them again, and SQL Server will check them behind the scenes. This technique works best in large data warehouse environments where entire dimension tables might be reloaded from scratch every night. Disabling constraints is usually safer and easier than dropping and recreating them.",https://docs.microsoft.com/sql/t-sql/statements/alter-table-transact-sql,['FKNotTrusted'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -PercentAutogrows,Warning,Database files have a growth ratio set in percentage,"Don't use ""File Growth In Percent"" for the Autogrowth setting. The following files are affected: @{fileName} have a growth ratio set in percentage.","['DefaultRuleset', 'Performance', 'DBFileConfiguration', 'DBConfiguration']","Some database files have a growth ratio set in percentage. Over time, this could lead to uncontrolled disk space allocation and extended time to perform these growths",https://docs.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options,"[{'id': 'DatabaseMasterFiles', 'params': {'type': None, 'is_percent_growth': 1}, 'transform': {'type': 'aggregate', 'map': {'fileName': 'join'}}}]",Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'model', 'msdb', 'tempdb']",Warning,, -StatsUpdate,Warning,Statistics needs to be updated,Update stats in table @{TableName} to improve query performance.,"['DefaultRuleset', 'Performance', 'Statistics', 'QueryOptimizer']","The Query Optimizer determines whether an index is useful for a specific query by evaluating the stored statistics. If the statistics become out of date and significant changes have occurred against the underlying data, this can result in less than optimal query performance. In most cases, it's best to let SQL Server maintain the statistics. If you turn 'Auto Create Stats' and 'Auto Update Stats' off, then it is up to you to keep the statistics up-to-date somehow. Failure to do so will lead to poor query performance. Most applications should have these options ON. When the Auto Update Statistics setting is ON, the Query Optimizer updates statistics when they are used by a query and when they might be out-of-date. Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. The Query Optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. The threshold is based on the number of rows in the table or indexed view. The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Before compiling a query, the Query Optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Before executing a cached query plan, the Database Engine verifies that the query plan references up-to-date statistics. The AUTO_UPDATE_STATISTICS option applies to statistics created for indexes, single-columns in query predicates, and statistics that are created by using the CREATE STATISTICS statement. This option also applies to filtered statistics.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics#UpdateStatistics,"['DatabaseConfiguration', 'ObjectStatistics']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,Warning,500.0, +id,level,displayName,message,tags,description,helpLink,probes,target.type,target.platform,target.engineEdition,target.version,target.name.not,threshold,RetryCountPct +AutoCreateStats,Warning,Auto-Create Statistics should be on,Turn Auto-Create Statistics option on to improve query performance,"['DefaultRuleset', 'Performance', 'Statistics', 'QueryOptimizer']","The Query Optimizer determines whether an index is useful for a specific query by evaluating the stored statistics. If the statistics become out of date and significant changes have occurred against the underlying data, this can result in less than optimal query performance. In most cases, it's best to let SQL Server maintain the statistics. If you turn 'Auto Create Stats' and 'Auto Update Stats' off, then it is up to you to keep the statistics up-to-date somehow. Failure to do so will lead to poor query performance. Most applications should have these options ON. When the Auto Create statistics setting is ON, the Query Optimizer creates statistics on one or more columns of a table or an indexed view, as necessary, to improve query plans and query performance.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics#CreateStatistics,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AutoUpdateStats,Warning,Auto-Update Statistics should be on,Turn Auto-Update Statistics option on to improve query performance,"['DefaultRuleset', 'Performance', 'Statistics', 'QueryOptimizer']","The Query Optimizer determines whether an index is useful for a specific query by evaluating the stored statistics. If the statistics become out of date and significant changes have occurred against the underlying data, this can result in less than optimal query performance. In most cases, it's best to let SQL Server maintain the statistics. If you turn 'Auto Create Stats' and 'Auto Update Stats' off, then it is up to you to keep the statistics up-to-date somehow. Failure to do so will lead to poor query performance. Most applications should have these options ON. When the Auto Update Statistics setting is ON, the Query Optimizer updates statistics when they are used by a query and when they might be out-of-date. Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. The Query Optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. The threshold is based on the number of rows in the table or indexed view. The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Before compiling a query, the Query Optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Before executing a cached query plan, the Database Engine verifies that the query plan references up-to-date statistics. The AUTO_UPDATE_STATISTICS option applies to statistics created for indexes, single-columns in query predicates, and statistics that are created by using the CREATE STATISTICS statement. This option also applies to filtered statistics.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics#UpdateStatistics,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +QueryStoreOn,Warning,Query Store should be active,Make sure Query Store actual operation mode is 'Read Write' to keep your performance analysis accurate,"['DefaultRuleset', 'Performance', 'QueryStore', 'Statistics']","The Query Store feature provides you with insight on query plan choice and performance. It simplifies performance troubleshooting by helping you quickly find performance differences caused by query plan changes. Query Store automatically captures a history of queries, plans, and runtime statistics, and retains these for your review. It separates data by time windows so you can see database usage patterns and understand when query plan changes happened on the server. While Query Store collects queries, execution plans and statistics, its size in the database grows until this limit is reached. When that happens, Query Store automatically changes the operation mode to read-only and stops collecting new data, which means that your performance analysis is no longer accurate.",https://docs.microsoft.com/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0,)","['master', 'tempdb', 'model']",, +TF174,Information,TF 174 increases the plan cache bucket count,Consider enabling trace flag 174 to increase the plan cache bucket count,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance']","Trace Flag 174 increases the SQL Server plan cache bucket count from 40,009 to 160,001 on 64-bit systems. When the SQL Server plan cache reaches its entry limit, plans that have low cost must be evicted in order to insert new plans. This can cause severe contention on the SOS_CACHESTORE spinlock and a high CPU usage occurs in SQL Server. On 64-bit systems, the number of buckets for the SQL Server plan cache is 40,009. Therefore, the maximum number of entries that can fit inside the SQL Server plan cache is 160,036. Enabling trace flag 174 on high performance systems increases the size of the cache and can avoid SOS_CACHESTORE spinlock contention.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"['[11.0.3368,12.0)', '[12.0.2480,13.0)', '[13.0,)']",,, +TF634,Information,TF 634 disables background columnstore compression,Trace Flag 634 disables the background columnstore compression task. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance', 'ColumnStore']","Trace Flag 634 disables the background columnstore compression task. SQL Server periodically runs the Tuple Mover background task that compresses columnstore index rowgroups with uncompressed data, one such rowgroup at a time. Columnstore compression improves query performance but also consumes system resources. You can control the timing of columnstore compression manually, by disabling the background compression task with trace flag 634, and then explicitly invoking ALTER INDEX...REORGANIZE or ALTER INDEX...REBUILD at the time of your choice.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF652,Information,TF 652 disables page pre-fetching scans,Trace Flag 652 disables Page Pre-fetching Scans. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Memory', 'Pages']","Trace Flag 652 disables page pre-fetching for scans. The read-ahead process reads the full extent of a referenced database page into the buffer pool, before those contiguous database pages are consumed by scans. Enabling the trace flag can lead to performance issues on queries that leverage pre-fetching.",http://support.microsoft.com/kb/920093,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF661,Information,TF 661 disables Ghost Cleanup Task,Trace flag 661 disables the background ghost cleanup task. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace Flag 661 disables the ghost record removal process. A ghost record is the result of a delete operation. When you delete a record, the deleted record is kept as a ghost record. Later, the deleted record is purged by the ghost record removal process. When you disable this process, the deleted record is not purged. Therefore, the space that the deleted record consumes is not freed. This behavior affects space consumption and the performance of scan operations. If you turn off this trace Flag, the ghost record removal process works correctly.",https://support.microsoft.com/help/920093,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF834,Information,TF 834 enables large-page allocations,Enable trace flag 834 to use large-page allocations to improve analytical and data warehousing workloads,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Memory', 'ColumnStore']","Trace Flag 834 causes the server to use large-page memory (LPM) model for the buffer pool allocations. Consider enabling TF 834 if you have a server that has a lot of memory, particularly for an analytical or data warehousing workload. Trace flag 834 is NOT recommended on SQL Server instances that use columnstore indexes.",https://support.microsoft.com/kb/3210239,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF845,Warning,TF 845 is not needed in SQL Server 2012 and higher versions,Disable trace flag 845 in SQL Server 2012 and higher versions,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance']","Trace Flag 845 supports locking pages in memory in SQL Server Standard edition, which is needed together with trace flag 834 to use the large-page memory (LPM) model for the buffer pool allocations. Consider enabling TF 834 if you have a server that has a lot of memory, particularly for an analytical or data warehousing workload. Starting with SQL Server 2012 this behavior is enabled by default for Standard edition, and trace flag 845 must not be used.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF902,Warning,TF 902: Database Upgrade Bypass should be disabled,Disable trace flag 902 which bypasses database upgrade,"['DefaultRuleset', 'TraceFlag', 'UpdateIssues']","Trace Flag 902 bypasses execution of database upgrade script when installing a Cumulative Update or Service Pack. This trace flag is not supported to run it continuously in a production environment. If you encounter an error during script upgrade mode, it is recommended to contact Microsoft SQL Customer Service and Support (CSS) for further guidance.",https://support.microsoft.com/help/2163980,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF1117,Information,TF 1117 Enables Filegroup-level Autogrow,Consider enabling trace flag 1117 to enable filegroup autogrow,"['DefaultRuleset', 'TraceFlag', 'DBFileConfiguration', 'Performance']","Trace Flag 1117 initiates the growth of every file in the filegroup, when a file in the filegroup meets the autogrow threshold, and together with trace flag 1118, can help reduce allocation contention in the SQL Server TempDB database. This trace flag affects all databases and is recommended only if every database is safe to be grow all files in a filegroup by the same amount.",https://support.microsoft.com/help/2154845,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF1118,Information,TF 1118 Disables Single Page Allocations,Consider enabling trace flag 1118 to force page allocations on uniform extents,"['DefaultRuleset', 'TraceFlag', 'Memory', 'Performance', 'Pages']","Trace Flag 1118 forces page allocations on uniform extents instead of mixed extents, and together with trace flag 1117, can help reduce allocation contention in the SQL Server TempDB database. When a new object is created, by default, the first eight pages are allocated from different extents (mixed extents). Afterwards, when more pages are needed, those are allocated from that same extent (uniform extent). The SGAM page is used to track these mixed extents, so can quickly become a bottleneck when numerous mixed page allocations are occurring. This trace flag allocates all eight pages from the same extent when creating new objects, minimizing the need to scan the SGAM page and forces uniform extent allocations instead of mixed page allocations.",https://support.microsoft.com/help/328551,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF1204,Information,TF 1204 returns deadlock information,Trace Flag 1204 returns deadlock information,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1204 returns the resources and types of locks that are participating in a deadlock, including the affected command. The resulting information is recorded in the SQL Server Errorlog.",https://support.microsoft.com/help/832524,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF1211,Warning,TF 1211: Lock Escalation should be enabled,Disable trace flag 1211 to allow lock escalation,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1211 disables lock escalation based on memory pressure, or based on number of locks. Because SQL Server will not escalate row or page locks to table locks, this can generate an excessive number of locks. If the lock memory grows large enough, attempts to allocate additional locks for any query may fail and cause performance issues. This trace flag should not be used in order to avoid inability to allocate lock resources because of insufficient memory. If lock escalation needs to be disabled, use trace flag 1224 instead.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF1222,Information,TF 1222 returns deadlock information,Trace Flag 1222 returns deadlock information,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1222 returns the resources and types of locks that are participating in a deadlock, including the affected command. The resulting information is recorded in the SQL Server Errorlog, in XML format that does not comply with any XSD schema.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF1224,Warning,TF 1224 should be disabled,Disable trace flag 1224 to allow lock escalation,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']","Trace Flag 1224 disables lock escalation based on the number of locks, unless SQL Server is under memory pressure. Because SQL Server will not escalate row or page locks to table locks, this can generate an excessive number of locks.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF1229,Warning,TF 1229: Lock Partitioning should be enabled,Disable trace flag 1229 to allow lock partitioning,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance', 'CPU']","Trace Flag 1229 disables lock partitioning regardless of the number of CPUs. By default, SQL Server enables lock partitioning when a server has 16 or more CPUs, to improve the scalability characteristics of larger systems. Disabling lock partitioning may cause can cause spinlock contention and poor performance, or unexpected behaviors when switching partitions.",https://docs.microsoft.com/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF1236,Warning,TF 1236: Database Lock Partitioning should be enabled,Enable trace Flag 1236 to allow database lock partitioning,"['DefaultRuleset', 'TraceFlag', 'Locks', 'Performance']",Trace Flag 1236 enables database-level lock partitioning. Lock Partitioning is utilized to improve the scalability characteristics on larger systems.,https://support.microsoft.com/help/2926217,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF1462,Warning,TF 1462 should be disabled to allow Log Stream Compression,Disable trace flag 1462 to allow log stream compression,"['DefaultRuleset', 'TraceFlag', 'Performance', 'AvailabilityGroups']",Trace Flag 1462 disables log stream compression for asynchronous availability groups. This feature is enabled by default on asynchronous replicas to optimize network bandwidth.,https://docs.microsoft.com/sql/database-engine/availability-groups/windows/tune-compression-for-availability-group,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF2312,Warning,TF 2312 sets the default Cardinality Estimation model,Trace Flag 2312 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace Flag 2312 sets the Query Optimizer cardinality estimation model to the default version of the database compability level of SQL Server 2014 and higher versions. If the database compatibility level is lower than 120, enabling trace flag 2312 uses the cardinality estimation model of SQL Server 2014 (120).",https://support.microsoft.com/help/2801413,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF2330,Warning,TF 2330 disables recording of index usage stats,Trace Flag 2330 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Indexes']","Trace Flag 2330 disables recording of index usage stats, which could lead to a non-yielding condition in SQL 2005.",https://blogs.msdn.microsoft.com/ialonso/2012/10/08/faq-around-sys-dm_db_index_usage_stats,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF2340,Information,TF 2340 disables Batch Sorts for optimized nested loops joins,Trace Flag 2340 disables Batch Sorts for optimized nested loops joins,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']",Trace Flag 2340 causes SQL Server not to use a sort operation (batch sort) for optimized nested loops joins when generating a plan. Verify need to set a non-default trace flag with the current system build and configuration.,https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF2371,Information,TF 2371 enables a linear recompilation threshold for statistics,Enable trace Flag 2371 to allow a linear recompilation threshold for statistics,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Statistics']",Trace Flag 2371 causes SQL Server to change the fixed update statistics threshold to a linear update statistics threshold. This is especially useful to keep statistics updated on large tables.,https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF2389,Information,TF 2389 enables automatic statistics for Ascending Keys,Trace Flag 2389 enables automatic statistics for ascending keys. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Statistics', 'Performance']","Trace Flag 2389 enables automatically generated quick statistics for ascending keys (histogram amendment). This trace flag is recommended to be set in cases where queries access newly inserted ascending key values (such as an IDENTITY column), but the new values are not yet updated in the statistics histogram for the affected columns. In this case the histogram used to estimate cardinality will be adjusted at query compile time. Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2801413,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +TF2390,Information,TF 2390 enables automatic statistics for Ascending or Unknown Keys,Trace Flag 2390 enables automatic statistics for ascending or unknown keys. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Statistics', 'Performance', 'Indexes']","Trace Flag 2390 enables automatically generated quick statistics for ascending or unknown keys (histogram amendment). This trace flag is recommended to be set in cases where queries access newly inserted ascending key values (such as an IDENTITY column), but the new values are not yet updated in the statistics histogram for the affected columns. In this case the histogram used to estimate cardinality will be adjusted at query compile time. Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2801413,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +TF2528,Warning,TF 2528 disables parallel operations for integrity checking,Trace Flag 2528 disables parallel operations for integrity checking,"['DefaultRuleset', 'TraceFlag', 'DataIntegrity', 'DBCC']","Trace Flag 2528 disables parallel checking of objects by DBCC CHECKDB, DBCC CHECKFILEGROUP, and DBCC CHECKTABLE. By default, the degree of parallelism is automatically determined by the query processor. The maximum degree of parallelism is configured just like that of parallel queries. When parallel checks are disabled, the DBCC commands will take longer to complete. Starting with SQL Server 2014 SP2, a MAXDOP option is available to override the max degree of parallelism configuration option of sp_configure for the DBCC statements.",https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF2549,Warning,TF 2549 optimizes PHYSICAL_ONLY option of DBCC CHECKDB,Trace Flag 2549 forces DBCC CHECKDB to treat different physical files as one logical file,"['DefaultRuleset', 'TraceFlag', 'DBCC']","Trace Flag 2549 forces the DBCC CHECKDB command to assume each database file is on a unique disk drive but treating different physical files as one logical file. This trace flag can improve the performance when using the PHYSICAL_ONLY option, but it's not recommended unless it is known that each file is based on a unique physical disk.",https://support.microsoft.com/help/2634571,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF2562,Warning,TF 2562 forces the DBCC CHECKDB command to execute in a single batch,Trace Flag 2562 forces the DBCC CHECKDB command to execute in a single batch,"['DefaultRuleset', 'TraceFlag', 'DBCC', 'TempDB']","Trace Flag 2562 forces the DBCC CHECKDB command to execute in a single batch regardless of the number of indexes in the database. This trace flag can improve the performance when using the PHYSICAL_ONLY option, but space requirements for TempDB may increase.",https://support.microsoft.com/help/2634571,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF2566,Warning,TF 2566 disables default data purity check,Trace Flag 2566 disables default data purity check,"['DefaultRuleset', 'TraceFlag', 'DBCC', 'DataIntegrity']","Trace Flag 2566 forces the DBCC CHECKDB command to execute without data purity check unless the DATA_PURITY option is specified. For databases upgraded from earlier versions of SQL Server, it is recommended to run the DBCC CHECKDB WITH DATA_PURITY command at least once, to enable column-value integrity checks to happen by default.",https://support.microsoft.com/help/945770,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF3023,Information,TF 3023 enables Backup Checksum option by default,Trace Flag 3023 enables CHECKSUM option as default for BACKUP command,"['DefaultRuleset', 'TraceFlag', 'Backup']","Trace Flag 3023 enables the CHECKSUM option of the BACKUP command by default. This trace flag forces the CHECKSUM option for BACKUP command even when not explicitely set. Starting with SQL Server 2014, this behavior is controlled by setting the Backup Checksum Default configuration option.",https://support.microsoft.com/help/2656988,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF3042,Information,TF 3042 bypasses the default backup compression pre-allocation algorithm,Trace Flag 3042 enables the bypass of the default backup compression,"['DefaultRuleset', 'TraceFlag', 'Backup']","Trace Flag 3042 bypasses the default backup compression pre-allocation algorithm to allow the backup file to grow only as needed to reach its final size. This trace flag can achieve space savings by allocating only the actual size required for the compressed backup, but might increase the overall backup operation time.",https://docs.microsoft.com/sql/relational-databases/backup-restore/backup-compression-sql-server,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF3226,Information,TF 3226 disables ErrorLog entries for every successful backup operation,Trace Flag 3226 disables ErrorLog entries for every successful backup operation,"['DefaultRuleset', 'TraceFlag', 'Backup']",Trace Flag 3226 prevents SQL Server from recording an entry to the Errorlog on every successful backup operation. Backup operations are registered in the Errorlog by default. Frequent backup operations can contribute to massive Errorlog files that become unwieldy.,https://docs.microsoft.com/sql/t-sql/database-console-commands/dbcc-traceon-trace-flags-transact-sql,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF4136,Warning,TF 4136 disables Parameter Sniffing,Trace Flag 4136 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag']","Trace Flag 4136 disables parameter sniffing unless OPTION(RECOMPILE), WITH RECOMPILE or OPTIMIZE FOR value is used, but does not apply to this SQL Server version. Starting with SQL Server 2016, to accomplish this at the database level use the PARAMETER_SNIFFING option in ALTER DATABASE SCOPED CONFIGURATION. Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/980653,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF4137,Warning,TF 4137 causes plans to use partial correlation for filters,Trace flag 4137 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace Flag 4137 causes SQL Server to generate a plan using minimum selectivity when estimating AND predicates for filters to account for partial correlation instead of independence, under the query optimizer cardinality estimation model of SQL Server 2012 and earlier versions (CE 70). However it does not apply to this SQL Server version. Does not apply to CE version 120 or above. Use trace flag 9471 instead. Starting with SQL Server 2016 SP1, to accomplish this at the query level use the USE HINT 'ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES' query hint. Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2658214,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF4138,Warning,TF 4138 causes plans to not use Row Goal adjustments,Trace flag 4138 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace Flag 4138 causes SQL Server to generate a plan that does not use row goal adjustments with queries that contain TOP, OPTION (FAST N), IN, or EXISTS keywords. Starting with SQL Server 2016 SP1, to accomplish this at the query level use the USE HINT 'DISABLE_OPTIMIZER_ROWGOAL' query hint. However it does not apply to this SQL Server version. Verify need to set a Non-default trace flag with current system build and configuration.",https://support.microsoft.com/help/2667211,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF4139,Warning,TF 4139 enables automatic statistics for any key ordering,Trace flag 4139 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Statistics']","Trace Flag 4139 enables automatically generated quick statistics (histogram amendment) regardless of key column status. However, this trace flag does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration.",https://support.microsoft.com/help/2952101,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TF4199,Information,TF 4199 enables Query Optimizer fixes,Trace Flag 4199 enables Query Optimizer fixes. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer']",Trace Flag 4199 enables Query Optimizer fixes released in SQL Server Cumulative Updates and Service Packs.,http://support.microsoft.com/help/974006,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[11.0, 14.0)",,, +TF6498,Warning,TF 6498 enables additional concurrent large queries,Trace Flag 6498 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance', 'Memory']","Trace Flag 6498 enables more than one large query compilation to gain access to the big gateway when there is sufficient memory available. However, this trace flag does not apply to this SQL Server version. This trace flag can be used to keep memory usage for the compilation of incoming queries under control, avoiding compilation waits for concurrent large queries. Starting with SQL Server 2014 SP2 and SQL Server 2016, this behavior is controlled by the engine and trace flag 1236 has no effect.",https://support.microsoft.com/help/3024815,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF6532,Information,TF 6532 enables performance improvements for Spatial data,Enable trace flag 6532 to enable performance improvements for Spatial data,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace Flag 6532 enables performance improvements of query operations with spatial data types. The performance gain will vary, depending on the configuration, the types of queries, and the objects.",https://support.microsoft.com/help/3107399,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0.6020,11.0.6518)",,, +TF6532.6533,Warning,TF 6532 and TF 6533 enable performance improvements for Spatial data,Trace flags 6532 and 6533 do not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace flags 6532 and 6533 enable performance improvements of query operations with spatial data types. However, this trace flag does not apply to this SQL Server version. Starting with SQL Server 2016, this behavior is controlled by the engine and trace flags 6532 and 6533 have no effect.",https://support.microsoft.com/help/3107399,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF6534,Warning,TF 6534 enables performance improvements for Spatial data,Trace flag 6534 does not apply to this SQL Server version. Verify need to set a non-default trace flag with the current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance']","Trace Flag 6534 enables performance improvement of query operations with spatial data types. However, this trace flag does not apply to this SQL Server version. Verify need to set a Non-default trace flag with current system build and configuration.",https://support.microsoft.com/help/3107399,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF7412,Information,TF 7412 enables the lightweight profiling infrastructure for live query performance troubleshooting,Enable trace flag 7412 to enables the lightweight profiling infrastructure for live query performance troubleshooting,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace Flag 7412 enables the lightweight profiling infrastructure for live query performance troubleshooting. Consider enabling TF 7412 to have the ability to access runtime information on query execution plans for any session.,https://docs.microsoft.com/sql/relational-databases/performance/query-profiling-infrastructure,['EnabledGlobalTraceFlags'],Server,"['Windows', 'Linux']",OnPremises,"[13.0.4001,15.0)",,, +TF9024,Warning,TF 9024 converts a global log pool memory object into NUMA node partitioned memory object,Verify need to set a Non-default TF with current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance', 'NUMA', 'Memory', 'CPU']",TF9024 converts a global log pool memory object into NUMA node partitioned memory object.,https://support.microsoft.com/help/2809338/fix-high-log-write-waits-counter-value-on-a-sql-server-2012-or-sql-ser,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,,,, +TF8048,Warning,TF 8048 converts NUMA partitioned memory objects into CPU partitioned,Verify need to set a Non-default TF with current system build and configuration,"['DefaultRuleset', 'TraceFlag', 'Performance', 'NUMA', 'CPU', 'Memory']",TF 8048 converts NUMA partitioned memory objects into CPU partitioned.,https://support.microsoft.com/help/2809338/fix-high-log-write-waits-counter-value-on-a-sql-server-2012-or-sql-ser,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,,,, +DeprecatedFeatures,Warning,Deprecated or discontinued features should not be used,Detected deprecated or discontinued feature uses: @{DeprecatedFeature}. We recommend to replace them with features actual for SQL Server version @{ProductVersion},"['DefaultRuleset', 'Deprecated', 'Security', 'UpdateIssues', 'Performance']",This check detects deprecated or discontinued features used on target SQL Server instance. Deprecated features may be removed in a future release of SQL Server. Discontinued features have been removed from specific versions of SQL Server.,https://docs.microsoft.com/sql/relational-databases/performance-monitor/sql-server-deprecated-features-object,"['DeprecatedFeaturesStats', 'SQLServerVersion']",Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",, +SystemHealthSession,Warning,system_health XEvent session is not active,Start the session by using the ALTER EVENT SESSION statement or by using the Extended Events node in Object Explorer,"['DefaultRuleset', 'XEvent', 'SystemHealth']","This session starts automatically when the SQL Server Database Engine starts, and runs without any noticeable performance effects. The session collects system data that you can use to help troubleshoot performance issues in the Database Engine. We recommend that you do not stop, alter, or delete the system health session.",https://docs.microsoft.com/sql/relational-databases/extended-events/use-the-system-health-session,['XEvent.SystemHealth'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +SPServerDiagnosticsSession,Warning,sp_server_diagnostics xEvent session is not active,Start the session by using the ALTER EVENT SESSION statement or by using the Extended Events node in Object Explorer,"['DefaultRuleset', 'XEvent', 'SystemHealth']","This session starts automatically when the SQL Server Database Engine starts, and runs without any noticeable performance effects. The session collects system data that you can use to help troubleshoot performance issues in the Database Engine. We recommend that you do not stop, alter, or delete the system health session.",https://docs.microsoft.com/sql/relational-databases/system-stored-procedures/sp-server-diagnostics-transact-sql,['XEvent.SPServerDiagnostics'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +BlackboxTrace,Warning,Blackbox trace is configured and running,Make sure you still need the blackbox trace and stop it otherwise,"['DefaultRuleset', 'Traces']","This trace is designed to behave similarly to an airplane black box, to help you diagnose intermittent server crashes. It consumes more resources than the default trace and should not be running for extended periods of time.",https://docs.microsoft.com/sql/relational-databases/system-stored-procedures/sp-trace-create-transact-sql,['CountBlackBoxTraces'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +DefaultTrace,Warning,No default trace was found or is not active,Make sure that there is enough space for SQL Server to write the default trace file. Then have the default trace run by disabling and re-enabling it,"['DefaultRuleset', 'Traces']",Default trace provides troubleshooting assistance to database administrators by ensuring that they have the log data necessary to diagnose problems the first time they occur.,https://docs.microsoft.com/sql/relational-databases/policy-based-management/default-trace-log-files-disabled,['CountDefaultTraces'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +HintsStatistics,Information,Hints are being used,"We recommend that , , and be used only as a last resort by experienced developers and database administrators, because the SQL Server Query Optimizer typically selects the best execution plan for a query","['DefaultRuleset', 'QueryOptimizer', 'Performance', 'Statistics']","Hints are options or strategies specified for enforcement by the SQL Server query processor on SELECT, INSERT, UPDATE, or DELETE statements. The hints override any execution plan the Query Optimizer might select for a query. Because the SQL Server Query Optimizer typically selects the best execution plan for a query, we recommend that , , and be used only as a last resort by experienced developers and database administrators.",https://docs.microsoft.com/sql/t-sql/queries/hints-transact-sql,['Hints.InstanceStatistics'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +HintsUsageInModules,Information,Hints usage in modules,@{Hint} was used in @{type_desc} @{Schema_Name}.@{Object_Name},"['DefaultRuleset', 'QueryOptimizer', 'Performance', 'Statistics']","Hints are options or strategies specified for enforcement by the SQL Server query processor on SELECT, INSERT, UPDATE, or DELETE statements. The hints override any execution plan the Query Optimizer might select for a query. Because the SQL Server Query Optimizer typically selects the best execution plan for a query, we recommend that , , and be used only as a last resort by experienced developers and database administrators.",https://docs.microsoft.com/sql/t-sql/queries/hints-transact-sql,['Hints.ModuleUsage'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +PlansUseRatio,Warning,Amount of single use plans in cache is high,Amount of single use plans in cache is high (@{SingleUsePlansUseRatio:P0}). Consider enabling the Optimize for ad hoc workloads setting on heavy OLTP ad-hoc workloads to conserve resources,"['DefaultRuleset', 'Performance', 'QueryOptimizer']",Single use plans waste system resources.,https://docs.microsoft.com/sql/database-engine/configure-windows/optimize-for-ad-hoc-workloads-server-configuration-option,['CachedPlans.SingleUseRatio'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +HypotheticalIndexes,Warning,Hypothetical indexes found,Index @{IndexName} for @{Schema}.@{Object} is marked as hypothetical. It is recommended to drop hypothetical index @{IndexName} as soon as possible,"['DefaultRuleset', 'Indexes', 'Performance']","Database has indexes that are marked as hypothetical. Hypothetical indexes are created by the Database Tuning Assistant (DTA) during its tests. If a DTA session was interrupted, these indexes may not be deleted. It is recommended to drop these objects as soon as possible.",https://blogs.technet.microsoft.com/anurag_sharma/2008/04/15/hypothetical-indexes,['Hypothetical.Indexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +HypotheticalStatistics,Warning,Hypothetical statistics found,Statistics @{StatName} for @{Schema}.@{Object} is hypothetical. It is recommended to drop hypothetical statistics @{StatName} as soon as possible,"['DefaultRuleset', 'Statistics']","Database has statistics that are marked as hypothetical. Hypothetical statistics are created by the Database Tuning Assistant (DTA) during its tests. If a DTA session was interrupted, these statistics may not be deleted. It is recommended to drop these objects as soon as possible.",https://blogs.technet.microsoft.com/anurag_sharma/2008/04/15/hypothetical-indexes,['Hypothetical.Statistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +LatestCU,Warning,SQL Server instance is not up to date,Product version @{ProductVersion} is not the latest available. We recommend keeping your SQL Server up to date and install Service Packs and Cumulative Updates as they are released,"['DefaultRuleset', 'Security', 'UpdateIssues']","On an installed instance of SQL Server, we recommend that you apply the latest security updates and critical updates including general distribution releases (GDRs), service packs (SPs), and cumulative updates (CUs).",https://support.microsoft.com/help/321185/how-to-determine-the-version-edition-and-update-level-of-sql-server-an,['SQLServerVersion'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +FKNoIndexes,Warning,Foreign key constraints should have corresponding indexes,Create a corresponding index for each foreign key. There is no index on the following foreign keys: @{ConstraintName},"['DefaultRuleset', 'Performance', 'Indexes']","Unlike primary key constraints, creating a foreign key constraint does not automatically create a corresponding index. However, manually creating an index on a foreign key is often useful.",https://docs.microsoft.com/sql/relational-databases/tables/primary-and-foreign-key-constraints,['FKNoIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +MissedIndexes,Information,Potentially missing indexes,Create an index on @{Table} with key columns @{KeyCols}@{IncludedCols: and included columns: #},"['DefaultRuleset', 'Performance', 'Indexes']",Potentially missing indexes were found based on query history. It may be important to revise them.,https://docs.microsoft.com/sql/relational-databases/sql-server-index-design-guide,['MissedIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +FullBackup,Warning,Full backup is missed or outdated,The last full backup had been created more than @{threshold} days ago. Create a new full backup,"['DefaultRuleset', 'Backup']",Database doesn't have any full backup or the latest full backup is over 7 days.,https://docs.microsoft.com/sql/relational-databases/backup-restore/create-a-full-database-backup-sql-server,['DatabaseBackups'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['model', 'tempdb']",7, +OutdatedTranLogBackup,Warning,Transaction Log backup is missed or outdated,Create a backup of Transaction Log. Database recovery model: @{recovery_model_desc},"['DefaultRuleset', 'Backup']","Database does not have any transaction Log backup since the latest full or differential backup, or it's older than 24H.",https://docs.microsoft.com/sql/relational-databases/backup-restore/back-up-a-transaction-log-sql-server,['DatabaseBackups'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +DbDiffCollation,Warning,Database collation doesn't match the collation of master,Keep database collation the same as the collation for master or model,"['DefaultRuleset', 'DBConfiguration', 'Collation']","We recommend that the collations of user-defined databases match the collation of master or model. Otherwise, collation conflicts can occur that might prevent code from executing. For example, when a stored procedure joins one table to a temporary table, SQL Server might end the batch and return a collation conflict error if the collations of the user-defined database and the model database are different. This occurs because temporary tables are created in tempdb, which bases its collation on that of model.",https://docs.microsoft.com/sql/database-engine/set-collation-user-defined-databases-match-master-model-databases,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AutoClose,Warning,Auto Close Option should be OFF,Set AUTO_CLOSE option to OFF,"['DefaultRuleset', 'Performance', 'DBConfiguration']","When AUTO_CLOSE is set ON, this can cause performance degradation on frequently accessed databases because of the increased overhead of opening and closing the database after each connection. AUTO_CLOSE also flushes the procedure cache after each connection.",https://docs.microsoft.com/sql/relational-databases/policy-based-management/set-the-auto-close-database-option-to-off,['DatabaseConfiguration'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'msdb', 'tempdb']",, +AutoShrink,Warning,Auto Shrink Option should be OFF,Set AUTO_SHRINK option to OFF,"['DefaultRuleset', 'DBConfiguration', 'Performance']","Shrinking databases is the fastest way to achieve fragmentation. SQL Server goes to the last page in the database, moves it to the first free available space, and then repeats the process again. This shuffles the deck, putting your pages out of order.",https://blogs.msdn.microsoft.com/buckwoody/2009/07/01/sql-server-best-practices-auto-shrink-should-be-off,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'msdb', 'tempdb']",, +PageVerify,Warning,PAGE_VERIFY option should be CHECKSUM,Set PAGE_VERIFY option to CHECKSUM,"['DefaultRuleset', 'DBConfiguration', 'DataIntegrity']","When CHECKSUM is enabled for the PAGE_VERIFY database option, the SQL Server Database Engine calculates a checksum over the contents of the whole page, and stores the value in the page header when a page is written to disk. When the page is read from disk, the checksum is recomputed and compared to the checksum value that is stored in the page header. This helps provide a high level of data-file integrity.",https://docs.microsoft.com/sql/relational-databases/policy-based-management/set-the-page-verify-database-option-to-checksum,['DatabaseConfiguration'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'msdb', 'tempdb']",, +DbChaining,Warning,Cross-Database Access should be disabled,Set DB_CHAINING option to OFF,"['DefaultRuleset', 'DBConfiguration', 'Security']",Ownership chaining across databases is turned off by default. Microsoft recommends that you disable cross-database ownership chaining because it exposes you to the additional security risks.,https://docs.microsoft.com/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'msdb', 'tempdb']",, +AutoCreateStatsIncremental,Warning,Incremental option of auto stats should be ON,Set AUTO_CREATE_STATISTICS to ON and set INCREMENTAL to ON,"['DefaultRuleset', 'DBConfiguration', 'Statistics', 'Performance']","Incremental statistics update at partition level is a feature introduced in SQL Server 2014. When the option INCREMENTAL is turn on at the database level, newly auto created column statistics will use incremental statistics on partitioned tables by default.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'msdb', 'tempdb']",, +TrustWorthy,Warning,TRUSTWORTHY should be OFF,Set TRUSTWORTHY option to OFF,"['DefaultRuleset', 'DBConfiguration', 'Security']","You can use the TRUSTWORTHY database setting to indicate whether the instance of Microsoft SQL Server trusts the database and the contents within the database. By default, this setting is set to OFF to mitigate certain threats that may be present when a database is attached to the server.",https://support.microsoft.com/help/2183687/guidelines-for-using-the-trustworthy-database-setting-in-sql-server,['DatabaseConfiguration'],Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'msdb', 'tempdb']",, +ParameterizationNotSimple,Warning,PARAMETERIZATION should be SIMPLE,"Set PARAMETERIZATION = SIMPLE and use forced parameterization only on a certain class of queries, instead of all queries","['DefaultRuleset', 'DBConfiguration', 'Performance', 'QueryOptimizer']","When the PARAMETERIZATION database option is set to SIMPLE, the SQL Server query optimizer may choose to parameterize the queries. This means that any literal values that are contained in a query are substituted with parameters. This process is referred to as simple parameterization. When SIMPLE parameterization is in effect, you cannot control which queries are parameterized and which queries are not. However, you can specify that all queries in a database be parameterized by setting the PARAMETERIZATION database option to FORCED. Regardless of whether you have a Plan-Stability or not, SQL Server will always auto parameterize your SQL Statements, and reuse the cached execution plan over and over again. It doesn't matter how terrible the execution plan is. Therefore you have to know in exact detail the shape of your execution plans, and whether they can lead to some performance related problems.",https://docs.microsoft.com/sql/relational-databases/performance/specify-query-parameterization-behavior-by-using-plan-guides,['DatabaseConfiguration'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'msdb', 'tempdb']",, +TempDBFilesNotSameSize,Warning,TempDB data files are not the same size,Make all TempDB data files the same size,"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']",We recommend that you create all TempDB data files at the same size.,https://support.microsoft.com/kb/2154845,['TempDBFiles'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TempDBFilesMultiple4,Warning,Number of TempDB data files should be in multiples of 4,Make sure number of TempDB data files is in multiples of 4,"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","Number of TempDB data files should correlate with the number of (logical) processors on the machine. As a general rule, if the number of logical processors is less than or equal to 8, use the same number of data files as logical processors. If the number of logical processors is greater than 8, use 8 data files and then if contention continues, increase the number of data files by multiples of 4 until the contention is reduced to acceptable levels or make changes to the workload/code.",https://support.microsoft.com/kb/2154845,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'physical_name': 'count'}}}, 'ServerInstanceConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TempDBFiles1PerCPU,Warning,Number of TempDB data files should depend on CPU count,Make sure to have 1 data file per logical processor (processors count: @{online_logical_processors}),"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","Number of TempDB data files should correlate with the number of (logical) processors on the machine. As a general rule, if the number of logical processors is less than or equal to 8, use the same number of data files as logical processors. If the number of logical processors is greater than 8, use 8 data files and then if contention continues, increase the number of data files by multiples of 4 until the contention is reduced to acceptable levels or make changes to the workload/code.",https://support.microsoft.com/kb/2154845,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'physical_name': 'count'}}}, 'ServerInstanceConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TempDBFilesNotLess8,Warning,Number of TempDB data files should be at least 8,"Add extra data files to TempDB. There are @{physical_name} data files, should be at least 8","['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","Number of TempDB data files should correlate with the number of (logical) processors on the machine. As a general rule, if the number of logical processors is less than or equal to 8, use the same number of data files as logical processors. If the number of logical processors is greater than 8, use 8 data files and then if contention continues, increase the number of data files by multiples of 4 until the contention is reduced to acceptable levels or make changes to the workload/code.",https://support.microsoft.com/kb/2154845,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'physical_name': 'count'}}}, 'ServerInstanceConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +TempDBFilesAutoGrowth,Warning,TempDB data files have different auto growth settings,Make Autogrowth settings the same for each TempDB data file,"['DefaultRuleset', 'TempDB', 'Performance', 'DBFileConfiguration']","TempDB data files should be of equal size within each filegroup, as SQL Server uses a proportional-fill algorithm that favors allocations in files with more free space.",https://docs.microsoft.com/sql/relational-databases/databases/tempdb-database,"[{'id': 'DatabaseMasterFiles', 'params': {'dbId': 2, 'type': 0}, 'transform': {'type': 'aggregate', 'map': {'growth': 'count', 'is_percent_growth': 'count'}}}]",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +FilesAutogrowth,Warning,Database files have Autogrowth setting over 1GB,Set File Growth to less than 1GB for files: @{FileName},"['DefaultRuleset', 'Performance', 'DBFileConfiguration']","A data or log file will be extended with auto-growth value to prevent the lack of free space in files. This process can perform significant impact on SQL Server performance if auto-growth value gets over 1 GB. By default, SQL Server will put zeros to a newly allocated space. And the more space it takes, the more time it takes to initialize it.",https://support.microsoft.com/help/315512/considerations-for-the-autogrow-and-autoshrink-settings-in-sql-server,['Autogrow1GB'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0.4001,)",,, +DuplicateIndexes,Warning,There are tables with duplicate indexes,Consider removing duplicate indexes in table @{Table}: @{ToDelete},"['DefaultRuleset', 'Performance', 'Indexes']",There are tables with duplicate indexes according to their definitions. We recommended to revise all these objects as soon as possible.,https://docs.microsoft.com/sql/relational-databases/sql-server-index-design-guide,"[{'id': 'IndexesDefinitions', 'transform': {'type': 'duplicateIndexes'}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +RedundantIndexes,Warning,There are tables with possibly redundant indexes,Consider removing redundant indexes in table @{Table}: @{Indexes},"['DefaultRuleset', 'Performance', 'Indexes']",There are tables with possibly redundant indexes according to the set of key and included columns. We recommended to revise all these objects as soon as possible.,https://docs.microsoft.com/sql/relational-databases/sql-server-index-design-guide,"[{'id': 'IndexesDefinitions', 'transform': {'type': 'redundantIndexes'}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +UserObjectsInMaster,Warning,User objects in database master,Remove user objects from database master: @{Object_Name},"['DefaultRuleset', 'masterDB', 'Backup']","We highly recommend you not create user objects in the master database. If it's unavoidable for some reason, make sure to back up the database more frequently.",https://docs.microsoft.com/sql/relational-databases/databases/master-database,['UserObjectsCountInMasterDB'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +HighCPUUsage,Warning,High CPU usage on server,"Investigate high CPU utilization on server hosting this instance. Last 2 hours: total CPU usage is ~@{AVGTotalCPUUsage}%, usage by SQL Server is ~@{AVGSQLCPUUsage}%","['DefaultRuleset', 'Performance', 'CPU']","Keeping CPU usage rates within normal ranges is vital for servers hosting SQL Server instances. A continually high rate of CPU usage may indicate the need to upgrade the CPU or add multiple processors. Alternatively, a high CPU usage rate may indicate a poorly tuned or designed application. Optimizing the application can lower CPU utilization.",https://docs.microsoft.com/sql/relational-databases/performance-monitor/monitor-cpu-usage,['CpuUsage'],Server,Windows,"OnPremises, ManagedInstance","[11.0,)",,70, +ReplErrors24H,Warning,Replication errors in the last 24 hours,Review replication errors for the following publications: @{publication},"['DefaultRuleset', 'Replication']",This check searches for errors in distribution database agent's history table for the last 24 hours.,https://docs.microsoft.com/sql/relational-databases/replication/sql-server-replication,['ReplicationErrors'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity10,Warning,Agent doesn't rise alerts for errors with severity 10,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity16,Warning,Agent doesn't rise alerts for errors with severity 16,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity17,Warning,Agent doesn't rise alerts for errors with severity 17,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity19,Warning,Agent doesn't rise alerts for errors with severity 19,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity20,Warning,Agent doesn't rise alerts for errors with severity 20,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity21,Warning,Agent doesn't rise alerts for errors with severity 21,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity22,Warning,Agent doesn't rise alerts for errors with severity 22,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity23,Warning,Agent doesn't rise alerts for errors with severity 23,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +AgentAlertsSeverity24,Warning,Agent doesn't rise alerts for errors with severity 24,Consider creating alerts for the following errors: @{error_ids},"['DefaultRuleset', 'Agent']","Events are generated by SQL Server and entered into the Microsoft Windows application log. SQL Server Agent reads the application log and compares events written there to alerts that you have defined. When SQL Server Agent finds a match, it fires an alert, which is an automated response to an event. In addition to monitoring SQL Server events, SQL Server Agent can also monitor performance conditions and Windows Management Instrumentation (WMI) events.",https://docs.microsoft.com/sql/ssms/agent/alerts,['SysAlerts'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +WeakPassword,Warning,Weak password,Make sure to set strong passwords on the following logins: @{PasswordData},"['DefaultRuleset', 'Security', 'WeakPassword']",Some user logins have weak passwords.,https://docs.microsoft.com/sql/relational-databases/security/strong-passwords,['WeakPassword'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +VLFCount,Warning,VLF count,Update transaction log settings to reduce the number of VLFs (current number is: @{RecoveryUnitId}),"['DefaultRuleset', 'Backup', 'Performance']","The SQL Server Database Engine divides each physical log file internally into a number of virtual log files (VLFs). Virtual log files have no fixed size, and there is no fixed number of virtual log files for a physical log file. The Database Engine chooses the size of the virtual log files dynamically while it is creating or extending log files. The Database Engine tries to maintain a small number of virtual files. The size of the virtual files after a log file has been extended is the sum of the size of the existing log and the size of the new file increment. The size or number of virtual log files cannot be configured or set by administrators. If the log files grow to a large size in many small increments, they will have many virtual log files. This can slow down database startup and also log backup and restore operations. Conversely, if the log files are set to a large size with few or just one increment, they will have few very large virtual log files. We recommend that you assign log files a size value close to the final size required, using the required increments to achieve optimal VLF distribution, and also have a relatively large growth_increment value.",https://docs.microsoft.com/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide,"[{'id': 'VLF', 'transform': {'type': 'aggregate', 'map': {'RecoveryUnitId': {'type': 'count', 'distinct': False}}}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,50, +TF8015,Warning,TF 8015 disables auto-detection and NUMA setup,Disable trace flag 8015 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'CPU', 'NUMA']","SQL Server allows you to group CPUs into nodes referred to as soft-NUMA. You usually configure soft-NUMA when you have many CPUs and do not have hardware NUMA, but you can also use soft-NUMA to subdivide hardware NUMA nodes into smaller groups.",https://techcommunity.microsoft.com/t5/SQL-Server-Support/How-It-Works-Soft-NUMA-I-O-Completion-Thread-Lazy-Writer-Workers/ba-p/316044,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,11.0.3349)",,, +TF8032,Warning,TF 8032 reverts the cache limit parameters to the SQL Server 2005 RTM,The cache limit parameters reverted to the SQL Server 2005 RTM setting but can cause poor performance if large caches make less memory available for other memory consumers like BP,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace Flag 8032 reverts the cache limit parameters to the SQL Server 2005 RTM setting but can cause poor performance if large caches make less memory available for other memory consumers like BP.,,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,)",,, +TF8744,Warning,TF 8744 disables pre-fetching for the Nested Loop operator,Disable trace flag 8744 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace flag 8744 disables pre-fetching for the Nested Loops operator. Incorrect use of this trace flag may cause additional physical reads when SQL Server executes plans that contain the Nested Loops operator.,https://support.microsoft.com/help/920093/tuning-options-for-sql-server-when-running-in-high-performance-workloa,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,12.0)",,, +TF9347,Warning,TF 9347 disables batch mode for sort operator,Disable trace flag 9347 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace flag 9347 disables batch mode for sort operator. SQL Server 2016 (13.x) introduced a new batch mode sort operator that boosts performance for many analytical queries.,,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,, +TF9349,Warning,TF 9349 disables batch mode for top N sort operator,Disable trace flag 9349 for this SQL Server instance. This TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance']",Trace flag 9349 disables batch mode for top N sort operator. SQL Server 2016 (13.x) introduced a new batch mode top sort operator that boosts performance for many analytical queries.,,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,, +TF9389,Warning,TF 9389 enables dynamic memory grant for batch mode operators,Disable trace flag 9389 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance', 'TempDB']","Trace flag 9389 enables additional dynamic memory grant for batch mode operators. If a query does not get all the memory it needs, it spills data to TempDB, incurring additional I/O and potentially impacting query performance. If the dynamic memory grant trace flag is enabled, a batch mode operator may ask for additional memory and avoid spilling to TempDB if additional memory is available.",,['EnabledGlobalTraceFlags'],Server,Windows,"OnPremises, ManagedInstance","[11.0,13.0)",,, +TF9476,Warning,TF 9476 causes SQL Server to generate a plan using Simple Containment assumption,Disable trace flag 9476 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance', 'QueryOptimizer']","Trace flag 9476 causes SQL Server to generate a plan using the Simple Containment assumption instead of the default Base Containment assumption, under the query optimizer cardinality estimation model of SQL Server 2014 (12.x) through SQL Server 2017 versions.",,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,, +TF9481,Warning,"TF 9481 enables Legacy CE model, irrespective of the compatibility level of the database",Disable trace flag 9481 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'QueryOptimizer', 'Performance']","Trace flag 9481 enables you to set the query optimizer cardinality estimation model to the SQL Server 2012 (11.x) and earlier versions, irrespective of the compatibility level of the database.",,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,12.0)",,, +TF10204,Warning,TF 10204 disables merge/recompress during columnstore index reorganization,Disable trace flag 10204 for this SQL Server instance. The TF does not apply to this SQL Server version,"['DefaultRuleset', 'TraceFlag', 'Performance', 'ColumnStore']","Trace flag 10204 disables merge/recompress during columnstore index reorganization. In SQL Server 2016 (13.x), when a columnstore index is reorganized, there is new functionality to automatically merge any small compressed rowgroups into larger compressed rowgroups, as well as recompressing any rowgroups that have a large number of deleted rows.",,['EnabledGlobalTraceFlags'],Server,Windows,OnPremises,"[11.0,13.0)",,, +SPNaming,Warning,Stored Procedure Naming,Rename the following stored procedures to get rid of the sp_ prefix: @{ObjectName},"['DefaultRuleset', 'Naming']","In SQL Server, the sp_ prefix designates system stored procedures. If you use that prefix for your stored procedures, the name of your procedure might conflict with the name of a system stored procedure that will be created in the future. If such a conflict occurs, your application might break if your application refers to the procedure without qualifying the reference by schema. In this situation, the name will bind to the system procedure instead of to your procedure.",https://docs.microsoft.com/previous-versions/visualstudio/visual-studio-2010/dd172115(v=vs.100),['BadNamingSP'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +ObjectNamingSpecialChar,Warning,Object Naming,Rename the following objects to get rid of special characters: @{ObjectName},"['DefaultRuleset', 'Naming']","If you name a database object by using any character in the following table, you make it more difficult not only to reference that object but also to read code that contains the name of that object.",https://docs.microsoft.com/previous-versions/visualstudio/visual-studio-2010/dd172134(v=vs.100),['BadNamingSpecialChars'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +ColumnNamingSpecialChar,Warning,Column Naming,Rename the following columns to get rid of special characters: @{ObjectName},"['DefaultRuleset', 'Naming']","If you name a database object by using any character in the following table, you make it more difficult not only to reference that object but also to read code that contains the name of that object.",https://docs.microsoft.com/previous-versions/visualstudio/visual-studio-2010/dd172134(v=vs.100),['BadNamingSpecialCharsColumns'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +FnNaming,Warning,User Function Naming,Rename the following functions to get rid of the fn_ prefix: @{ObjectName},"['DefaultRuleset', 'Naming']","In SQL Server, the fn_ prefix designates system functions. If you use that prefix for your functions, the name of your function might conflict with the name of a system function that will be created in the future. If such a conflict occurs, your application might break if your application refers to the function without qualifying the reference by schema. In this situation, the name will bind to the system function instead of to your function.",https://docs.microsoft.com/sql/t-sql/statements/create-function-transact-sql,['BadNamingUserFunctions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +ObjectNamingResKeywords,Warning,Object names contain reserved keywords,Rename the following objects to get rid of reserved keywords: @{ObjectName},"['DefaultRuleset', 'Naming']","Microsoft SQL Server uses reserved keywords for defining, manipulating, and accessing databases. Reserved keywords are part of the grammar of the Transact-SQL language that is used by SQL Server to parse and understand Transact-SQL statements and batches. Although it is syntactically possible to use SQL Server reserved keywords as identifiers and object names in Transact-SQL scripts, you can do this only by using delimited identifiers.",https://docs.microsoft.com/sql/t-sql/language-elements/reserved-keywords-transact-sql,['BadNamingKeywords'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +DeprFeaturesInModules,Warning,Use of deprecated or discontinued features in modules,Consider getting rid of the following deprecated or discontinued features in @{ObjectName}: @{Keyword},"['DefaultRuleset', 'Security', 'Deprecated', 'LongRunningChecks', 'UpdateIssues']",Deprecated features are scheduled to be removed in a future release of SQL Server. Discontinued features have been removed from specific versions of SQL Server.,https://docs.microsoft.com/sql/relational-databases/performance-monitor/sql-server-deprecated-features-object,['DeprecatedFeaturesSQLModules'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",, +DeprFeaturesInJobs,Warning,Use of deprecated or discontinued features in modules,Consider getting rid of the following deprecated or discontinued features in @{ObjectName}: @{Keyword},"['DefaultRuleset', 'Security', 'Deprecated', 'Agent', 'Jobs', 'LongRunningChecks', 'UpdateIssues']",Deprecated features are scheduled to be removed in a future release of SQL Server. Discontinued features have been removed from specific versions of SQL Server.,https://docs.microsoft.com/sql/relational-databases/performance-monitor/sql-server-deprecated-features-object,['DeprecatedFeaturesJobs'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +NUMANodeSingleCPU,Warning,Single CPU assigned to NUMA node,Consider assigning additional CPUs to NUMA nodes that have only one assigned CPU,"['DefaultRuleset', 'NUMA', 'CPU', 'Memory', 'Performance']","Microsoft SQL Server is non-uniform memory access (NUMA) aware. NUMA architecture provides a scalable solution to performance problem. Computers with hardware NUMA have more than one system bus, each serving a small set of processors. Each group of processors has its own memory and possibly its own I/O channels, but each CPU can access memory associated with other groups in a coherent way. Each group is called a NUMA node. The number of CPUs within a NUMA node depends on the hardware vendor. Your hardware manufacturer can tell you if your computer supports hardware NUMA.",https://docs.microsoft.com/previous-versions/sql/sql-server-2008-r2/ms178144(v=sql.105),['ServerInstanceConfiguration'],Server,Windows,"OnPremises, ManagedInstance","[11.0,)",,, +NUMANodeNoCPU,Warning,NUMA nodes without CPUs,Make sure that all NUMA nodes have assigned CPUs,"['DefaultRuleset', 'NUMA', 'Performance', 'CPU', 'Memory']","Microsoft SQL Server is non-uniform memory access (NUMA) aware. NUMA architecture provides a scalable solution to performance problem. Computers with hardware NUMA have more than one system bus, each serving a small set of processors. Each group of processors has its own memory and possibly its own I/O channels, but each CPU can access memory associated with other groups in a coherent way. Each group is called a NUMA node. The number of CPUs within a NUMA node depends on the hardware vendor. Your hardware manufacturer can tell you if your computer supports hardware NUMA.",https://docs.microsoft.com/previous-versions/sql/sql-server-2008-r2/ms178144(v=sql.105),['AffinityNUMANodeNoAssignedCPUs'],Server,Windows,"OnPremises, ManagedInstance","[11.0,)",,, +IndexKeyGuid,Warning,Guid in clustered index key column,Get rid of GUIDs in the following clustered indexes keys: @{IndexName},"['DefaultRuleset', 'Indexes', 'Performance']","A big reason for a clustered index is when you often want to retrieve rows for a range of values for a given column. Because the data is physically arranged in that order, the rows can be extracted very efficiently. Something like a GUID, while excellent for a primary key, could be positively detrimental to performance, as there will be additional cost for inserts and no perceptible benefit on selects.",https://azure.microsoft.com/blog/uniqueidentifier-and-clustered-indexes/,['IndexesGuidKeyColumns'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",, +IndexesLargeKeys,Warning,Indexes keys with more than 900 bytes,Get rid of keys larger than 900 bytes in index @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","When you design an index that contains many key columns, or large-size columns, calculate the size of the index key to make sure that you do not exceed the maximum index key size. SQL Server retains the 900-byte limit for the maximum total size of all index key columns. This excludes nonkey columns that are included in the definition of nonclustered indexes.",http://msdn.microsoft.com/library/ms191241.aspx,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,13.0)","['master', 'model', 'msdb', 'tempdb']",, +IndexesLargeKeysNonClust,Warning,NonClustered indexes keys with more than 1700 bytes,Get rid of keys larger than 1700 bytes in index @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","When you design an index that contains many key columns, or large-size columns, calculate the size of the index key to make sure that you do not exceed the maximum index key size. SQL Server retains the 1700-byte limit for the maximum total size of all non-clustered index key columns. This excludes nonkey columns that are included in the definition of nonclustered indexes.",http://msdn.microsoft.com/library/ms191241.aspx,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0,)","['master', 'model', 'msdb', 'tempdb']",, +IndexesLargeKeysClust,Warning,Clustered indexes keys with more than 900 bytes,Get rid of keys larger than 900 bytes in index @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","When you design an index that contains many key columns, or large-size columns, calculate the size of the index key to make sure that you do not exceed the maximum index key size. SQL Server retains the 900-byte limit for the maximum total size of all clustered index key columns. This excludes nonkey columns that are included in the definition of nonclustered indexes.",http://msdn.microsoft.com/library/ms191241.aspx,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[13.0,)","['master', 'model', 'msdb', 'tempdb']",, +DisabledIndexes,Warning,Disabled Indexes exist,Remove or enable this disabled index: @{FullName},"['DefaultRuleset', 'Indexes', 'Performance']","If you need to load a lot of data quickly, you can disable nonclustered indexes in order to improve performance. After the data load finishes, enable the nonclustered indexes again by rebuilding them. This technique works best in large data warehouse environments where entire dimension tables might be reloaded from scratch every night. Disabling nonclustered indexes is safer than dropping and recreating them because scripting indexes is hard. Unfortunately, sometimes our load processes crash before enabling the indexes again, or sometimes we manually load data and we forget to rebuild them.",https://docs.microsoft.com/sql/relational-databases/indexes/disable-indexes-and-constraints,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +IndexesFillFactor,Warning,Index fill factor lower 80%,Review index @{FullName} as its fill factor @{FillFactor} is lower than 80 percent,"['DefaultRuleset', 'Indexes', 'Performance']","The fill-factor option is provided for fine-tuning index data storage and performance. When an index is created or rebuilt, the fill-factor value determines the percentage of space on each leaf-level page to be filled with data, reserving the remainder on each page as free space for future growth. For example, specifying a fill-factor value of 80 means that 20 percent of each leaf-level page will be left empty, providing space for index expansion as data is added to the underlying table. The empty space is reserved between the index rows rather than at the end of the index.",https://docs.microsoft.com/sql/relational-databases/indexes/specify-fill-factor-for-an-index,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +NonUniqueClusterIndex,Warning,Non-unique clustered indexes,Review this clustered index @{FullName} as it is non-unique,"['DefaultRuleset', 'Indexes', 'Performance']","Index uniqueness is highly desirable attribute of a clustering key, and goes hand-in-hand with index narrowness. SQL Server does not require a clustered index to be unique, but yet it must have some means of uniquely identifying every row. That?ÇÖs why, for non-unique clustered indexes, SQL Server adds to every duplicate instance of a clustering key value a 4-byte integer value called a uniqueifier. This uniqueifier is added everywhere the clustering key is stored. That means the uniqueifier is stored in both clustered and non-clustered indexes. As you can imagine, if there are many rows using the same clustering key value, this can become quite expensive.",https://docs.microsoft.com/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +SuspectPages,Warning,Suspect pages,Run DBCC CHECKDB to verify affected database. Suspect pages were found: @{EventType},"['DefaultRuleSet', 'Pages', 'DataIntegrity']","The suspect_pages table is used for maintaining information about suspect pages, and is relevant in helping to decide whether a restore is necessary.",https://docs.microsoft.com/sql/relational-databases/backup-restore/manage-the-suspect-pages-table-sql-server,['SuspectPagesValidation'],Database,"['Windows', 'Linux']",,"[11.0,)",,, +SparseFiles,Warning,Sparse files,Get rid of sparse files: @{SparseFiles},"['DefaultRuleSet', 'Snapshots', 'Backup', 'DataIntegrity']","If the file is sparse or compressed, the NTFS file system may deallocate disk space in the file. This sets the range of bytes to zeroes (0) without extending the file size.",https://blogs.msdn.microsoft.com/jorgepc/2010/11/25/what-are-sparse-files-and-why-should-i-care-as-sql-server-dba/,['SparseFilesValidation'],Database,"['Windows', 'Linux']",,"[11.0,)",,, +TableNoIndex,Warning,Tables without indexes,Review table @{TableName} and create reasonable indexes,"['DefaultRuleset', 'Indexes', 'Performance']","Each table in the database has one or more pages. To keep track of those pages, SQL Server uses a special set of pages, called IAM (for Index Allocation Map) pages. In spite of the word ?Ç£Index?Ç¥ in the name, IAMs are used for non-indexed tables as well. These are called heaps. All the data is there, but the only way to find anything is to read it starting at the beginning. For a very large table, this will be terribly inefficient.",https://docs.microsoft.com/sql/relational-databases/indexes/heaps-tables-without-clustered-indexes,['TableIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",, +TableNoClusteredIndex,Warning,Tables without clustered indexes,Review table @{TableName} and consider creating a clustered index,"['DefaultRuleset', 'Indexes', 'Performance']","Tables without clustered indexes are called heaps. They?ÇÖre scattered on disk anywhere that SQL Server can find a spot, and they?ÇÖre not stored in any order whatsoever. This can make for really fast inserts ?Çô SQL Server can just throw the data down ?Çô but slow selects, updates, and deletes.",https://docs.microsoft.com/sql/relational-databases/indexes/heaps-tables-without-clustered-indexes,['TableIndexes'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",, +TablePSAlign,Warning,Table index not aligned with PS,Consider recreating index @{IndexName} in table @{TableName} to have it aligned with your schema,"['DefaultRuleset', 'Indexes', 'Performance']","Table partitioning is a complex way to break out your large tables into smaller, more manageable chunks, but it comes with a lot of management heartache. One of the challenges is making sure that your indexes are partitioned and aligned the same way as your clustered index.",https://docs.microsoft.com/sql/relational-databases/partitions/partitioned-tables-and-indexes,['TableIndexesPartitioned'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'tempdb', 'model', 'msdb']",, +LoginNoPassword,Warning,Logins with no passwords,Make sure to set strong passwords on the following logins: @{PasswordData},"['DefaultRuleset', 'Security', 'WeakPassword']",Password complexity policies are designed to deter brute force attacks by increasing the number of possible passwords.,https://docs.microsoft.com/sql/relational-databases/security/password-policy,['NullPassword'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +LoginEqPassword,Warning,Logins with passwords that are same as the login names,Please review logins with password equals to login: @{PasswordData},"['DefaultRuleset', 'Security', 'WeakPassword']",Password complexity policies are designed to deter brute force attacks by increasing the number of possible passwords.,https://docs.microsoft.com/sql/relational-databases/security/password-policy,['NamePassword'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +SystemHealth,Warning,System Health important messages,Error @{Error_Number} has occured @{Error_Count} times. Last time was @{Last_Logged_Days_Ago} days ago,"['DefaultRuleset', 'XEvent', 'SystemHealth', 'Performance']","The system_health session is an Extended Events session that is included by default with SQL Server. This session starts automatically when the SQL Server Database Engine starts, and runs without any noticeable performance effects. The session collects system data that you can use to help troubleshoot performance issues in the Database Engine",https://docs.microsoft.com/sql/relational-databases/extended-events/use-the-system-health-session,['SystemHealth'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +RarelyUsedIndex,Warning,Rarely used index,Make sure you need index @{IndexName} as it's used too rarely,"['DefaultRuleset', 'Indexes', 'Performance']","Rarely used indexes can slow down database's performance. Time of write operations is increased because of index maintenance, but index is not used quite often. It makes sense to compare impact of writing operations versus rare reading speedup.",https://docs.microsoft.com/sql/t-sql/statements/drop-index-transact-sql,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +UnusedIndex,Warning,Unused index,Make sure you need index @{IndexName} as it's unused,"['DefaultRuleset', 'Index', 'Performance']","Unused indexes can slow down database's performance. Time of write operations is increased because of index maintenance, but index is not used anywhere.",https://docs.microsoft.com/sql/t-sql/statements/drop-index-transact-sql,['IndexesDefinitions'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +SkewedCompatibilityLevel,Warning,Database with skewed compatibility level,Update database compatibility level (current level: @{CompatibilityLevel}),"['DefaultRuleset', 'CompatibilityLevel', 'Security', 'Performance', 'UpdateIssues']",Some databases may have a compatibility level lower than the allowed level by the Database Engine.,https://docs.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-compatibility-level,"['CompatibilityLevel', 'SQLServerVersion']",Database,"['Windows', 'Linux']",,"[11.0,)",,, +PendingDiskIORequests,Warning,Pending disk I/O requests,Investigate and solve I/O related issues to get rid of pending requests,"['DefaultRuleset', 'IO', 'Performance']","A database management system (DBMS), such as SQL Server, relies on the timeliness of file input and output (I/O) operations. The proper configuration and maintenance of the I/O subsystem is critical to a successful SQL Server deployment.",https://support.microsoft.com/en-sg/help/897284/diagnostics-in-sql-server-help-detect-stalled-and-stuck-i-o-operations,"[{'id': 'PendingIORequests', 'params': {'io_type': 'disk'}}]",Server,"['Windows', 'Linux']",,"[11.0,)",,, +MaxDOP,Warning,MaxDOP should be less or equal number of CPUs,Update MaxDOP configuration option value: @{max_dop}. It shouldn't exceed @{online_logical_processors} - the number of processors that SQL Server uses,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,"['ServerInstanceConfiguration', 'SysConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +MaxDOPFewNUMA,Warning,MAXDOP set in accordance to CPU count,Update MAXDOP configuration option value: @{max_dop} ?Çô it shouldn't exceed the number of logical processors per NUMA node,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,"['ServerInstanceConfiguration', 'SysConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0, 13.0)",,, +DbIntegrity,Warning,Database Integrity Checks,Run DBCC CHECKDB since integrity checks have not been executed for over 7 days,"['DefaultRuleset', 'DBCC', 'Performance', 'DataIntegrity']","The DBCC CHECKDB command checks the integrity of the objects in a database and should be run on a regular basis. This statement is used to perform different operations in your database and can be broken down into four categories: Maintenance, Miscellaneous, Informational, and Validation.",https://msdn.microsoft.com/library/ms176064.aspx,"['DBMetaInfo', 'DatabaseConfiguration']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",tempdb,, +DirectCatalogUpdates,Warning,Direct Catalog Updates,"Do not use direct catalog update feature in new development work, and modify applications that currently use it as soon as possible","['DefaultRuleset', 'DBCC', 'Deprecated']","'allow updates' option is still present in the sp_configure stored procedure, although its functionality is unavailable in SQL Server. The setting has no effect. Starting with SQL Server 2005, direct updates to the system tables are not supported.",https://docs.microsoft.com/sql/database-engine/configure-windows/allow-updates-server-configuration-option,"['DBMetaInfo', 'DatabaseConfiguration']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",tempdb,, +DataPurityCheck,Warning,Data Purity Check,Run DBCC CHECKDB ([DatabaseName]) WITH DATA_PURITY,"['DefaultRuleset', 'DBCC', 'DataIntegrity']","The DBCC CHECKDB command checks the integrity of the objects in a database and should be run on a regular basis. One thing that this command does not check in databases created in versions prior to SQL Server 2005 is the integrity of the data in the columns until it has been run once with the DATA_PURITY option. Adding the DATA_PURITY option causes the CHECKDB command to look for column values that are invalid or out of range. Any database that was created in SQL Server 2005 or later will include the DATA_PURITY check by default; but if the database is being upgraded from an earlier version, you must run the command with the DATA_PURITY option at least once using the following command and then fix any data issues.",http://support.microsoft.com/kb/923247,"['DBMetaInfo', 'DatabaseConfiguration']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +StatSamplingRate,Warning,Statistics sampling rate,"Some statistics have sampling rates less than @{threshold:P}, consider updating with a larger sample or full scan if key is not uniformly distributed. Affected tables: @{FullName}","['DefaultRuleset', 'Performance', 'Statistics']","For most queries, the Query Optimizer already generates the necessary statistics for a high quality query plan; in some cases, you need to create additional statistics or modify the query design for best results.",https://docs.microsoft.com/sql/t-sql/statements/update-statistics-transact-sql,"[{'id': 'StatSamplingRate', 'params': {'threshold': '@threshold'}, 'transform': {'type': 'aggregate', 'map': {'FullName': 'join'}}}]",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,0.25, +IndexFragmentation,Warning,Index Fragmentation,Remove fragmentation of index @{IndexFullName}. It's fragmentation level: @{fragmentation:#0.##}%,"['DefaultRuleset', 'Index', 'Performance']","The SQL Server Database Engine automatically modifies indexes whenever insert, update, or delete operations are made to the underlying data. Over time these modifications can cause the information in the index to become scattered in the database (fragmented). Fragmentation exists when indexes have pages in which the logical ordering, based on the key value, does not match the physical ordering inside the data file. Heavily fragmented indexes can degrade query performance and cause your application to respond slowly, especially scan operations.",https://docs.microsoft.com/sql/relational-databases/indexes/reorganize-and-rebuild-indexes,['IndexStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",5, +XTPHashAvgChainBuckets,Warning,High avg chain length and empty buckets,Index @{IndexFullName} has @{avg_chain_length} average chain length and @{EmptyBucketPct}% empty buckets count. Verify if there are many rows with duplicate index key values or there is a skew in the key values,"['DefaultRuleset', 'Index', 'Performance', 'XTP']","Memory-optimized HASH indexes behave different from NONCLUSTERED indexes. They are optimized for point-lookup operations, and do not support ordered scans or inequality seek operations. You should specify a value for the BUCKET_COUNT parameter when you create a memory-optimized table.",https://techcommunity.microsoft.com/t5/sql-server/in-memory-oltp-indexes-part-2-performance-troubleshooting-guide/ba-p/385725,['XTPIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",, +XTPTooManyBuckets,Warning,Too many buckets,"Make number of buckets of index @{IndexFullName} equal to distinct rows. It has @{total_bucket_count} buckets, and there are @{DistinctCnt} in the table, which is wasting memory and marginally slowing down full table scans","['DefaultRuleset', 'Index', 'Performance', 'XTP']","Memory-optimized HASH indexes behave different from NONCLUSTERED indexes. They are optimized for point-lookup operations, and do not support ordered scans or inequality seek operations. You must specify a value for the BUCKET_COUNT parameter when you create the memory-optimized table.",https://techcommunity.microsoft.com/t5/sql-server/in-memory-oltp-indexes-part-2-performance-troubleshooting-guide/ba-p/385725,['XTPIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",, +XTPTooFewBuckets,Warning,Too few buckets,"Make number of buckets of index @{IndexFullName} equal to distinct rows. It has @{total_bucket_count} buckets, and there are @{DistinctCnt} in the table, which leads to chaining records","['DefaultRuleset', 'Index', 'Performance', 'XTP']","Memory-optimized HASH indexes behave different from NONCLUSTERED indexes. They are optimized for point-lookup operations, and do not support ordered scans or inequality seek operations. You must specify a value for the BUCKET_COUNT parameter when you create the memory-optimized table.",https://techcommunity.microsoft.com/t5/sql-server/in-memory-oltp-indexes-part-2-performance-troubleshooting-guide/ba-p/385725,['XTPIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",, +XTPRangeIXHealth,Warning,NonClustered index retry amount,"Review index @{IndexFullName} as its retry count is over @{RetryCountPct}% of total, which is indicating possible concurrency issues","['DefaultRuleset', 'Index', 'Performance', 'XTP']","When a database with a memory-optimized table is restarted, the index is built by inserting one row at a time into memory. The count of page splits, merges, and consolidation can help you understand the work done to build the index when a database is brought online. Large numbers of retries are indicative of concurrency issues.",https://docs.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-db-xtp-nonclustered-index-stats-transact-sql,['XTPNonClusteredIndexHashStatistics'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[12.0,)","['master', 'model', 'msdb', 'tempdb']",,5 +TF6533Misuse,Warning,STRelate and STAsBinary functions unexpected results due to enabled TF 6533,Disable TF 6533 to avoid unexpected results of functions STRelate and STAsBinary,"['DefaultRuleset', 'TraceFlag', 'Performance', 'TF6533']",The STRelate and STAsBinary functions may return unexpected results when trace flag 6533 is enabled. Do not use this trace flag if your workload involves either of these functions.,https://support.microsoft.com/help/3107399,"['EnabledGlobalTraceFlags', 'TF6533SpatialFunctionsUsage']",Database,Windows,OnPremises,"[11.0.6020, 11.0.6518)","['master', 'model', 'msdb', 'tempdb']",, +UntrustedConstraints,Warning,Untrusted Constraints,Execute ALTER TABLE
WITH CHECK CHECK CONSTRAINT statement to avoid possible performance issues: @{constraint_name} constraints are not trusted for referential integrity,"['DefaultRuleset', 'Performance', 'DataIntegrity']","If you need to load a lot of data quickly, you can disable keys and constraints in order to improve performance. After the data load finishes, enable them again, and SQL Server will check them behind the scenes. This technique works best in large data warehouse environments where entire dimension tables might be reloaded from scratch every night. Disabling constraints is usually safer and easier than dropping and recreating them.",https://docs.microsoft.com/sql/t-sql/statements/alter-table-transact-sql,['FKNotTrusted'],Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +PercentAutogrows,Warning,Database files have a growth ratio set in percentage,"Don't use ""File Growth In Percent"" for the Autogrowth setting. The following files are affected: @{fileName} have a growth ratio set in percentage","['DefaultRuleset', 'Performance', 'DBFileConfiguration', 'DBConfiguration']","Some database files have a growth ratio set in percentage. Over time, this could lead to uncontrolled disk space allocation and extended time to perform these growths",https://docs.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options,"[{'id': 'DatabaseMasterFiles', 'params': {'type': None, 'is_percent_growth': 1}, 'transform': {'type': 'aggregate', 'map': {'fileName': 'join'}}}]",Database,"['Windows', 'Linux']",OnPremises,"[11.0,)","['master', 'model', 'msdb', 'tempdb']",, +StatsUpdate,Warning,Statistics need to be updated,Update stats in table @{TableName} to improve query performance,"['DefaultRuleset', 'Performance', 'Statistics', 'QueryOptimizer']","The Query Optimizer determines whether an index is useful for a specific query by evaluating the stored statistics. If the statistics become out of date and significant changes have occurred against the underlying data, this can result in less than optimal query performance. In most cases, it's best to let SQL Server maintain the statistics. If you turn 'Auto Create Stats' and 'Auto Update Stats' off, then it is up to you to keep the statistics up-to-date somehow. Failure to do so will lead to poor query performance. Most applications should have these options ON. When the Auto Update Statistics setting is ON, the Query Optimizer updates statistics when they are used by a query and when they might be out-of-date. Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. The Query Optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. The threshold is based on the number of rows in the table or indexed view. The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Before compiling a query, the Query Optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Before executing a cached query plan, the Database Engine verifies that the query plan references up-to-date statistics. The AUTO_UPDATE_STATISTICS option applies to statistics created for indexes, single-columns in query predicates, and statistics that are created by using the CREATE STATISTICS statement. This option also applies to filtered statistics.",https://docs.microsoft.com/sql/relational-databases/statistics/statistics#UpdateStatistics,"['DatabaseConfiguration', 'ObjectStatistics']",Database,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,500, +AdHocQueriesOff,Warning,Option 'ad hoc distributed queries' should be disabled,Disable 'ad hoc distributed queries' option,"['DefaultRuleset', 'Configuration', 'Security']","Ad Hoc Distributed Queries use the OPENROWSET and OPENDATASOURCE functions to connect to remote data sources that use OLE DB. OPENROWSET and OPENDATASOURCE should be used only to reference OLE DB data sources that are accessed infrequently. For any data sources that will be accessed more than several times, define a linked server. Enabling the use of ad hoc names means that any authenticated login to SQL Server can access the provider. SQL Server administrators should enable this feature for providers that are safe to be accessed by any local login.",https://docs.microsoft.com/sql/database-engine/configure-windows/ad-hoc-distributed-queries-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +AffinityMasksOverlap,Warning,Affinity Mask and Affinity I/O Mask overlapping,"Correct Affinity Mask and Affinity IO Mask overlap. AffinityMask = @{affinity_mask}, Affinity64Mask = @{affinity64_mask}, AffinityIOMask = @{affinity_io_mask}, Affinity64IOMask = @{affinity64_io_mask}","['DefaultRuleset', 'Configuration', 'Performance']","Enabling a CPU with both the affinity mask and the affinity I/O mask can slow performance by forcing the processor to be overused. When specified either the affinity mask or the affinity I/O mask options they must both be specified, but only enables each CPU no more than once. The same CPU should not be enabled in both the affinity mask option and the affinity I/O mask option. The bits that correspond to each CPU should be in one of the following states.",https://docs.microsoft.com/sql/relational-databases/policy-based-management/correct-affinity-mask-and-affinity-input-and-output-mask-overlap,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +AutoSoftNUMAOn,Warning,Auto Soft NUMA should be enabled,Enable 'automatic soft-NUMA disabled' option. There's a possibly inefficient allocation of cores between the NUMA-nodes,"['DefaultRuleset', 'Configuration', 'NUMA']","Modern processors have multiple cores per socket. Each socket is represented, usually, as a single NUMA node. The SQL Server database engine partitions various internal structures and partitions service threads per NUMA node. With processors containing 10 or more cores per socket, using software NUMA to split hardware NUMA nodes generally increases scalability and performance. Prior to SQL Server 2014 (12.x) SP2, software-based NUMA (soft-NUMA) has required to edit the registry to add a node configuration affinity mask, and was configured at the host level, rather than per instance. Soft-NUMA has configured automatically at the database-instance level when the SQL Server Database Engine service starts.",https://docs.microsoft.com/sql/database-engine/configure-windows/soft-numa-sql-server,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[13.0,)",,, +BlockingChains,Warning,Blocking chains,Review locking strategy. @{blocked_spid} process(es) have been blocked@{block_time_min: for more than #0 min;;''},"['DefaultRuleset', 'Statistics']",Blocking chains of sessions can cause poor performance when the duration of locks is too long on the resource.,https://docs.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-os-waiting-tasks-transact-sql,"[{'id': 'ProcessBlockingChains', 'params': {'waitThreshold': 5}, 'transform': {'type': 'aggregate', 'map': {'blocked_spid': 'count', 'block_time_min': 'min'}}}]",Database,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +BlockProcThreshNotRecommend,Warning,Blocked Process Threshold is set to recommended value,Increase or Disable Blocked Process Threshold. Its current value is @{block_threshold},"['DefaultRuleset', 'Configuration']","This rule checks that the blocked process threshold option is set to 0 (disabled) or set to a value higher than or equal to 5 (seconds). Setting the blocked process threshold option to a value from 1 to 4 can cause the deadlock monitor to run constantly. Values 1 to 4 should only be used for troubleshooting, and never long term or in a production environment without the assistance of Microsoft Customer Service and Support.",https://docs.microsoft.com/sql/relational-databases/policy-based-management/increase-or-disable-blocked-process-threshold,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,5, +CrossDBOwnershipOff,Warning,Option 'cross db ownership chaining' should be disabled,Disable 'cross db ownership chaining' option,"['DefaultRuleset', 'Configuration', 'Security']","Cross-database ownership chaining occurs when a procedure in one database depends on objects in another database. A cross-database ownership chain works in the same way as ownership chaining within a single database, except that an unbroken ownership chain requires that all the object owners are mapped to the same login account. If the source object in the source database and the target objects in the target databases are owned by the same login account, SQL Server does not check permissions on the target objects. Ownership chaining across databases is turned off by default. Microsoft recommends that you disable cross-database ownership chaining because it exposes you to some security risks.",https://docs.microsoft.com/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +DefaultTraceOff,Warning,Default trace enabled,"Enable option 'default trace enabled', it provides troubleshooting assistance to database administrators","['DefaultRuleset', 'Configuration']","Use the 'default trace enabled' option to enable or disable the default trace log files. The default trace functionality provides a rich, persistent log of activity and changes primarily related to the configuration options. ",https://docs.microsoft.com/sql/database-engine/configure-windows/default-trace-enabled-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +DiskPartitionAlignment,Warning,Disk Partition alignment,Increase disk partition alignment on @{Output.Name} to make it 64 KB at least. Current volume offset is @{Output.StartingOffset},"['DefaultRuleset', 'Performance', 'Storage']","Noncompliance with storage configuration best practices for the Microsoft SQL Server database software is a common root cause of support cases. The reason is often shown to be misalignment between Windows, storage, disk controllers, and cache segment lines. 64 KB is a common, valid starting partition offset because it correlates well with fundamental physical boundaries in disks, controllers, and cache. Other valid starting partition offsets exist.",https://docs.microsoft.com/previous-versions/sql/sql-server-2008/dd758814(v=sql.100),"[{'id': 'MisalignedDiskPartition', 'params': {'threshold': '@Threshold'}}]",Server,Windows,OnPremises,"[11.0,)",,, +FullTextServiceLoadOSResources,Warning,Full-text search option 'load_os_resources' set to default,Set FTS option 'load_os_resources' to @{defaultLoadOSResources},"['DefaultRuleset', 'Configuration']","Full-text search option 'load_os_resources' indicates whether operating system word breakers, stemmers, and filters are registered and used with this instance of SQL Server. By default, this property is disabled to prevent inadvertent behavior changes by updates made to the operating system. Enabling use of operating system resources provides access to resources for languages and document types registered with Microsoft Indexing Service that do not have an instance-specific resource installed. If you enable the loading of operating system resources, ensure that the operating system resources are trusted signed binaries; otherwise, they cannot be loaded when verify_signature (see below) is set to 1.",,['FullTextServiceInfo'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +FullTextServiceVerifySignature,Warning,Full-text search option 'verify_signature' set to default,Set FTS option 'load_os_resources' to @{defaultVerifySignature},"['DefaultRuleset', 'Configuration', 'Security']","Full-text search option 'verify_signature' indicates whether only signed binaries are loaded by the Full-Text Engine. By default, only trusted, signed binaries are loaded.",,['FullTextServiceInfo'],Server,"['Windows', 'Linux']","OnPremises, ManagedInstance","[11.0,)",,, +HPLogicalProcessor,Warning,HP Logical Processor issue,Consider updating server BIOS to the latest version. It may be affected by the HP Logical Processor issue. ,"['DefaultRuleset', 'Performance']","HP ProLiant Gen9 servers configured with Intel Xeon E5 2600 v3 processors can be configured to support processor configurations that exceed 64 logical processors. Windows Operating Systems divide the logical processors into groups (Kgroups). On HP ProLiant Gen9 servers, the System Firmware, by default, reports the maximum number of possible logical processors to reflect the highest core count processor available. The result is that Windows Operating Systems will group the available logical processors into more than one Kgroup in a two-socket populated configuration. Applications that rely on older kernel APIs for affnitizing threads inside a process to a specific logical processor will only be able to address one Kgroup. The result is that the process will run on fewer logical processors than are presented to the OS for use. Workloads that utilize multiple processes (in lieu of a single process with multiple threads), or are leveraging the APIs that allow beyond single Kgroup addressing, will have full access to all the logical processors presented to the OS for use.",https://support.hpe.com/hpesc/public/docDisplay?docId=emr_na-c04650594,"['SysDmOsSysInfo', {'id': 'ServerBIOSInfo', 'transform': {'type': 'parse', 'map': {'BIOSVendor': '/^(HP|Hewlett-Packard)$/ix'}}}, {'id': 'ServerCPUInfo', 'transform': [{'type': 'parse', 'map': {'ProcessorNameString': '/.*XEON.*E5.*/ix'}}, {'type': 'aggregate', 'map': {'ProcessorNameString': 'count'}}]}]",Server,Windows,OnPremises,"[11.0,)",,, +IndexCreateMemory,Warning,Option 'index create memory' value should be greater 'min memory per query',"Set option 'index create memory' to default value 0 or make it greater than value of 'min memory per query'. Current 'index create memory' is @{index_create_memory} KB, current 'min memory per query' is @{min_memory_per_query} KB","['DefaultRuleset', 'Configuration', 'IndexCreateMemory']","The 'index create memory' option controls the maximum amount of memory initially allocated for sort operations when creating indexes. The default value for this option is 0 (self-configuring). If more memory is later needed for index creation and the memory is available, the server will use it; thereby, exceeding the setting of this option. If additional memory is not available, the index creation will continue using the memory already allocated. However, if you experience difficulties creating indexes, consider increasing the value of this option from its run value.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-index-create-memory-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +LightweightPoolingOn,Warning,Lightweight pooling option disabled,Disable option 'lightweight pooling' as fiber mode scheduling can decrease performance,"['DefaultRuleset', 'Configuration', 'Performance']","The 'lightweight pooling' option is used to configure SQL Server to use simplified flows (or 'fibers'). Fiber mode is intended for certain situations in which the context switching of the UMS workers are the critical bottleneck in performance. Because this is rare, fiber mode rarely enhances performance or scalability on the typical system. Improved context switching in Microsoft Windows Server 2003 has also reduced the need for fiber mode. We do not recommend that you use fiber mode scheduling for routine operation. This is because it can decrease performance by inhibiting the regular benefits of context switching, and because some components of SQL Server that use Thread Local Storage (TLS) or thread-owned objects, such as mutexes (a type of Win32 kernel object), cannot function correctly in fiber mode.",https://docs.microsoft.com/sql/database-engine/configure-windows/lightweight-pooling-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +LocksOptionNotDefault,Warning,Option 'locks' should be set to default,"Set option 'locks' to @{recommended_max_lock_number}, its current value is @{locks}","['DefaultRuleset', 'Configuration', 'Performance']","The 'locks' option sets the maximum number of available locks, thereby limiting the amount of memory the SQL Server Database Engine uses for them. The default setting is 0, which allows the Database Engine to allocate and deallocate lock structures dynamically, based on changing system requirements.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-locks-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +MaxDOP1NUMA,Warning,MAXDOP set in accordance to CPU count,"Update MAXDOP option according to guideline (see help link). Current MAXDOP value is @{max_dop}, CPU count is @{online_logical_processors}","['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,"['ServerInstanceConfiguration', 'SysConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +MaxDopFewNumaLess15,Warning,MAXDOP set in accordance to CPU count,Update MaxDOP configuration option value: @{max_dop} ?Çô it shouldn't exceed the number of logical processors per NUMA node,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,"['ServerInstanceConfiguration', 'SysConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[13.0,)",,, +MaxDopFewNumaOver15,Warning,MAXDOP set in accordance to CPU count,Update MAXDOP configuration option value: @{max_dop} ?Çô it should be half the number of logical processors per NUMA node,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,"['ServerInstanceConfiguration', 'SysConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[13.0,)",,, +MaxDopFewNumaOver8,Warning,MAXDOP set in accordance to CPU count,Update MaxDOP configuration option value: @{max_dop} ?Çô it should equal to 8,"['DefaultRuleset', 'MaxDOP', 'Performance', 'Configuration', 'NUMA', 'CPU']","The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.",https://support.microsoft.com/kb/2806535,"['ServerInstanceConfiguration', 'SysConfiguration']",Server,"['Windows', 'Linux']",OnPremises,"[11.0, 13.0)",,, +MinMemoryPerQuery,Warning,Option 'min memory per query' set to default,"Set option 'min memory per query' to @{recommended_min_memory_per_query} KB, current value is '@{min_memory_per_query}'","['DefaultRuleset', 'Configuration', 'Memory', 'Performance']","The min memory per query option specifies the minimum amount of memory (in kilobytes) that will be allocated for the execution of a query. This is also known as the minimum memory grant. The default value is 1,024 KB. Do not set the min memory per query server configuration option too high, especially on very busy systems, because the query has to wait1 until it can secure the minimum memory requested, or until the value specified in the query wait server configuration option is exceeded. If more memory is available than the specified minimum value required to execute the query, the query is allowed to make use of the additional memory, provided that the memory can be used effectively by the query.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-min-memory-per-query-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +NetworkPacketSize,Warning,Option 'network packet size' set to default,"Set option 'network packet size' to @{recommended_network_packet_size} bytes, current value is @{network_packet_size}","['DefaultRuleset', 'Configuration', 'Network']",The 'network packet size' option sets the packet size (in bytes) that is used across the whole network. Packets are the fixed-size chunks of data that transfer requests and results between clients and servers. The default packet size is 4096 bytes.,https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-network-packet-size-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +NtfsBlockSizeNotFormatted,Warning,NTFS block size in volumes that hold database files <> 64KB,Set allocation unit size on volume @{masterFilesVolumeName} to 64 KB. Current size is @{Output.BlockSize} bytes,"['DefaultRuleset', 'Performance', 'Configuration', 'NTFS']","A drive can be formatted with different sizes ranging from 512 bytes to 64K sizes with the default being 4KB (4096 bytes). This setting is also called as ?Ç£Bytes Per Cluster?Ç¥. The atomic unit of storage in SQL Server is a page which is 8KB in size. Extents are groups of eight 8 KB pages that are physically contiguous to each other for a total of 64 KB. SQL Server uses extents to store data. Hence, on a SQL Server machine the NTFS Allocation unit size hosting SQL database files (Including tempdb files) should be 64 KB.",https://docs.microsoft.com/archive/blogs/docast/operating-system-best-practice-configurations-for-sql-server,"['NtfsBlockSize', 'Win32Volume']",Server,Windows,OnPremises,"[11.0,)",,, +OleAutomationProceduresOn,Warning,Option 'Ole Automation Procedures' set to default,"Disable option 'Ole Automation Procedures' option, it exposes to security risks","['DefaultRuleset', 'Configuration', 'Security']","Use the 'Ole Automation Procedures' option to specify whether OLE Automation objects can be instantiated within Transact-SQL batches. When OLE Automation Procedures are enabled, a call to 'sp_OACreate' will start the OLE shared execution environment. The 'Ole Automation Procedures' option can be set to the following values: 1 Enabled, 0 Disabled (default value).",https://docs.microsoft.com/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +PageFileAutoManaged,Warning,Page file is not automatically managed,"Avoid automatic management of page files, set custom sizes for page files on drives: '@{PagingFiles.Drive}'","['DefaultRuleset', 'Performance', 'Memory', 'PageFile', 'SysAdminReq']","Memory allocation failures can occur due to latencies that are associated with growing the size of a page file to support additional memory requirements in the system. A potential cause of these failures is when the page file size is configured as ?Ç£automatic.?Ç¥ Automatic page-file size starts with a small page file and grows automatically as needed. The IO system consists of many components, including file system filters, file systems, volume filters, storage filters, and so on. The specific components on a given system can cause variability in page file growth.",https://support.microsoft.com/help/4055223/memory-allocation-errors-can-be-caused-by-slow-page-file-growth,"[{'id': 'PageFileManagement', 'transform': [{'type': 'parse', 'map': {'PagingFiles': '/^(?\\w:)\\\\pagefile.sys 0 0$/x'}}, {'type': 'aggregate', 'map': {'PagingFiles.Drive': 'join'}}]}]",Server,Windows,OnPremises,"[11.0,)",,, +PageFileAutoManagedAllDrives,Warning,Page file is not automatically managed,Disable option 'Automatically manage paging file size for all drives',"['DefaultRuleset', 'Performance', 'Memory', 'PageFile', 'SysAdminReq']","Memory allocation failures can occur due to latencies that are associated with growing the size of a page file to support additional memory requirements in the system. A potential cause of these failures is when the page file size is configured as ?Ç£automatic.?Ç¥ Automatic page-file size starts with a small page file and grows automatically as needed. The IO system consists of many components, including file system filters, file systems, volume filters, storage filters, and so on. The specific components on a given system can cause variability in page file growth. ",https://support.microsoft.com/help/4055223/memory-allocation-errors-can-be-caused-by-slow-page-file-growth,['PageFileManagement'],Server,Windows,OnPremises,"[11.0,)",,, +PageFileLess10FreeSpace,Warning,Insufficient page file free space,Revise page file settings. Less than 10% of page file is available,"['DefaultRuleset', 'Performance', 'Memory', 'PageFile', 'SysAdminReq']","Page file sizing depends on the system crash dump setting requirements and the peak usage or expected peak usage of the system commit charge. Both considerations are unique to each system, even for systems that are identical. This means that page file sizing is also unique to each system and cannot be generalized.",https://docs.microsoft.com/windows/client-management/determine-appropriate-page-file-size,['OsSysMemory'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,0.1, +PageFileNotConfigured,Warning,Page file configured,Create a page file on server,"['DefaultRuleset', 'Performance', 'Memory', 'PageFile', 'SysAdminReq']","Page file sizing depends on the system crash dump setting requirements and the peak usage or expected peak usage of the system commit charge. Both considerations are unique to each system, even for systems that are identical. This means that page file sizing is also unique to each system and cannot be generalized.",https://docs.microsoft.com/windows/client-management/determine-appropriate-page-file-size,['PageFileManagement'],Server,Windows,OnPremises,"[11.0,)",,, +PageFileOut,Warning,Memory paged out,Revise LPIM settings. Part of SQL Server process memory has been paged out,"['DefaultRuleset', 'Performance', 'Memory', 'PageFile', 'SysAdminReq']","Microsoft SQL Server performs dynamic memory management based on the memory requirements of the current load and activities on the system. On Windows, SQL Server can use the memory notification mechanisms that are provided by the QueryMemoryResourceNotification Windows API. Based on this information from the QueryMemoryResourceNotification Windows API or from the memory calculation, SQL Server responds to the current memory situation on a specific system. This provides the following benefits: 1. The system does not page out the working set of the SQL Server process; 2. The necessary database pages are available in memory to reduce physical I/O needs. For more information, see the ""Dynamic memory management"" topic and the ""Server memory options"" topic in SQL Server Books Online.",https://docs.microsoft.com/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows,['OsSysMemory'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +PowerPlanSchemeNotRecommended,Warning,Power plan is High Performance,Switch server to High Performance power plan,"['DefaultRuleset', 'Configuration', 'Performance']","In some cases you may experience degraded overall performance on a Windows Server 2008 R2 or later machine when running with the default (Balanced) power plan. The issue may occur irrespective of platform and may be exhibited on both native and virtual environments. The degraded performance may increase the average response time for some tasks and cause performance issues with CPU-intensive applications. Please note that you may not notice performance issues while performing simple operations. However, applications or scripts that intensively use resources (primarily processor and memory) may exhibit the problem. To work around the performance degradation issue, you can switch to the High Performance power plan. However, this will disable dynamic performance scaling on the platform. Depending on the environment, if the platform is always under a heavy load, then this is a viable solution.",https://support.microsoft.com/help/2207548/slow-performance-on-windows-server-when-using-the-balanced-power-plan,['PowerPlan'],Server,Windows,OnPremises,"[11.0,)",,, +PriorityBoostOn,Critical,Option 'priority boost' set to default,Set 'priority boost' option to default value,"['DefaultRuleset', 'Configuration', 'Performance']","The 'priority boost' option used to specify whether Microsoft SQL Server should run at a higher scheduling priority than other processes on the same computer. If this option is set to 1, SQL Server runs at a priority base of '13' scheduler. The default is '0', which is a priority base of '7'.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-priority-boost-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +QueryWaitNotDefault,Critical,Option 'query wait' set to default,"Set option 'query wait' to @{default_query_wait}, current value is @{query_wait}. Increasing the maximum wait time may increase the amount of time for the query to be terminated","['DefaultRuleset', 'Configuration']","Memory-intensive queries (such as those involving sorting and hashing) are queued when there is not enough memory available to run the query. The query wait option specifies the time, in seconds (from 0 through 2147483647), that a query waits for resources before it times out. The default value for this option is -1. This means the time-out is calculated as 25 times the estimated query cost.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-query-wait-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +RecoveryIntervalOn,Warning,Option 'recovery interval' set to default,"Set option 'recovery interval' to @{default_recovery_interval}, current value is @{recovery_interval}","['DefaultRuleset', 'Configuration', 'Performance']","The 'recovery interval' option defines an upper limit on the time recovering a database should take. The default recovery-interval value is 0, which allows the Database Engine to automatically configure the recovery interval. Higher values indicate the approximate maximum recovery time, in minutes.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-recovery-interval-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +RemoteDacClusterOn,Warning,Remote admin connections enabled on cluster (DAC),Enable 'remote admin connections' option,"['DefaultRuleset', 'Configuration']","SQL Server provides a dedicated administrator connection (DAC). The DAC lets an administrator access a running server to execute diagnostic functions or Transact-SQL statements, or to troubleshoot problems on the server, even when the server is locked or running in an abnormal state and not responding to a SQL Server Database Engine connection. On cluster configurations, the DAC will be off by default. Users can execute the remote admin connection option of sp_configure to enable the DAC listener to access a remote connection. If SQL Server is unresponsive and the DAC listener is not enabled, you might have to restart SQL Server to connect with the DAC. Therefore, we recommend that you enable the remote admin connections configuration option on clustered systems.",https://docs.microsoft.com/sql/database-engine/configure-windows/diagnostic-connection-for-database-administrators,"['SysConfiguration', 'IsClusteredServer']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +RemoteQueryTimeout,Warning,Option 'remote query timeout' set to default,"Set option 'remote query timeout' to @{recommended_remote_query_timeout}, current value is @{remote_query_timeout}","['DefaultRuleset', 'Configuration']","The 'remote query timeout' option specifies how long, in seconds, a remote operation can take before SQL Server times out. The default value for this option is 600, which allows a 10-minute wait. This value applies to an outgoing connection initiated by the Database Engine as a remote query.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-remote-query-timeout-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +ScanStartupProcs,Warning,Option 'scan for startup procs' disabled on replication servers,Disable option 'scan for startup procs' as this server participates in replication,"['DefaultRuleset', 'Configuration']","Use the scan for startup procs option to scan for automatic execution of stored procedures at SQL Server startup time. If this option is set to 1, SQL Server scans for and runs all automatically run stored procedures that are defined on the server. The default value for scan for startup procs is 0 (do not scan). This option shouldn't be enabled on a SQL Server participating in replication.",https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-scan-for-startup-procs-server-configuration-option,"['ReplicationInfo', 'SysConfiguration']",Server,Windows,OnPremises,"[11.0,)",,, +ThreadExhaustionCPUBound,Warning,Worker thread exhaustion on CPU-bound system,"Possible worker thread exhaustion (schedulers work queue count is '@{schedulers_work_queue_count}'). Overall runnable tasks count is '@{overall_runnable_tasks_count}' (> 2), indicating the server might be CPU-bound. Configured workers is '@{max_workers_count}'","['DefaultRuleset', 'Performance']",Consider overall runnable tasks count and schedulers work queue count.,https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option,"['WorkerThreads', 'SysDmOsSysInfo']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +ThreadExhaustionNotCPUBound,Warning,Possible worker thread exhaustion on a not-CPU-bound system,"Possible worker thread exhaustion (schedulers work queue count is '@{schedulers_work_queue_count}'). Because the overall runnable tasks count is '@{overall_runnable_tasks_count}' (<= 2), indicating the server might not be CPU bound, there might be room to increase max_worker_threads (configured workers is '@{max_workers_count}')","['DefaultRuleset', 'Performance']",Consider overall runnable tasks count and schedulers work queue count.,https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option,"['WorkerThreads', 'SysDmOsSysInfo']",Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +ThresholdForParallelism,Warning,Option 'cost threshold for parallelism' set to default,"Set option 'cost threshold for parallelism' to @{default_cost_parallel}, current value is @{cost_threshold_for_parallelism}","['DefaultRuleset', 'Configuration', 'Performance']",The 'cost threshold for parallelism' option specifies the threshold at which SQL Server creates and runs parallel plans for queries. SQL Server creates and runs a parallel plan for a query only when the estimated cost to run a serial plan for the same query is higher than the value set in the cost threshold for parallelism. The cost refers to an estimated cost required to run the serial plan on a specific hardware configuration and is not a unit of time. The 'cost threshold for parallelism' option can be set to any value from 0 through 32767. The default value is 5.,https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-cost-threshold-for-parallelism-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, +WorkerThreadsLargeX64,Warning,Option 'max worker threads' set to recommended value on x64 system,Reconfigure option 'max worker threads' parameter. Its current value (@{max_worker_threads}) is higher than recommended for x64 system (@{recommended_max_worker_threads}),"['DefaultRuleset', 'Configuration', 'Performance', 'CPU']",The max worker threads option configures the number of worker threads that are available to SQL Server processes. The default value for max worker threads is 0. This enables SQL Server to automatically configure the number of worker threads at startup.,https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option,"['SysDmOsHostInfo', 'SysConfiguration']",Server,Windows,OnPremises,"[11.0,)",,, +WorkerThreadsLargeX86,Warning,Option 'max worker threads' set to recommended value on x86 system,Reconfigure option 'max worker threads' parameter. Its current value (@{max_worker_threads}) is higher than recommended for x86 system (@{recommended_max_worker_threads}),"['DefaultRuleset', 'Configuration', 'Performance', 'CPU']",The max worker threads option configures the number of worker threads that are available to SQL Server processes. he default value for max worker threads is 0. This enables SQL Server to automatically configure the number of worker threads at startup.,https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option,"['SysDmOsHostInfo', 'SysConfiguration']",Server,Windows,OnPremises,"[11.0,)",,, +XpCmdShellOn,Warning,Option 'xp_cmdshell' is disabled,Disable 'xp_cmdshell' as it exposes to the security risks,"['DefaultRuleset', 'Configuration']","The xp_cmdshell option is a SQL Server configuration option that enables system administrators to control whether the xp_cmdshell extended stored procedure can be executed on a system. By default, the xp_cmdshell option is disabled on new installations. ",https://docs.microsoft.com/sql/database-engine/configure-windows/xp-cmdshell-server-configuration-option,['SysConfiguration'],Server,"['Windows', 'Linux']",OnPremises,"[11.0,)",,, diff --git a/samples/manage/sql-assessment-api/MakingCustomChecks_sample.json b/samples/manage/sql-assessment-api/MakingCustomChecks_sample.json index 70d3cf0cf6..1bb33c8cff 100644 --- a/samples/manage/sql-assessment-api/MakingCustomChecks_sample.json +++ b/samples/manage/sql-assessment-api/MakingCustomChecks_sample.json @@ -7,7 +7,7 @@ "target": { "type": "Database", "version": "[13.0,)", - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises, ManagedInstance", "name": { "not": "/^(master|tempdb|model)$/" } }, @@ -26,7 +26,7 @@ { "target": { "type": "Server", - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises" }, "id": "Custom_TF834", @@ -60,7 +60,7 @@ "target": { "type": "Database", "version": "(,12.0)", - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { @@ -72,7 +72,7 @@ "target": { "type": "Database", "version": "[12.0, 13.0)", - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { @@ -84,7 +84,7 @@ "target": { "type": "Database", "version": "[13.0,)", - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { diff --git a/samples/manage/sql-assessment-api/QuickStart.md b/samples/manage/sql-assessment-api/QuickStart.md index bc6ea29860..fed9d40763 100644 --- a/samples/manage/sql-assessment-api/QuickStart.md +++ b/samples/manage/sql-assessment-api/QuickStart.md @@ -28,7 +28,7 @@ You will see in the results that each rule has some properties (not the full lis - Message property explains the recommendation but if you need more info, there is a HelpLink property that points at documentation on the subject. - Origin shows which ruleset and version the recommendation is coming from -See [config.json](./config.json) for a full list of rules and properties. +See [ruleset.json](./ruleset.json) for a full list of rules and properties. If you want to get recommendations for all databases on the local instance, run this command. @@ -42,4 +42,4 @@ To learn more about SQL Assessment API such as customizing and extending the rul - Docs online page: https://docs.microsoft.com/sql/sql-assessment-api/sql-assessment-api-overview - GitHub repo: http://aka.ms/sql-assessment-api -- SQL Assessment API Tutorial notebook: coming soon +- SQL Assessment API Tutorial notebook: [SQLAssessmentAPITutorialNotebook.ipynb](./notebooks/SQLAssessmentAPITutorialNotebook.ipynb) diff --git a/samples/manage/sql-assessment-api/README.md b/samples/manage/sql-assessment-api/README.md index e0563f410d..035e7d15cb 100644 --- a/samples/manage/sql-assessment-api/README.md +++ b/samples/manage/sql-assessment-api/README.md @@ -4,11 +4,13 @@ SQL Assessment API provides a mechanism to evaluate the configuration of your SQ Learn more about the API on the [SQL Assessment API docs page](https://docs.microsoft.com/en-us/sql/sql-assessment-api/sql-assessment-api-overview). +If you are into Azure Data Studio, you can evaluate your SQL Server right from it. Learn about SQL Assessment ADS extension [here](https://techcommunity.microsoft.com/t5/sql-server/released-sql-server-assessment-extension-for-azure-data-studio/ba-p/1470603). + ## QuickStart.md Learn how to assess your SQL Server configuration for best practices in 2 simple steps. -## config.json +## ruleset.json This is the default set of rules shipped with SQL Assessment API. Feel free to open issues to have us fix or add rules. Also, we're happy to see your pull requests to this file. @@ -34,7 +36,7 @@ Demonstrates how to make a custom ruleset containing two checks. The sample cont "type": "Database", //This check targets Database object "version": "[13.0,)", //Applies to SQL Server 2016 and higher //Another example: "[12.0,13.0)" reads as "any SQL Server version >= 12.0 and < 13.0" - "platform": "/^(Windows|Linux)$/", //Applies to SQL Server on Windows and Linux + "platform": "Windows, Linux", //Applies to SQL Server on Windows and Linux "engineEdition": "OnPremises, ManagedInstance", //Applies to SQL on Premises and Azure SQL Managed Instance. Here you can also filter specific editions of SQL Server "name": { "not": "/^(master|tempdb|model)$/" } //Applies to any database excluding master, tempdb, and msdb }, @@ -67,7 +69,7 @@ Demonstrates how to make a custom ruleset containing two checks. The sample cont "target": { //Probes have their own target, usually to separate implementation for different versions, editions, or platforms. Probe targets work the same way as rule targets do. "type": "Database", "version": "(,12.0)", //This target is for SQL Server of versions prior to 2014 - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { //Implementation object with a T-SQL query. This probe is used in many rules, that's why the query return so many fields @@ -79,7 +81,7 @@ Demonstrates how to make a custom ruleset containing two checks. The sample cont "target": { "type": "Database", "version": "[12.0, 13.0)", - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { @@ -91,7 +93,7 @@ Demonstrates how to make a custom ruleset containing two checks. The sample cont "target": { "type": "Database", "version": "[13.0,)", - "platform": "/^(Windows|Linux)$/", + "platform": "Windows, Linux", "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/.gitignore b/samples/manage/sql-assessment-api/SqlAssessmentClient/.gitignore new file mode 100644 index 0000000000..dfcfd56f44 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/.gitignore @@ -0,0 +1,350 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from /~https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (/~https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (/~https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/launch.json b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/launch.json new file mode 100644 index 0000000000..c15aa054b1 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/launch.json @@ -0,0 +1,27 @@ +{ + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit /~https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "version": "0.2.0", + "configurations": [ + { + "name": ".NET Core Launch (console)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/AssessmentClient.SMO/bin/Debug/netcoreapp3.1/AssessmentClient.SMO.dll", + "args": [], + "cwd": "${workspaceFolder}/AssessmentClient.SMO", + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "externalTerminal", + "stopAtEntry": false + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/tasks.json b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/tasks.json new file mode 100644 index 0000000000..f4db04fa1e --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/.vscode/tasks.json @@ -0,0 +1,42 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/AssessmentClient.SMO/AssessmentClient.SMO.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/AssessmentClient.SMO/AssessmentClient.SMO.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "${workspaceFolder}/AssessmentClient.SMO/AssessmentClient.SMO.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/AssessmentClient.SMO.csproj b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/AssessmentClient.SMO.csproj new file mode 100644 index 0000000000..54302bd7c0 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/AssessmentClient.SMO.csproj @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp3.1 + enable + + + + + + + + diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/Program.cs b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/Program.cs new file mode 100644 index 0000000000..5f7c5e9638 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.SMO/Program.cs @@ -0,0 +1,75 @@ +namespace AssessmentClient.SMO +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + + using Microsoft.SqlServer.Management.Assessment; + using Microsoft.SqlServer.Management.Assessment.Checks; + using Microsoft.SqlServer.Management.Smo; + + public static class Program + { + private static async Task Main(string[] args) + { + // Connect to a server or a database with SMO + // https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/create-program/connecting-to-an-instance-of-sql-server + var target = new Server(); + + + // Use GetAssessmentItem method to obtain + // a list of available SQL Assessment checks + IEnumerable checklist = target.GetAssessmentItems(); + + + // Checks are tagged with strings corresponding to + // categories like "Performance", "Storage", or "Security" + var allTags = new SortedSet(checklist.SelectMany(c => c.Tags)); + + DisplayCategories(target.Name, allTags); + + while (Prompt(out string? line)) + { + // Use GetAssessmentResultsList to run assessment + List assessmentResults = string.IsNullOrWhiteSpace(line) + ? await target.GetAssessmentResultsList().ConfigureAwait(false) // all checks + : await target.GetAssessmentResultsList(line.Split()).ConfigureAwait(false); // selected checks + + DisplayAssessmentResults(assessmentResults); + } + } + + private static void DisplayAssessmentResults(List assessmentResults) + { + // Properties of IAssessmentResult provide + // recommendation text, help link, etc + foreach (var result in assessmentResults) + { + Console.WriteLine("-------"); + Console.Write(" "); + Console.WriteLine(result.Message); + Console.Write(" "); + Console.WriteLine(result.Check.HelpLink); + } + } + + private static bool Prompt(out string? line) + { + Console.Write("Enter category (ENTER for all categories, 'exit' to leave) > "); + line = Console.ReadLine(); + + return string.Compare(line, "exit", StringComparison.OrdinalIgnoreCase) != 0; + } + + private static void DisplayCategories(string targetName, IEnumerable allTags) + { + Console.WriteLine($"All categories available for {targetName}:\n"); + + foreach (var tag in allTags) + { + Console.WriteLine($" {tag}"); + } + } + } +} diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.sln b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.sln new file mode 100644 index 0000000000..bf52389299 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/AssessmentClient.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30621.155 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssessmentClient.SMO", "AssessmentClient.SMO\AssessmentClient.SMO.csproj", "{C9745F7C-40B1-43FA-AA5D-C2BF0588038D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9745F7C-40B1-43FA-AA5D-C2BF0588038D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {113F74E6-A46A-4090-A4F5-7280F2623F23} + EndGlobalSection +EndGlobal diff --git a/samples/manage/sql-assessment-api/SqlAssessmentClient/README.md b/samples/manage/sql-assessment-api/SqlAssessmentClient/README.md new file mode 100644 index 0000000000..000e236b78 --- /dev/null +++ b/samples/manage/sql-assessment-api/SqlAssessmentClient/README.md @@ -0,0 +1,224 @@ +# SQL Assessment API client sample + +## Overview + +This repository contains an example C# application using SQL Assessment API. The application uses popular [SQL Management Objects (SMO)](https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/overview-smo?view=sql-server-ver15) library. WHile it was not required to invoke assessment, SMO gives a convenient object-oriented API for managing SQL Server objects. See [Service based SQL Assessment](#Using-SQL-Tools-Service) for an example of non-SMO application. + +To use SQL Assessment API this sample project references [Microsoft.SqlServer.SqlManagementObjects](https://www.nuget.org/packages/Microsoft.SqlServer.SqlManagementObjects) and [Microsoft.SqlServer.Assessment](https://www.nuget.org/packages/Microsoft.SqlServer.Assessment/) Nuget packages. + +## SQL Assessment workflow + +A typical SQL Assessment workflow consists of three stages: + +1. Establish a connection to a SQL Server and select target instance or database (Microsoft.Data.SqlClient, SQL Management Objects, SQL Tools Service, PowerShell). + +2. (Optional) Create SQL Assessment check list. A default check list is used if this step was skipped. + +3. Invoke assessment on the target object selected at step 1. + +## Using SQL Assessment with SQL Management Objects + +### Establish a connection and select a SQL Server object with SMO + +SQL Management Objects is a handy tool for accessing and managing SQL SErver objects. This sample application connects to a local SQL Server instance with a short statement: + +```CSharp +var target = new Server(); +``` + +To assess a database replace this line with the following snippet: + +```CSharp +var target = new Server().Databases["MyDatabase"]; +``` + +See [SMO documentation](https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/overview-smo) for more details on connecting to a server or a database. + +### Invoke assessment with default check list + +SQL Assessment asynchronous code returns a list of SQL Assessment results. Each result can be an assessment note, warning, or error. Every assessment result contains a message to the user with a recommendation. Each assessment note is associated to the corresponding check from the list. + +```CSharp +List results = await target.GetAssessmentResultsList(); +``` + +### Invoke assessment with selected checks + +SQL Assessment API gives a collection of checks currently available for given target. Selected checks may be passed to `GetAssessmentResultsList`. + +```CSharp +IEnumerable availableChecks = target.GetAssessmentItems(); +``` + +Select checks to be run. + +```CSharp +var checklist = availableChecks.First(5); +var results = await target.GetAssessmentResultsList(checklist); +``` + +### Select checks by category + +SQL Assessment check may be tagged with one or more category names. Checks from default check list always have "DefaultRuleset" tag and at least one area tag. "DefaultRuleset" denotes a check produced by default ruleset supplied with SQL Assessment API. Area tags may be "Performance", "Security", "Memory", "Deprecated", "Storage", etc. + +```CSharp +var checklist = target.GetAssessmentItems("Performance", "Security"); +var results = await target.GetAssessmentResultsList(checklist); +``` + +This is equivalent to the following code: + +```CSharp +var results = await target.GetAssessmentResultsList("Performance", "Security"); +``` + +### Custom rule sets + +Checks are generated by a SQL Assessment engine for every target. The engine uses rules from one or more rule sets. Rule sets are collected on a stack. A rule set may override rules from an underlying rule set. A ruleset may be constructed with a C# code, but we recommend using declarative JSON format. For more details on rule set files see [SQL Assessment API GitHub page](/~https://github.com/microsoft/sql-server-samples/tree/master/samples/manage/sql-assessment-api). + +```CSharp +using (var reader = File.OpenText("my ruleset.json")) +{ + SqlAssessmentExtensions.Engine.PushRuleFactoryJson(reader); +} +``` + +## Using SQL Tools Service + +[SQL Tools Service](/~https://github.com/microsoft/sqltoolsservice) is a JSON-RPC service over stdio. SQL assessment takes the same three steps: connect, select checks, run. + +_In the following examples adjust `Content-Length` value according to actual JSON length including CR or CRLF line endings._ + +### Connect with SQL Tools Service + +```json +Content-Length:267 + +{ + "jsonrpc": "2.0", + "id": "12", + "method": "connection/connect", + "params": { + "ownerUri": "my connection", + "connection": { + "serverName": "(local)", + "authenticationType": "Integrated" + } + } +} +``` + +See [SQL Tools Service documentation](https://microsoft.github.io/sqltoolssdk/) for more details on connecting to a server or a database. + +### Get available checks + +Use `targetType` to select target type: + +1. SQL Server instance. + +2. SQL Server database. In this case provide database name while connecting to the target. + +```json +Content-Length:181 + +{ + "jsonrpc": "2.0", + "id": "12", + "method": "assessment/getAssessmentItems", + "params": { + "targetType": 1, + "ownerUri": "my connection" + } +} +``` + +Sample output: + +```json +{ + "jsonrpc": "2.0", + "id": "12", + "result": { + "success": true, + "errorMessage": null, + "items": [ + { + "rulesetVersion": "1.0.280", + "rulesetName": "Microsoft ruleset", + "targetType": 1, + "targetName": "MYSERVER", + "checkId": "TF174", + "tags": [ + "DefaultRuleset", + "TraceFlag", + "Memory", + "Performance" + ], + "displayName": "TF 174 increases the plan cache bucket count", + "description": "Trace Flag 174 increases the SQL Server ...", + "helpLink": "https://docs.microsoft.com/sql/t-sql/ ...", + "level": "Information" + }, + + ... + + ] + } +} +``` + +### Invoke SQL Assessment with SQL Tools Service + +Use the same `targetType`. + +```json +Content-Length:169 + +{ + "jsonrpc": "2.0", + "id": "12", + "method": "assessment/invoke", + "params": { + "targetType": 1, + "ownerUri": "my connection" + } +} +``` + +Sample output: + +```json +{ + "jsonrpc": "2.0", + "id": "12", + "result": { + "success": true, + "errorMessage": null, + "items": [ + { + "message": "Enable trace flag 834 to use large-page allocations to improve analytical and data warehousing workloads", + "kind": 0, + "timestamp": "2020-11-09T22:46:36.5529014+03:00", + "rulesetVersion": "1.0.280", + "rulesetName": "Microsoft ruleset", + "targetType": 1, + "targetName": "MYSERVER", + "checkId": "TF834", + "tags": [ + "DefaultRuleset", + "TraceFlag", + "Performance", + "Memory", + "ColumnStore" + ], + "displayName": "TF 834 enables large-page allocations", + "description": "Trace Flag 834 causes the server ...", + "helpLink": "https://support.microsoft.com/kb/3210239", + "level": "Information" + }, + + ... + ] + } +} +``` \ No newline at end of file diff --git a/samples/manage/sql-assessment-api/notebooks/CustomizationSamples/CustomRuleCLRProbe.json b/samples/manage/sql-assessment-api/notebooks/CustomizationSamples/CustomRuleCLRProbe.json index 82beb5d195..f2fe2b3541 100644 --- a/samples/manage/sql-assessment-api/notebooks/CustomizationSamples/CustomRuleCLRProbe.json +++ b/samples/manage/sql-assessment-api/notebooks/CustomizationSamples/CustomRuleCLRProbe.json @@ -5,12 +5,12 @@ "probes":{ "ManagedCodeRuleProbe": [ { - "type": "CLR", + "type": "External", "target": { "type": "Server" }, "implementation": { - "class": "TestsProbeLibrary.Probe1", + "class": "TestsProbeLibrary.Probe2", "assembly": "C:\\SQLAsmnt\\CustomizationSamples\\TestsProbeLibrary.dll" } } @@ -27,11 +27,11 @@ "itemType": "definition", "displayName": "Check uses 3rd-party assembly", "description": "This is an example of a check using an assembly to get required data.", - "message": "Method from the assembly returned a number greater than the threshold: @{QueryResult} > @{threshold}.", + "message": "Method from the assembly returned a number greater than the threshold: @{ActualCpuUtilization} > @{threshold}.", "target": { "type": "Server" }, "probes": ["ManagedCodeRuleProbe"], "threshold": 83, - "condition": { "less": ["@QueryResult", "@threshold"] } + "condition": { "less": ["@ActualCpuUtilization", "@threshold"] } } ] } diff --git a/samples/manage/sql-assessment-api/notebooks/CustomizationSamples/CustomRuleCmdShellProbe.json b/samples/manage/sql-assessment-api/notebooks/CustomizationSamples/CustomRuleCmdShellProbe.json new file mode 100644 index 0000000000..c25b4df629 --- /dev/null +++ b/samples/manage/sql-assessment-api/notebooks/CustomizationSamples/CustomRuleCmdShellProbe.json @@ -0,0 +1,55 @@ +{ + "schemaVersion": "1.0", + "name": "CmdShell check", + "version": "1.0.0", + "rules": [ + { + "id": "DirectoryCheck", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "displayName": "CmdShell probe", + "description": "This is an example of cmdshell probe type. ", + "message": "File @{stdout.name} has size @{stdout.size} and it's bigger than threshold = @{threshold} bytes", + "level": "Warning", + "threshold": 1024, + "condition": { + "lt": [ + "@stdout.size", + "@threshold" + ] + }, + "probes": [ + { + "id": "ListOfDirectoryFiles", + "transform": { + "type": "parse", + "map": { + "stdout": "/^(?\\d\\d/\\d\\d/\\d\\d\\d\\d)\\s+(?
WITH CHECK CHECK CONSTRAINT statement to avoid possible performance issues: @{constraint_name} constraints are not trusted for referential integrity.", + "message": "Execute ALTER TABLE
WITH CHECK CHECK CONSTRAINT statement to avoid possible performance issues: @{constraint_name} constraints are not trusted for referential integrity", "helpLink": "https://docs.microsoft.com/sql/t-sql/statements/alter-table-transact-sql", "level": "Warning", - "probes": [ "FKNotTrusted" ] + "probes": [ + "FKNotTrusted" + ] }, { "id": "PercentAutogrows", "itemType": "definition", - "target": { + "target": { "type": "Database", - "platform": ["Windows", "Linux"], + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises", - "name": { "not": ["master", "model", "msdb", "tempdb"] }, + "name": { + "not": [ + "master", + "model", + "msdb", + "tempdb" + ] + }, "version": "[11.0,)" }, - "tags": [ "DefaultRuleset", "Performance", "DBFileConfiguration", "DBConfiguration" ], + "tags": [ + "DefaultRuleset", + "Performance", + "DBFileConfiguration", + "DBConfiguration" + ], "displayName": "Database files have a growth ratio set in percentage", "description": "Some database files have a growth ratio set in percentage. Over time, this could lead to uncontrolled disk space allocation and extended time to perform these growths", - "message": "Don't use \"File Growth In Percent\" for the Autogrowth setting. The following files are affected: @{fileName} have a growth ratio set in percentage.", + "message": "Don't use \"File Growth In Percent\" for the Autogrowth setting. The following files are affected: @{fileName} have a growth ratio set in percentage", "helpLink": "https://docs.microsoft.com/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options", "level": "Warning", "probes": [ @@ -3418,36 +5615,63 @@ "itemType": "definition", "target": { "type": "Database", - "platform": ["Windows", "Linux"], + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, - "tags": ["DefaultRuleset", "Performance", "Statistics", "QueryOptimizer"], - "displayName": "Statistics needs to be updated", + "tags": [ + "DefaultRuleset", + "Performance", + "Statistics", + "QueryOptimizer" + ], + "displayName": "Statistics need to be updated", "description": "The Query Optimizer determines whether an index is useful for a specific query by evaluating the stored statistics. If the statistics become out of date and significant changes have occurred against the underlying data, this can result in less than optimal query performance. In most cases, it's best to let SQL Server maintain the statistics. If you turn 'Auto Create Stats' and 'Auto Update Stats' off, then it is up to you to keep the statistics up-to-date somehow. Failure to do so will lead to poor query performance. Most applications should have these options ON. When the Auto Update Statistics setting is ON, the Query Optimizer updates statistics when they are used by a query and when they might be out-of-date. Statistics become out-of-date after insert, update, delete, or merge operations change the data distribution in the table or indexed view. The Query Optimizer determines when statistics might be out-of-date by counting the number of data modifications since the last statistics update and comparing the number of modifications to a threshold. The threshold is based on the number of rows in the table or indexed view. The Query Optimizer checks for out-of-date statistics before compiling a query and before executing a cached query plan. Before compiling a query, the Query Optimizer uses the columns, tables, and indexed views in the query predicate to determine which statistics might be out-of-date. Before executing a cached query plan, the Database Engine verifies that the query plan references up-to-date statistics. The AUTO_UPDATE_STATISTICS option applies to statistics created for indexes, single-columns in query predicates, and statistics that are created by using the CREATE STATISTICS statement. This option also applies to filtered statistics.", - "message": "Update stats in table @{TableName} to improve query performance.", + "message": "Update stats in table @{TableName} to improve query performance", "helpLink": "https://docs.microsoft.com/sql/relational-databases/statistics/statistics#UpdateStatistics", - "probes": ["DatabaseConfiguration", "ObjectStatistics"], "condition": [ "@is_auto_update_stats_on", { "and": [ { "or": [ - { "gt": [ "@rows", "@threshold" ] }, - { "lt": [ "@modification_counter", "@threshold" ] } + { + "gt": [ + "@rows", + "@threshold" + ] + }, + { + "lt": [ + "@modification_counter", + "@threshold" + ] + } ] }, { "or": [ - { "le": [ "@rows", "@threshold" ] }, + { + "le": [ + "@rows", + "@threshold" + ] + }, { "lt": [ "@modification_counter", { "add": [ "@threshold", - { "mul": [ "@rows", 0.2 ] } + { + "mul": [ + "@rows", + 0.2 + ] + } ] } ] @@ -3457,472 +5681,2480 @@ ] } ], - "threshold": 500 - } - ], - "probes": { - "EnabledGlobalTraceFlags": [ + "threshold": 500, + "probes": [ + "DatabaseConfiguration", + "ObjectStatistics" + ] + }, + { + "id": "AdHocQueriesOff", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Security" + ], + "displayName": "Option 'ad hoc distributed queries' should be disabled", + "description": "Ad Hoc Distributed Queries use the OPENROWSET and OPENDATASOURCE functions to connect to remote data sources that use OLE DB. OPENROWSET and OPENDATASOURCE should be used only to reference OLE DB data sources that are accessed infrequently. For any data sources that will be accessed more than several times, define a linked server. Enabling the use of ad hoc names means that any authenticated login to SQL Server can access the provider. SQL Server administrators should enable this feature for providers that are safe to be accessed by any local login.", + "message": "Disable 'ad hoc distributed queries' option", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/ad-hoc-distributed-queries-server-configuration-option", + "level": "Warning", + "condition": { + "not": "@ad_hoc_distributed_queries" + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "AffinityMasksOverlap", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance" + ], + "displayName": "Affinity Mask and Affinity I/O Mask overlapping", + "description": "Enabling a CPU with both the affinity mask and the affinity I/O mask can slow performance by forcing the processor to be overused. When specified either the affinity mask or the affinity I/O mask options they must both be specified, but only enables each CPU no more than once. The same CPU should not be enabled in both the affinity mask option and the affinity I/O mask option. The bits that correspond to each CPU should be in one of the following states.", + "message": "Correct Affinity Mask and Affinity IO Mask overlap. AffinityMask = @{affinity_mask}, Affinity64Mask = @{affinity64_mask}, AffinityIOMask = @{affinity_io_mask}, Affinity64IOMask = @{affinity64_io_mask}", + "helpLink": "https://docs.microsoft.com/sql/relational-databases/policy-based-management/correct-affinity-mask-and-affinity-input-and-output-mask-overlap", + "level": "Warning", + "condition": { + "and": [ + { + "eq": [ + { + "bitand": [ + "@affinity_mask", + "@affinity_io_mask" + ] + }, + 0 + ] + }, + { + "eq": [ + { + "bitand": [ + "@affinity64_mask", + "@affinity64_io_mask" + ] + }, + 0 + ] + } + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "AutoSoftNUMAOn", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[13.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "NUMA" + ], + "displayName": "Auto Soft NUMA should be enabled", + "description": "Modern processors have multiple cores per socket. Each socket is represented, usually, as a single NUMA node. The SQL Server database engine partitions various internal structures and partitions service threads per NUMA node. With processors containing 10 or more cores per socket, using software NUMA to split hardware NUMA nodes generally increases scalability and performance. Prior to SQL Server 2014 (12.x) SP2, software-based NUMA (soft-NUMA) has required to edit the registry to add a node configuration affinity mask, and was configured at the host level, rather than per instance. Soft-NUMA has configured automatically at the database-instance level when the SQL Server Database Engine service starts.", + "message": "Enable 'automatic soft-NUMA disabled' option. There's a possibly inefficient allocation of cores between the NUMA-nodes", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/soft-numa-sql-server", + "level": "Warning", + "condition": { + "not": "@automatic_soft_NUMA_disabled" + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "BlockingChains", + "itemType": "definition", + "target": { + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Statistics" + ], + "displayName": "Blocking chains", + "description": "Blocking chains of sessions can cause poor performance when the duration of locks is too long on the resource.", + "message": "Review locking strategy. @{blocked_spid} process(es) have been blocked@{block_time_min: for more than #0 min;;''}", + "helpLink": "https://docs.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-os-waiting-tasks-transact-sql", + "level": "Warning", + "condition": { + "not": "@blocked_spid" + }, + "probes": [ + { + "id": "ProcessBlockingChains", + "params": { + "waitThreshold": 5 + }, + "transform": { + "type": "aggregate", + "map": { + "blocked_spid": "count", + "block_time_min": "min" + } + } + } + ] + }, + { + "id": "BlockProcThreshNotRecommend", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Blocked Process Threshold is set to recommended value", + "description": "This rule checks that the blocked process threshold option is set to 0 (disabled) or set to a value higher than or equal to 5 (seconds). Setting the blocked process threshold option to a value from 1 to 4 can cause the deadlock monitor to run constantly. Values 1 to 4 should only be used for troubleshooting, and never long term or in a production environment without the assistance of Microsoft Customer Service and Support.", + "message": "Increase or Disable Blocked Process Threshold. Its current value is @{block_threshold}", + "helpLink": "https://docs.microsoft.com/sql/relational-databases/policy-based-management/increase-or-disable-blocked-process-threshold", + "level": "Warning", + "threshold": 5, + "condition": { + "or": [ + { + "le": [ + "@block_threshold", + 0 + ] + }, + { + "ge": [ + "@block_threshold", + "@threshold" + ] + } + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "CrossDBOwnershipOff", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Security" + ], + "displayName": "Option 'cross db ownership chaining' should be disabled", + "description": "Cross-database ownership chaining occurs when a procedure in one database depends on objects in another database. A cross-database ownership chain works in the same way as ownership chaining within a single database, except that an unbroken ownership chain requires that all the object owners are mapped to the same login account. If the source object in the source database and the target objects in the target databases are owned by the same login account, SQL Server does not check permissions on the target objects. Ownership chaining across databases is turned off by default. Microsoft recommends that you disable cross-database ownership chaining because it exposes you to some security risks.", + "message": "Disable 'cross db ownership chaining' option", + "helpLink": "https://docs.microsoft.com/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server", + "level": "Warning", + "condition": { + "not": "@cross_db_ownership_chaining" + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "DefaultTraceOff", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Default trace enabled", + "description": "Use the 'default trace enabled' option to enable or disable the default trace log files. The default trace functionality provides a rich, persistent log of activity and changes primarily related to the configuration options. ", + "message": "Enable option 'default trace enabled', it provides troubleshooting assistance to database administrators", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/default-trace-enabled-server-configuration-option", + "level": "Warning", + "condition": "@default_trace_enabled", + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "DiskPartitionAlignment", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance", + "Storage" + ], + "displayName": "Disk Partition alignment", + "description": "Noncompliance with storage configuration best practices for the Microsoft SQL Server database software is a common root cause of support cases. The reason is often shown to be misalignment between Windows, storage, disk controllers, and cache segment lines. 64 KB is a common, valid starting partition offset because it correlates well with fundamental physical boundaries in disks, controllers, and cache. Other valid starting partition offsets exist.", + "message": "Increase disk partition alignment on @{Output.Name} to make it 64 KB at least. Current volume offset is @{Output.StartingOffset}", + "helpLink": "https://docs.microsoft.com/previous-versions/sql/sql-server-2008/dd758814(v=sql.100)", + "level": "Warning", + "Threshold": 65536, + "probes": [ + { + "id": "MisalignedDiskPartition", + "params": { + "threshold": "@Threshold" + } + } + ] + }, + { + "id": "FullTextServiceLoadOSResources", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Full-text search option 'load_os_resources' set to default", + "description": "Full-text search option 'load_os_resources' indicates whether operating system word breakers, stemmers, and filters are registered and used with this instance of SQL Server. By default, this property is disabled to prevent inadvertent behavior changes by updates made to the operating system. Enabling use of operating system resources provides access to resources for languages and document types registered with Microsoft Indexing Service that do not have an instance-specific resource installed. If you enable the loading of operating system resources, ensure that the operating system resources are trusted signed binaries; otherwise, they cannot be loaded when verify_signature (see below) is set to 1.", + "message": "Set FTS option 'load_os_resources' to @{defaultLoadOSResources}", + "level": "Warning", + "defaultLoadOSResources": 0, + "condition": { + "or": [ + { + "eq": [ + "@IsFulltextInstalled", + 0 + ] + }, + { + "eq": [ + "@LoadOSResources", + "@defaultLoadOSResources" + ] + } + ] + }, + "probes": [ + "FullTextServiceInfo" + ] + }, + { + "id": "FullTextServiceVerifySignature", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Security" + ], + "displayName": "Full-text search option 'verify_signature' set to default", + "description": "Full-text search option 'verify_signature' indicates whether only signed binaries are loaded by the Full-Text Engine. By default, only trusted, signed binaries are loaded.", + "message": "Set FTS option 'load_os_resources' to @{defaultVerifySignature}", + "level": "Warning", + "defaultVerifySignature": 1, + "condition": { + "or": [ + { + "eq": [ + "@IsFulltextInstalled", + 0 + ] + }, + { + "eq": [ + "@VerifySignature", + "@defaultVerifySignature" + ] + } + ] + }, + "probes": [ + "FullTextServiceInfo" + ] + }, + { + "id": "HPLogicalProcessor", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance" + ], + "displayName": "HP Logical Processor issue", + "description": "HP ProLiant Gen9 servers configured with Intel Xeon E5 2600 v3 processors can be configured to support processor configurations that exceed 64 logical processors. Windows Operating Systems divide the logical processors into groups (Kgroups). On HP ProLiant Gen9 servers, the System Firmware, by default, reports the maximum number of possible logical processors to reflect the highest core count processor available. The result is that Windows Operating Systems will group the available logical processors into more than one Kgroup in a two-socket populated configuration. Applications that rely on older kernel APIs for affnitizing threads inside a process to a specific logical processor will only be able to address one Kgroup. The result is that the process will run on fewer logical processors than are presented to the OS for use. Workloads that utilize multiple processes (in lieu of a single process with multiple threads), or are leveraging the APIs that allow beyond single Kgroup addressing, will have full access to all the logical processors presented to the OS for use.", + "message": "Consider updating server BIOS to the latest version. It may be affected by the HP Logical Processor issue. ", + "helpLink": "https://support.hpe.com/hpesc/public/docDisplay?docId=emr_na-c04650594", + "level": "Warning", + "condition": { + "gt": [ + "@virtual_machine_type", + 0 + ] + }, + "probes": [ + "SysDmOsSysInfo", + { + "id": "ServerBIOSInfo", + "transform": { + "type": "parse", + "map": { + "BIOSVendor": "/^(HP|Hewlett-Packard)$/ix" + } + } + }, + { + "id": "ServerCPUInfo", + "transform": [ + { + "type": "parse", + "map": { + "ProcessorNameString": "/.*XEON.*E5.*/ix" + } + }, + { + "type": "aggregate", + "map": { + "ProcessorNameString": "count" + } + } + ] + } + ] + }, + { + "id": "IndexCreateMemory", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "IndexCreateMemory" + ], + "displayName": "Option 'index create memory' value should be greater 'min memory per query'", + "description": "The 'index create memory' option controls the maximum amount of memory initially allocated for sort operations when creating indexes. The default value for this option is 0 (self-configuring). If more memory is later needed for index creation and the memory is available, the server will use it; thereby, exceeding the setting of this option. If additional memory is not available, the index creation will continue using the memory already allocated. However, if you experience difficulties creating indexes, consider increasing the value of this option from its run value.", + "message": "Set option 'index create memory' to default value 0 or make it greater than value of 'min memory per query'. Current 'index create memory' is @{index_create_memory} KB, current 'min memory per query' is @{min_memory_per_query} KB", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-index-create-memory-server-configuration-option", + "level": "Warning", + "condition": { + "or": [ + { + "not": "@index_create_memory" + }, + { + "ge": [ + "@index_create_memory", + "@min_memory_per_query" + ] + } + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "LightweightPoolingOn", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance" + ], + "displayName": "Lightweight pooling option disabled", + "description": "The 'lightweight pooling' option is used to configure SQL Server to use simplified flows (or 'fibers'). Fiber mode is intended for certain situations in which the context switching of the UMS workers are the critical bottleneck in performance. Because this is rare, fiber mode rarely enhances performance or scalability on the typical system. Improved context switching in Microsoft Windows Server 2003 has also reduced the need for fiber mode. We do not recommend that you use fiber mode scheduling for routine operation. This is because it can decrease performance by inhibiting the regular benefits of context switching, and because some components of SQL Server that use Thread Local Storage (TLS) or thread-owned objects, such as mutexes (a type of Win32 kernel object), cannot function correctly in fiber mode.", + "message": "Disable option 'lightweight pooling' as fiber mode scheduling can decrease performance", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/lightweight-pooling-server-configuration-option", + "level": "Warning", + "condition": { + "not": "@lightweight_pooling" + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "LocksOptionNotDefault", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance" + ], + "displayName": "Option 'locks' should be set to default", + "description": "The 'locks' option sets the maximum number of available locks, thereby limiting the amount of memory the SQL Server Database Engine uses for them. The default setting is 0, which allows the Database Engine to allocate and deallocate lock structures dynamically, based on changing system requirements.", + "message": "Set option 'locks' to @{recommended_max_lock_number}, its current value is @{locks}", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-locks-server-configuration-option", + "level": "Warning", + "recommended_max_lock_number": 0, + "condition": { + "eq": [ + "@locks", + "@recommended_max_lock_number" + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "MaxDOP1NUMA", + "itemType": "definition", + "target": { + "type": "Server", + "engineEdition": "OnPremises", + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "MaxDOP", + "Performance", + "Configuration", + "NUMA", + "CPU" + ], + "displayName": "MAXDOP set in accordance to CPU count", + "description": "The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.", + "message": "Update MAXDOP option according to guideline (see help link). Current MAXDOP value is @{max_dop}, CPU count is @{online_logical_processors}", + "helpLink": "https://support.microsoft.com/kb/2806535", + "level": "Warning", + "condition": { + "or": [ + { + "ne": [ + "@numa_nodes", + 1 + ] + }, + { + "and": [ + { + "or": [ + { + "le": [ + "@online_logical_processors", + 8 + ] + }, + { + "eq": [ + "@max_dop", + 8 + ] + } + ] + }, + { + "or": [ + { + "gt": [ + "@online_logical_processors", + 8 + ] + }, + { + "or": [ + { + "eq": [ + "@max_dop", + "@online_logical_processors" + ] + }, + { + "eq": [ + "@max_dop", + 0 + ] + } + ] + } + ] + } + ] + } + ] + }, + "probes": [ + "ServerInstanceConfiguration", + "SysConfiguration" + ] + }, + { + "id": "MaxDopFewNumaLess15", + "itemType": "definition", + "target": { + "type": "Server", + "engineEdition": "OnPremises", + "platform": [ + "Windows", + "Linux" + ], + "version": "[13.0,)" + }, + "tags": [ + "DefaultRuleset", + "MaxDOP", + "Performance", + "Configuration", + "NUMA", + "CPU" + ], + "displayName": "MAXDOP set in accordance to CPU count", + "description": "The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.", + "message": "Update MaxDOP configuration option value: @{max_dop} – it shouldn't exceed the number of logical processors per NUMA node", + "helpLink": "https://support.microsoft.com/kb/2806535", + "level": "Warning", + "condition": { + "or": [ + { + "le": [ + "@numa_nodes", + 1 + ] + }, + { + "or": [ + { + "gt": [ + { + "ceiling": { + "div": [ + "@total_logical_processors", + "@numa_nodes" + ] + } + }, + 15 + ] + }, + { + "lt": [ + "@max_dop", + { + "ceiling": { + "div": [ + "@total_logical_processors", + "@numa_nodes" + ] + } + } + ] + } + ] + } + ] + }, + "probes": [ + "ServerInstanceConfiguration", + "SysConfiguration" + ] + }, + { + "id": "MaxDopFewNumaOver15", + "itemType": "definition", + "target": { + "type": "Server", + "engineEdition": "OnPremises", + "platform": [ + "Windows", + "Linux" + ], + "version": "[13.0,)" + }, + "tags": [ + "DefaultRuleset", + "MaxDOP", + "Performance", + "Configuration", + "NUMA", + "CPU" + ], + "displayName": "MAXDOP set in accordance to CPU count", + "description": "The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.", + "message": "Update MAXDOP configuration option value: @{max_dop} – it should be half the number of logical processors per NUMA node", + "helpLink": "https://support.microsoft.com/kb/2806535", + "level": "Warning", + "condition": { + "or": [ + { + "le": [ + "@numa_nodes", + 1 + ] + }, + { + "or": [ + { + "le": [ + { + "ceiling": { + "div": [ + "@total_logical_processors", + "@numa_nodes" + ] + } + }, + 15 + ] + }, + { + "le": [ + "@max_dop", + { + "div": [ + { + "ceiling": { + "div": [ + "@total_logical_processors", + "@numa_nodes" + ] + } + }, + 2 + ] + } + ] + } + ] + } + ] + }, + "probes": [ + "ServerInstanceConfiguration", + "SysConfiguration" + ] + }, + { + "id": "MaxDopFewNumaOver8", + "itemType": "definition", + "target": { + "type": "Server", + "engineEdition": "OnPremises", + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0, 13.0)" + }, + "tags": [ + "DefaultRuleset", + "MaxDOP", + "Performance", + "Configuration", + "NUMA", + "CPU" + ], + "displayName": "MAXDOP set in accordance to CPU count", + "description": "The Microsoft SQL Server max degree of parallelism (MAXDOP) configuration option controls the number of processors that are used for the execution of a query in a parallel plan. This option determines the number of threads that are used for the query plan operators that perform the work in parallel. Depending on whether SQL Server is set up on a symmetric multiprocessing (SMP) computer, a non-uniform memory access (NUMA) computer, or hyperthreading-enabled processors, the max degree of parallelism option should be configured appropriately.", + "message": "Update MaxDOP configuration option value: @{max_dop} – it should equal to 8", + "helpLink": "https://support.microsoft.com/kb/2806535", + "level": "Warning", + "condition": { + "or": [ + { + "le": [ + "@numa_nodes", + 1 + ] + }, + { + "or": [ + { + "lt": [ + { + "ceiling": { + "div": [ + "@total_logical_processors", + "@numa_nodes" + ] + } + }, + 8 + ] + }, + { + "le": [ + "@max_dop", + 8 + ] + } + ] + } + ] + }, + "probes": [ + "ServerInstanceConfiguration", + "SysConfiguration" + ] + }, + { + "id": "MinMemoryPerQuery", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Memory", + "Performance" + ], + "displayName": "Option 'min memory per query' set to default", + "description": "The min memory per query option specifies the minimum amount of memory (in kilobytes) that will be allocated for the execution of a query. This is also known as the minimum memory grant. The default value is 1,024 KB. Do not set the min memory per query server configuration option too high, especially on very busy systems, because the query has to wait1 until it can secure the minimum memory requested, or until the value specified in the query wait server configuration option is exceeded. If more memory is available than the specified minimum value required to execute the query, the query is allowed to make use of the additional memory, provided that the memory can be used effectively by the query.", + "message": "Set option 'min memory per query' to @{recommended_min_memory_per_query} KB, current value is '@{min_memory_per_query}'", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-min-memory-per-query-server-configuration-option", + "level": "Warning", + "recommended_min_memory_per_query": 1024, + "condition": { + "eq": [ + "@min_memory_per_query", + "@recommended_min_memory_per_query" + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "NetworkPacketSize", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Network" + ], + "displayName": "Option 'network packet size' set to default", + "description": "The 'network packet size' option sets the packet size (in bytes) that is used across the whole network. Packets are the fixed-size chunks of data that transfer requests and results between clients and servers. The default packet size is 4096 bytes.", + "message": "Set option 'network packet size' to @{recommended_network_packet_size} bytes, current value is @{network_packet_size}", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-network-packet-size-server-configuration-option", + "level": "Warning", + "recommended_network_packet_size": 4096, + "condition": { + "eq": [ + "@network_packet_size", + "@recommended_network_packet_size" + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "NtfsBlockSizeNotFormatted", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance", + "Configuration", + "NTFS" + ], + "displayName": "NTFS block size in volumes that hold database files <> 64KB", + "description": "A drive can be formatted with different sizes ranging from 512 bytes to 64K sizes with the default being 4KB (4096 bytes). This setting is also called as “Bytes Per Cluster”. The atomic unit of storage in SQL Server is a page which is 8KB in size. Extents are groups of eight 8 KB pages that are physically contiguous to each other for a total of 64 KB. SQL Server uses extents to store data. Hence, on a SQL Server machine the NTFS Allocation unit size hosting SQL database files (Including tempdb files) should be 64 KB.", + "message": "Set allocation unit size on volume @{masterFilesVolumeName} to 64 KB. Current size is @{Output.BlockSize} bytes", + "helpLink": "https://docs.microsoft.com/archive/blogs/docast/operating-system-best-practice-configurations-for-sql-server", + "level": "Warning", + "BlockSize": 65536, + "condition": { + "or": [ + { + "ne": [ + "@masterFilesVolumeName", + "@Output.Name" + ] + }, + { + "eq": [ + "@Output.BlockSize", + "@BlockSize" + ] + } + ] + }, + "probes": [ + "NtfsBlockSize", + "Win32Volume" + ] + }, + { + "id": "OleAutomationProceduresOn", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Security" + ], + "displayName": "Option 'Ole Automation Procedures' set to default", + "description": "Use the 'Ole Automation Procedures' option to specify whether OLE Automation objects can be instantiated within Transact-SQL batches. When OLE Automation Procedures are enabled, a call to 'sp_OACreate' will start the OLE shared execution environment. The 'Ole Automation Procedures' option can be set to the following values: 1 Enabled, 0 Disabled (default value).", + "message": "Disable option 'Ole Automation Procedures' option, it exposes to security risks", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option", + "level": "Warning", + "condition": { + "not": "@ole_automation_procedures" + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "PageFileAutoManaged", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance", + "Memory", + "PageFile", + "SysAdminReq" + ], + "displayName": "Page file is not automatically managed", + "description": "Memory allocation failures can occur due to latencies that are associated with growing the size of a page file to support additional memory requirements in the system. A potential cause of these failures is when the page file size is configured as “automatic.” Automatic page-file size starts with a small page file and grows automatically as needed. The IO system consists of many components, including file system filters, file systems, volume filters, storage filters, and so on. The specific components on a given system can cause variability in page file growth.", + "message": "Avoid automatic management of page files, set custom sizes for page files on drives: '@{PagingFiles.Drive}'", + "helpLink": "https://support.microsoft.com/help/4055223/memory-allocation-errors-can-be-caused-by-slow-page-file-growth", + "level": "Warning", + "probes": [ + { + "id": "PageFileManagement", + "transform": [ + { + "type": "parse", + "map": { + "PagingFiles": "/^(?\\w:)\\\\pagefile.sys 0 0$/x" + } + }, + { + "type": "aggregate", + "map": { + "PagingFiles.Drive": "join" + } + } + ] + } + ] + }, + { + "id": "PageFileAutoManagedAllDrives", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance", + "Memory", + "PageFile", + "SysAdminReq" + ], + "displayName": "Page file is not automatically managed", + "description": "Memory allocation failures can occur due to latencies that are associated with growing the size of a page file to support additional memory requirements in the system. A potential cause of these failures is when the page file size is configured as “automatic.” Automatic page-file size starts with a small page file and grows automatically as needed. The IO system consists of many components, including file system filters, file systems, volume filters, storage filters, and so on. The specific components on a given system can cause variability in page file growth. ", + "message": "Disable option 'Automatically manage paging file size for all drives'", + "helpLink": "https://support.microsoft.com/help/4055223/memory-allocation-errors-can-be-caused-by-slow-page-file-growth", + "level": "Warning", + "condition": { + "ne": [ + "@PagingFiles", + "?:\\pagefile.sys" + ] + }, + "probes": [ + "PageFileManagement" + ] + }, + { + "id": "PageFileLess10FreeSpace", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance", + "Memory", + "PageFile", + "SysAdminReq" + ], + "displayName": "Insufficient page file free space", + "description": "Page file sizing depends on the system crash dump setting requirements and the peak usage or expected peak usage of the system commit charge. Both considerations are unique to each system, even for systems that are identical. This means that page file sizing is also unique to each system and cannot be generalized.", + "message": "Revise page file settings. Less than 10% of page file is available", + "helpLink": "https://docs.microsoft.com/windows/client-management/determine-appropriate-page-file-size", + "level": "Warning", + "threshold": 0.1, + "condition": { + "or": [ + { + "eq": [ + { + "sub": [ + "@total_page_file_kb", + "@total_physical_memory_kb" + ] + }, + 0 + ] + }, + { + "gt": [ + { + "div": [ + { + "sub": [ + "@available_page_file_kb", + "@available_physical_memory_kb" + ] + }, + { + "sub": [ + "@total_page_file_kb", + "@total_physical_memory_kb" + ] + } + ] + }, + "@threshold" + ] + } + ] + }, + "probes": [ + "OsSysMemory" + ] + }, + { + "id": "PageFileNotConfigured", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance", + "Memory", + "PageFile", + "SysAdminReq" + ], + "displayName": "Page file configured", + "description": "Page file sizing depends on the system crash dump setting requirements and the peak usage or expected peak usage of the system commit charge. Both considerations are unique to each system, even for systems that are identical. This means that page file sizing is also unique to each system and cannot be generalized.", + "message": "Create a page file on server", + "helpLink": "https://docs.microsoft.com/windows/client-management/determine-appropriate-page-file-size", + "level": "Warning", + "condition": "@PagingFiles", + "probes": [ + "PageFileManagement" + ] + }, + { + "id": "PageFileOut", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance", + "Memory", + "PageFile", + "SysAdminReq" + ], + "displayName": "Memory paged out", + "description": "Microsoft SQL Server performs dynamic memory management based on the memory requirements of the current load and activities on the system. On Windows, SQL Server can use the memory notification mechanisms that are provided by the QueryMemoryResourceNotification Windows API. Based on this information from the QueryMemoryResourceNotification Windows API or from the memory calculation, SQL Server responds to the current memory situation on a specific system. This provides the following benefits: 1. The system does not page out the working set of the SQL Server process; 2. The necessary database pages are available in memory to reduce physical I/O needs. For more information, see the \"Dynamic memory management\" topic and the \"Server memory options\" topic in SQL Server Books Online.", + "message": "Revise LPIM settings. Part of SQL Server process memory has been paged out", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/enable-the-lock-pages-in-memory-option-windows", + "level": "Warning", + "condition": { + "gt": [ + "@available_page_file_kb", + 0 + ] + }, + "probes": [ + "OsSysMemory" + ] + }, + { + "id": "PowerPlanSchemeNotRecommended", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance" + ], + "displayName": "Power plan is High Performance", + "description": "In some cases you may experience degraded overall performance on a Windows Server 2008 R2 or later machine when running with the default (Balanced) power plan. The issue may occur irrespective of platform and may be exhibited on both native and virtual environments. The degraded performance may increase the average response time for some tasks and cause performance issues with CPU-intensive applications. Please note that you may not notice performance issues while performing simple operations. However, applications or scripts that intensively use resources (primarily processor and memory) may exhibit the problem. To work around the performance degradation issue, you can switch to the High Performance power plan. However, this will disable dynamic performance scaling on the platform. Depending on the environment, if the platform is always under a heavy load, then this is a viable solution.", + "message": "Switch server to High Performance power plan", + "helpLink": "https://support.microsoft.com/help/2207548/slow-performance-on-windows-server-when-using-the-balanced-power-plan", + "level": "Warning", + "powerplanid": "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c", + "condition": { + "or": [ + { + "eq": [ + "@ActivePowerScheme", + 0 + ] + }, + { + "eq": [ + "@ActivePowerScheme", + "@powerplanid" + ] + } + ] + }, + "probes": [ + "PowerPlan" + ] + }, + { + "id": "PriorityBoostOn", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance" + ], + "displayName": "Option 'priority boost' set to default", + "description": "The 'priority boost' option used to specify whether Microsoft SQL Server should run at a higher scheduling priority than other processes on the same computer. If this option is set to 1, SQL Server runs at a priority base of '13' scheduler. The default is '0', which is a priority base of '7'.", + "message": "Set 'priority boost' option to default value", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-priority-boost-server-configuration-option", + "level": "Critical", + "condition": { + "not": "@priority_boost" + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "QueryWaitNotDefault", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Option 'query wait' set to default", + "description": "Memory-intensive queries (such as those involving sorting and hashing) are queued when there is not enough memory available to run the query. The query wait option specifies the time, in seconds (from 0 through 2147483647), that a query waits for resources before it times out. The default value for this option is -1. This means the time-out is calculated as 25 times the estimated query cost.", + "message": "Set option 'query wait' to @{default_query_wait}, current value is @{query_wait}. Increasing the maximum wait time may increase the amount of time for the query to be terminated", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-query-wait-server-configuration-option", + "level": "Critical", + "default_query_wait": -1, + "condition": { + "eq": [ + "@query_wait", + "@default_query_wait" + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "RecoveryIntervalOn", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance" + ], + "displayName": "Option 'recovery interval' set to default", + "description": "The 'recovery interval' option defines an upper limit on the time recovering a database should take. The default recovery-interval value is 0, which allows the Database Engine to automatically configure the recovery interval. Higher values indicate the approximate maximum recovery time, in minutes.", + "message": "Set option 'recovery interval' to @{default_recovery_interval}, current value is @{recovery_interval}", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-recovery-interval-server-configuration-option", + "level": "Warning", + "default_recovery_interval": 0, + "condition": { + "eq": [ + "@recovery_interval", + "@default_recovery_interval" + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "RemoteDacClusterOn", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Remote admin connections enabled on cluster (DAC)", + "description": "SQL Server provides a dedicated administrator connection (DAC). The DAC lets an administrator access a running server to execute diagnostic functions or Transact-SQL statements, or to troubleshoot problems on the server, even when the server is locked or running in an abnormal state and not responding to a SQL Server Database Engine connection. On cluster configurations, the DAC will be off by default. Users can execute the remote admin connection option of sp_configure to enable the DAC listener to access a remote connection. If SQL Server is unresponsive and the DAC listener is not enabled, you might have to restart SQL Server to connect with the DAC. Therefore, we recommend that you enable the remote admin connections configuration option on clustered systems.", + "message": "Enable 'remote admin connections' option", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/diagnostic-connection-for-database-administrators", + "level": "Warning", + "condition": { + "or": [ + { + "not": "@is_clustered_server" + }, + "@remote_admin_connections" + ] + }, + "probes": [ + "SysConfiguration", + "IsClusteredServer" + ] + }, + { + "id": "RemoteQueryTimeout", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Option 'remote query timeout' set to default", + "description": "The 'remote query timeout' option specifies how long, in seconds, a remote operation can take before SQL Server times out. The default value for this option is 600, which allows a 10-minute wait. This value applies to an outgoing connection initiated by the Database Engine as a remote query.", + "message": "Set option 'remote query timeout' to @{recommended_remote_query_timeout}, current value is @{remote_query_timeout}", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-remote-query-timeout-server-configuration-option", + "level": "Warning", + "recommended_remote_query_timeout": 600, + "condition": { + "eq": [ + "@remote_query_timeout", + "@recommended_remote_query_timeout" + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "ScanStartupProcs", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Option 'scan for startup procs' disabled on replication servers", + "description": "Use the scan for startup procs option to scan for automatic execution of stored procedures at SQL Server startup time. If this option is set to 1, SQL Server scans for and runs all automatically run stored procedures that are defined on the server. The default value for scan for startup procs is 0 (do not scan). This option shouldn't be enabled on a SQL Server participating in replication.", + "message": "Disable option 'scan for startup procs' as this server participates in replication", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-scan-for-startup-procs-server-configuration-option", + "level": "Warning", + "condition": { + "or": [ + { + "not": "@ReplicationInfo::IsInstalled" + }, + { + "not": "@startup_stored_procedures" + } + ] + }, + "probes": [ + "ReplicationInfo", + "SysConfiguration" + ] + }, + { + "id": "ThreadExhaustionCPUBound", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance" + ], + "displayName": "Worker thread exhaustion on CPU-bound system", + "description": "Consider overall runnable tasks count and schedulers work queue count.", + "message": "Possible worker thread exhaustion (schedulers work queue count is '@{schedulers_work_queue_count}'). Overall runnable tasks count is '@{overall_runnable_tasks_count}' (> 2), indicating the server might be CPU-bound. Configured workers is '@{max_workers_count}'", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option", + "level": "Warning", + "condition": { + "or": [ + { + "le": [ + "@schedulers_work_queue_count", + 1 + ] + }, + { + "le": [ + "@overall_runnable_tasks_count", + 2 + ] + } + ] + }, + "probes": [ + "WorkerThreads", + "SysDmOsSysInfo" + ] + }, + { + "id": "ThreadExhaustionNotCPUBound", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Performance" + ], + "displayName": "Possible worker thread exhaustion on a not-CPU-bound system", + "description": "Consider overall runnable tasks count and schedulers work queue count.", + "message": "Possible worker thread exhaustion (schedulers work queue count is '@{schedulers_work_queue_count}'). Because the overall runnable tasks count is '@{overall_runnable_tasks_count}' (<= 2), indicating the server might not be CPU bound, there might be room to increase max_worker_threads (configured workers is '@{max_workers_count}')", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option", + "level": "Warning", + "condition": { + "or": [ + { + "le": [ + "@schedulers_work_queue_count", + 1 + ] + }, + { + "gt": [ + "@overall_runnable_tasks_count", + 2 + ] + } + ] + }, + "probes": [ + "WorkerThreads", + "SysDmOsSysInfo" + ] + }, + { + "id": "ThresholdForParallelism", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance" + ], + "displayName": "Option 'cost threshold for parallelism' set to default", + "description": "The 'cost threshold for parallelism' option specifies the threshold at which SQL Server creates and runs parallel plans for queries. SQL Server creates and runs a parallel plan for a query only when the estimated cost to run a serial plan for the same query is higher than the value set in the cost threshold for parallelism. The cost refers to an estimated cost required to run the serial plan on a specific hardware configuration and is not a unit of time. The 'cost threshold for parallelism' option can be set to any value from 0 through 32767. The default value is 5.", + "message": "Set option 'cost threshold for parallelism' to @{default_cost_parallel}, current value is @{cost_threshold_for_parallelism}", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-cost-threshold-for-parallelism-server-configuration-option", + "level": "Warning", + "default_cost_parallel": 5, + "condition": { + "eq": [ + "@cost_threshold_for_parallelism", + "@default_cost_parallel" + ] + }, + "probes": [ + "SysConfiguration" + ] + }, + { + "id": "WorkerThreadsLargeX64", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance", + "CPU" + ], + "displayName": "Option 'max worker threads' set to recommended value on x64 system", + "description": "The max worker threads option configures the number of worker threads that are available to SQL Server processes. The default value for max worker threads is 0. This enables SQL Server to automatically configure the number of worker threads at startup.", + "message": "Reconfigure option 'max worker threads' parameter. Its current value (@{max_worker_threads}) is higher than recommended for x64 system (@{recommended_max_worker_threads})", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option", + "level": "Warning", + "recommended_max_worker_threads": 2048, + "condition": { + "or": [ + { + "ne": [ + "@host_architecture", + 64 + ] + }, + { + "lt": [ + "@max_worker_threads", + "@recommended_max_worker_threads" + ] + } + ] + }, + "probes": [ + "SysDmOsHostInfo", + "SysConfiguration" + ] + }, + { + "id": "WorkerThreadsLargeX86", + "itemType": "definition", + "target": { + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration", + "Performance", + "CPU" + ], + "displayName": "Option 'max worker threads' set to recommended value on x86 system", + "description": "The max worker threads option configures the number of worker threads that are available to SQL Server processes. he default value for max worker threads is 0. This enables SQL Server to automatically configure the number of worker threads at startup.", + "message": "Reconfigure option 'max worker threads' parameter. Its current value (@{max_worker_threads}) is higher than recommended for x86 system (@{recommended_max_worker_threads})", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/configure-the-max-worker-threads-server-configuration-option", + "level": "Warning", + "recommended_max_worker_threads": 1024, + "condition": { + "or": [ + { + "ne": [ + "@host_architecture", + 32 + ] + }, + { + "lt": [ + "@max_worker_threads", + "@recommended_max_worker_threads" + ] + } + ] + }, + "probes": [ + "SysDmOsHostInfo", + "SysConfiguration" + ] + }, + { + "id": "XpCmdShellOn", + "itemType": "definition", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "tags": [ + "DefaultRuleset", + "Configuration" + ], + "displayName": "Option 'xp_cmdshell' is disabled", + "description": "The xp_cmdshell option is a SQL Server configuration option that enables system administrators to control whether the xp_cmdshell extended stored procedure can be executed on a system. By default, the xp_cmdshell option is disabled on new installations. ", + "message": "Disable 'xp_cmdshell' as it exposes to the security risks", + "helpLink": "https://docs.microsoft.com/sql/database-engine/configure-windows/xp-cmdshell-server-configuration-option", + "level": "Warning", + "condition": { + "not": "@xp_cmdshell" + }, + "probes": [ + "SysConfiguration" + ] + } + ], + "probes": { + "EnabledGlobalTraceFlags": [ + { + "type": "SQL", + "target": { + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "DECLARE @tracestatus TABLE (TraceFlag NVARCHAR(40), [Status] tinyint, [Global] tinyint, [Session] tinyint); INSERT INTO @tracestatus EXEC ('DBCC TRACESTATUS WITH NO_INFOMSGS'); IF NOT EXISTS(SELECT * FROM @tracestatus WHERE Global=1) SELECT 0 AS [TraceFlag], 0 AS [Status] ELSE SELECT [TraceFlag], [Status] FROM @tracestatus WHERE Global=1", + "transform": { + "type": "aggregate", + "map": { + "TraceFlag": "array" + } + } + } + } + ], + "CountBlackBoxTraces": [ + { + "type": "SQL", + "target": { + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT COUNT(id) AS [BlackBoxTraceCount] FROM [sys].[traces] WHERE [path] LIKE '%blackbox%.trc' AND status=1;" + } + } + ], + "CountDefaultTraces": [ + { + "type": "SQL", + "target": { + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT COUNT(id) AS [DefaultTraceCount] FROM [sys].[traces] WHERE is_default = 1 AND status = 1;" + } + } + ], + "XEvent.SystemHealth": [ + { + "type": "SQL", + "target": { + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT COUNT(name) AS [XEvent.SystemHealthCount] FROM [sys].[dm_xe_sessions] WHERE [name] = 'system_health';" + } + } + ], + "XEvent.SPServerDiagnostics": [ + { + "type": "SQL", + "target": { + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT COUNT(name) AS [XEvent.SPServerDiagnostics] FROM sys.dm_xe_sessions WHERE [name] = 'sp_server_diagnostics session';" + } + } + ], + "DeprecatedFeaturesStats": [ + { + "type": "SQL", + "target": { + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT [instance_name] AS [DeprecatedFeature] FROM [sys].[dm_os_performance_counters] WHERE ([object_name] LIKE '%Deprecated Features%') AND ([cntr_value] > 0);", + "transform": { + "type": "aggregate", + "map": { + "DeprecatedFeature": "join" + } + } + } + } + ], + "DatabaseConfiguration": [ + { + "type": "SQL", + "target": { + "type": "Database", + "version": "[11.0,12.0)", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance" + }, + "implementation": { + "query": "SELECT db.is_auto_create_stats_on, db.is_auto_update_stats_on, 0 AS query_store_state, db.collation_name, (SELECT collation_name FROM master.sys.databases (NOLOCK) WHERE database_id = 1) AS master_collation, db.is_auto_close_on, db.is_auto_shrink_on, db.page_verify_option, db.is_db_chaining_on, NULL AS is_auto_create_stats_incremental_on, db.is_trustworthy_on, db.is_parameterization_forced,db.is_read_only AS IsReadOnly,db.[state] AS DbState FROM [sys].[databases] (NOLOCK) AS db WHERE db.[name]=@TargetName" + } + }, + { + "type": "SQL", + "target": { + "type": "Database", + "version": "[12.0, 13.0)", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance" + }, + "implementation": { + "query": "SELECT db.is_auto_create_stats_on, db.is_auto_update_stats_on, 0 AS query_store_state, db.collation_name, (SELECT collation_name FROM master.sys.databases (NOLOCK) WHERE database_id = 1) AS master_collation, db.is_auto_close_on, db.is_auto_shrink_on, db.page_verify_option, db.is_db_chaining_on, db.is_auto_create_stats_incremental_on, db.is_trustworthy_on, db.is_parameterization_forced,db.is_read_only AS IsReadOnly,db.[state] AS DbState FROM [sys].[databases] (NOLOCK) AS db WHERE db.[name]=@TargetName" + } + }, + { + "type": "SQL", + "target": { + "type": "Database", + "version": "[13.0,)", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance" + }, + "implementation": { + "useDatabase": true, + "query": "SELECT db.is_auto_create_stats_on, db.is_auto_update_stats_on, (SELECT CAST(actual_state AS DECIMAL) FROM [sys].[database_query_store_options]) AS query_store_state, db.collation_name, (SELECT collation_name FROM master.sys.databases (NOLOCK) WHERE database_id = 1) AS master_collation, db.is_auto_close_on, db.is_auto_shrink_on, db.page_verify_option, db.is_db_chaining_on, db.is_auto_create_stats_incremental_on, db.is_trustworthy_on, db.is_parameterization_forced,db.is_read_only AS IsReadOnly,db.[state] AS DbState FROM [sys].[databases] (NOLOCK) AS db WHERE db.[name]=@TargetName" + } + } + ], + "FKNoIndexes": [ + { + "type": "SQL", + "target": { + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "useDatabase": true, + "query": "SELECT QUOTENAME(fk.parent_schema_name)+ '.' + QUOTENAME(fk.parent_table_name) + '.' + QUOTENAME(fk.constraint_name) AS ConstraintName FROM ( SELECT t.name AS [parent_schema_name], OBJECT_NAME(FKC.parent_object_id) [parent_table_name], OBJECT_NAME(constraint_object_id) AS [constraint_name], SUBSTRING((SELECT ',' + RTRIM(COL_NAME(k.parent_object_id,parent_column_id)) AS [data()] FROM sys.foreign_key_columns k (NOLOCK) INNER JOIN sys.foreign_keys (NOLOCK) ON k.constraint_object_id = [object_id] AND k.constraint_object_id = FKC.constraint_object_id ORDER BY constraint_column_id FOR XML PATH('')), 2, 8000) AS [parent_columns] FROM sys.foreign_key_columns FKC (NOLOCK) INNER JOIN sys.objects o (NOLOCK) ON FKC.parent_object_id = o.[object_id] INNER JOIN sys.tables mst (NOLOCK) ON mst.[object_id] = o.[object_id] INNER JOIN sys.schemas t (NOLOCK) ON t.[schema_id] = mst.[schema_id] INNER JOIN sys.objects so (NOLOCK) ON FKC.referenced_object_id = so.[object_id] WHERE o.type = 'U' AND so.type = 'U' GROUP BY o.[schema_id],so.[schema_id],FKC.parent_object_id,constraint_object_id,referenced_object_id,t.name ) fk WHERE NOT EXISTS (SELECT 1 FROM ( SELECT t.name AS schemaName, OBJECT_NAME(mst.[object_id]) AS objectName, SUBSTRING(( SELECT ',' + RTRIM(ac.name) FROM sys.tables AS st INNER JOIN sys.indexes AS mi ON st.[object_id] = mi.[object_id] INNER JOIN sys.index_columns AS ic ON mi.[object_id] = ic.[object_id] AND mi.[index_id] = ic.[index_id] INNER JOIN sys.all_columns AS ac ON st.[object_id] = ac.[object_id] AND ic.[column_id] = ac.[column_id] WHERE i.[object_id] = mi.[object_id] AND i.index_id = mi.index_id AND ic.is_included_column = 0 ORDER BY ac.column_id FOR XML PATH('')), 2, 8000) AS KeyCols FROM sys.indexes AS i INNER JOIN sys.tables AS mst ON mst.[object_id] = i.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id] = mst.[schema_id] WHERE i.[type] IN (1,2,5,6) AND i.is_unique_constraint = 0 AND mst.is_ms_shipped = 0 ) ict WHERE fk.parent_schema_name = ict.schemaName AND fk.parent_table_name = ict.objectName AND REPLACE(fk.parent_columns,' ,',',') = ict.KeyCols);", + "transform": { + "type": "aggregate", + "map": { + "ConstraintName": "join" + } + } + } + } + ], + "Hints.InstanceStatistics": [ + { + "type": "SQL", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT COUNT([counter]) AS [HintUsageCount] FROM [sys].[dm_exec_query_optimizer_info] WHERE ([counter] = 'order hint' OR [counter] = 'join hint') AND occurrence > 1;" + } + } + ], + "Hints.ModuleUsage": [ + { + "type": "SQL", + "target": { + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "useDatabase": true, + "query": "SELECT ss.name AS [Schema_Name], so.name AS [Object_Name], so.type_desc, CASE WHEN sm.[definition] LIKE '%FORCE ORDER%' THEN '[FORCE ORDER Hint]' WHEN sm.[definition] LIKE '%MERGE JOIN%' OR sm.[definition] LIKE '%LOOP JOIN%' OR sm.[definition] LIKE '%HASH JOIN%' THEN '[JOIN Hint]' END AS Hint FROM [sys].[sql_modules] AS sm INNER JOIN [sys].[objects] AS so ON sm.[object_id] = so.[object_id] INNER JOIN [sys].[schemas] AS ss ON so.[schema_id] = ss.[schema_id] WHERE (sm.[definition] LIKE '%FORCE ORDER%' OR sm.[definition] LIKE '%MERGE JOIN%' OR sm.[definition] LIKE '%LOOP JOIN%' OR sm.[definition] LIKE '%HASH JOIN%') AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped') = 0;" + } + } + ], + "CachedPlans.SingleUseRatio": [ { "type": "SQL", "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "DECLARE @tracestatus TABLE (TraceFlag NVARCHAR(40), [Status] tinyint, [Global] tinyint, [Session] tinyint); INSERT INTO @tracestatus EXEC ('DBCC TRACESTATUS WITH NO_INFOMSGS'); IF NOT EXISTS(SELECT * FROM @tracestatus WHERE Global=1) SELECT 0 AS [TraceFlag], 0 AS [Status] ELSE SELECT [TraceFlag], [Status] FROM @tracestatus WHERE Global=1", - "transform": { - "type": "aggregate", - "map": { - "TraceFlag": "array" - } - } + "query": "DECLARE @Size1 AS REAL, @Size2 AS REAL; SET @Size1=COALESCE((SELECT SUM(CAST(size_in_bytes AS bigint)) AS Size1 FROM [sys].[dm_exec_cached_plans] (NOLOCK) WHERE cacheobjtype LIKE '%Plan%' AND usecounts = 1),0);SET @Size2=COALESCE((SELECT SUM(CAST(size_in_bytes AS bigint)) AS Size2 FROM [sys].[dm_exec_cached_plans] (NOLOCK) WHERE cacheobjtype LIKE '%Plan%' AND usecounts > 1),0);SELECT @Size1/(@Size1+@Size2) AS [SingleUsePlansUseRatio];" } } ], - "CountBlackBoxTraces": [ + "Hypothetical.Indexes": [ { "type": "SQL", "target": { - "type": "Server", + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT COUNT(id) AS [BlackBoxTraceCount] FROM [sys].[traces] WHERE [path] LIKE '%blackbox%.trc' AND status=1;" + "useDatabase": true, + "query": "SELECT QUOTENAME(t.name) AS [Schema], QUOTENAME(o.[name]) AS [Object], i.name AS [IndexName] FROM [sys].[indexes] i INNER JOIN [sys].[objects] AS o ON o.[object_id] = i.[object_id] INNER JOIN [sys].[tables] AS mst ON mst.[object_id] = i.[object_id] INNER JOIN [sys].[schemas] AS t ON t.[schema_id] = mst.[schema_id] WHERE i.is_hypothetical = 1;" } } ], - "CountDefaultTraces": [ + "Hypothetical.Statistics": [ { "type": "SQL", "target": { - "type": "Server", + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT COUNT(id) AS [DefaultTraceCount] FROM [sys].[traces] WHERE is_default = 1 AND status = 1;" + "useDatabase": true, + "query": "SELECT QUOTENAME(t.name) AS [Schema], QUOTENAME(o.[name]) AS [Object], s.name AS [StatName] FROM [sys].[stats] s INNER JOIN [sys].[objects] AS o (NOLOCK) ON o.[object_id] = s.[object_id] INNER JOIN [sys].[tables] AS mst (NOLOCK) ON mst.[object_id] = s.[object_id] INNER JOIN [sys].[schemas] AS t (NOLOCK) ON t.[schema_id] = mst.[schema_id] WHERE (s.name LIKE 'hind_%' OR s.name LIKE '_dta_stat%') AND auto_created = 0 AND s.name NOT IN (SELECT name FROM sys.indexes);" } } ], - "XEvent.SystemHealth": [ + "SQLServerVersion": [ + { + "type": "SQL", + "type": "CLR", + "name": "SQLServerVersion", + "implementation": { + "class": "Microsoft.SqlServer.Management.Assessment.Probes.ServerVersionProbe" + } + } + ], + "MissedIndexes": [ { "type": "SQL", "target": { - "type": "Server", + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT COUNT(name) AS [XEvent.SystemHealthCount] FROM [sys].[dm_xe_sessions] WHERE [name] = 'system_health';" + "useDatabase": true, + "query": "SELECT RIGHT(i.[statement],LEN(i.[statement])-(LEN(m.[name])+3)) AS [Table], CASE WHEN (i.equality_columns IS NOT NULL AND i.inequality_columns IS NULL) THEN i.equality_columns WHEN (i.equality_columns IS NULL AND i.inequality_columns IS NOT NULL) THEN i.inequality_columns ELSE i.equality_columns+','+i.inequality_columns END AS [KeyCols], ISNULL(i.included_columns,'') AS [IncludedCols],(CONVERT(NUMERIC(19,3),s.user_seeks)+CONVERT(NUMERIC(19,3),s.user_scans))*CONVERT(NUMERIC(19,3),s.avg_total_user_cost)*CONVERT(NUMERIC(19,3),s.avg_user_impact) AS [Score] FROM [sys].[dm_db_missing_index_details] i INNER JOIN [master].[sys].[databases] m ON i.database_id=m.database_id INNER JOIN [sys].[dm_db_missing_index_groups] g ON i.index_handle=g.index_handle INNER JOIN [sys].[dm_db_missing_index_group_stats] s ON s.group_handle=g.index_group_handle WHERE m.[name]=@TargetName" } } ], - "XEvent.SPServerDiagnostics": [ + "DatabaseBackups": [ + { + "type": "SQL", + "target": { + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT db.recovery_model, db.recovery_model_desc, fb.LastFullBackup, tl.LastTLBackup FROM [master].[sys].[databases] db (NOLOCK) LEFT JOIN (SELECT b.database_name, DATEDIFF(HH, MAX(b.backup_finish_date),GETDATE()) AS LastFullBackup FROM [msdb].[dbo].[backupset] b WHERE b.is_copy_only=0 AND b.type='D' GROUP BY b.database_name) fb ON fb.database_name=db.name LEFT JOIN (SELECT b.database_name, DATEDIFF(HH, MAX(b.backup_finish_date), GETDATE()) AS LastTLBackup FROM [msdb].[dbo].[backupset] b WHERE b.is_copy_only=0 AND b.type='L' GROUP BY b.database_name HAVING MAX(b.backup_finish_date)>=(SELECT MAX(f.backup_finish_date) FROM [msdb].[dbo].[backupset] f WHERE f.is_copy_only=0 AND f.type IN ('D','I') AND f.database_name=b.database_name GROUP BY f.database_name )) tl ON fb.database_name=tl.database_name WHERE db.name=@TargetName;" + } + } + ], + "TempDBFiles": [ { "type": "SQL", "target": { "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT COUNT(name) AS [XEvent.SPServerDiagnostics] FROM sys.dm_xe_sessions WHERE [name] = 'sp_server_diagnostics session';" + "query": "SELECT COUNT(DISTINCT size) AS filesizeCount FROM tempdb.sys.database_files WHERE [type] = 0" } } ], - "DeprecatedFeaturesStats": [ + "ServerInstanceConfiguration": [ { "type": "SQL", "target": { "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT [instance_name] AS [DeprecatedFeature] FROM [sys].[dm_os_performance_counters] WHERE ([object_name] LIKE '%Deprecated Features%') AND ([cntr_value] > 0);", - "transform": { - "type": "aggregate", - "map": { - "DeprecatedFeature": "join" - } - } + "query": "SELECT ( SELECT COUNT(cpu_id) FROM sys.dm_os_schedulers WHERE is_online = 1 AND scheduler_id < 255 AND parent_node_id < 64 ) AS online_logical_processors, ( SELECT COUNT(DISTINCT parent_node_id) FROM sys.dm_os_schedulers WHERE scheduler_id < 255 AND parent_node_id < 64 ) AS numa_nodes, ( SELECT COUNT(*) FROM ( SELECT COUNT(cpu_id) CpuNodeCnt FROM sys.dm_os_schedulers WHERE is_online = 1 AND scheduler_id < 255 AND parent_node_id < 64 GROUP BY parent_node_id, is_online HAVING COUNT(cpu_id) = 1 ) AS Node_CPU ) AS nodes_single_cpu, ( SELECT COUNT(cpu_id) FROM sys.dm_os_schedulers WHERE scheduler_id < 255 AND parent_node_id < 64 ) AS total_logical_processors" } } ], - "DatabaseConfiguration": [ + "DatabaseMasterFiles": [ { "type": "SQL", "target": { - "type": "Database", - "version": "[11.0,12.0)", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance" + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" }, "implementation": { - "query": "SELECT db.is_auto_create_stats_on, db.is_auto_update_stats_on, 0 AS query_store_state, db.collation_name, (SELECT collation_name FROM master.sys.databases (NOLOCK) WHERE database_id = 1) AS master_collation, db.is_auto_close_on, db.is_auto_shrink_on, db.page_verify_option, db.is_db_chaining_on, NULL AS is_auto_create_stats_incremental_on, db.is_trustworthy_on, db.is_parameterization_forced,db.is_read_only AS IsReadOnly,db.[state] AS DbState FROM [sys].[databases] (NOLOCK) AS db WHERE db.[name]=@TargetName" + "query": "SELECT mf.database_id,dbs.name AS databaseName,[type],physical_name,mf.name AS fileName,size,growth,is_percent_growth FROM [sys].[master_files] AS mf INNER JOIN [sys].databases AS dbs ON mf.database_id=dbs.database_id WHERE mf.database_id=ISNULL(@dbId,mf.database_id) AND [type]=ISNULL(@type,[type])" } }, { "type": "SQL", "target": { "type": "Database", - "version": "[12.0, 13.0)", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance" + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" }, "implementation": { - "query": "SELECT db.is_auto_create_stats_on, db.is_auto_update_stats_on, 0 AS query_store_state, db.collation_name, (SELECT collation_name FROM master.sys.databases (NOLOCK) WHERE database_id = 1) AS master_collation, db.is_auto_close_on, db.is_auto_shrink_on, db.page_verify_option, db.is_db_chaining_on, db.is_auto_create_stats_incremental_on, db.is_trustworthy_on, db.is_parameterization_forced,db.is_read_only AS IsReadOnly,db.[state] AS DbState FROM [sys].[databases] (NOLOCK) AS db WHERE db.[name]=@TargetName" + "query": "SELECT [type],physical_name,mf.name AS fileName,size,growth,is_percent_growth FROM [sys].[master_files] AS mf INNER JOIN [sys].databases AS dbs ON mf.database_id=dbs.database_id WHERE dbs.name=@TargetName AND [type]=ISNULL(@type,[type]) AND is_percent_growth=ISNULL(@is_percent_growth,is_percent_growth)" + } + } + ], + "InstantFileInitialization": [ + { + "type": "SQL", + "target": { + "type": "Server", + "version": "[13.0.4001,)", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises" + }, + "implementation": { + "query": "SELECT instant_file_initialization_enabled FROM [sys].[dm_server_services] WHERE servicename LIKE 'SQL Server%' AND servicename NOT LIKE 'SQL Server Agent%' AND servicename NOT LIKE 'SQL Server Launchpad%'" } }, + { + "type": "SQL", + "target": { + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "ManagedInstance", + "version": "[11.0,)" + }, + "implementation": { + "query": "SELECT 'N' AS instant_file_initialization_enabled" + } + } + ], + "IndexesDefinitions": [ { "type": "SQL", "target": { "type": "Database", - "version": "[13.0,)", - "platform": ["Windows", "Linux"], + "version": "[11.0,)", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { "useDatabase": true, - "query": "SELECT db.is_auto_create_stats_on, db.is_auto_update_stats_on, (SELECT CAST(actual_state AS DECIMAL) FROM [sys].[database_query_store_options]) AS query_store_state, db.collation_name, (SELECT collation_name FROM master.sys.databases (NOLOCK) WHERE database_id = 1) AS master_collation, db.is_auto_close_on, db.is_auto_shrink_on, db.page_verify_option, db.is_db_chaining_on, db.is_auto_create_stats_incremental_on, db.is_trustworthy_on, db.is_parameterization_forced,db.is_read_only AS IsReadOnly,db.[state] AS DbState FROM [sys].[databases] (NOLOCK) AS db WHERE db.[name]=@TargetName" + "query": "SELECT i.object_id,QUOTENAME(t.name)+'.'+QUOTENAME(st.name) AS TableName,QUOTENAME(i.name) AS IndexName,QUOTENAME(ac.Name) AS ColumnName,ic.is_included_column,i.is_primary_key,i.filter_definition,i.is_unique,ic.key_ordinal,sty.name AS ColTypeName,CASE sty.name WHEN 'nvarchar' THEN ac.max_length/2 ELSE ac.max_length END AS ColTypeSize,i.fill_factor,i.is_disabled,i.type AS IndexType,index_stat.Hits,index_stat.Reads_Ratio,index_stat.last_user_update FROM [sys].[tables] AS st INNER JOIN [sys].[schemas] AS t ON t.[schema_id]=st.[schema_id] INNER JOIN [sys].[indexes] AS i ON st.[object_id]=i.[object_id] INNER JOIN [sys].[index_columns] AS ic ON i.[object_id]=ic.[object_id] AND i.[index_id]=ic.[index_id] INNER JOIN [sys].[all_columns] AS ac ON st.[object_id]=ac.[object_id] AND ic.[column_id]=ac.[column_id] INNER JOIN [sys].[types] AS sty ON ac.user_type_id=sty.user_type_id LEFT JOIN(SELECT s.object_id,s.index_id,(stat.user_seeks+stat.user_scans+stat.user_lookups) AS [Hits],RTRIM(CONVERT(NVARCHAR(10),CAST(CASE WHEN (stat.user_seeks+stat.user_scans+stat.user_lookups) = 0 THEN 0 ELSE CONVERT(REAL,(stat.user_seeks+stat.user_scans+stat.user_lookups)) * 100/CASE (stat.user_seeks+stat.user_scans+stat.user_lookups+stat.user_updates) WHEN 0 THEN 1 ELSE CONVERT(REAL,(stat.user_seeks+stat.user_scans+stat.user_lookups+stat.user_updates)) END END AS DECIMAL(18,2)))) AS [Reads_Ratio],MAX(stat.last_user_update) AS last_user_update FROM sys.indexes s INNER JOIN sys.dm_db_index_usage_stats stat on stat.object_id = s.object_id and stat.index_id = s.index_id WHERE s.type IN (2,6) AND s.is_primary_key=0 AND s.is_unique_constraint=0 GROUP BY s.object_id,s.index_id,stat.user_seeks,stat.user_scans,stat.user_lookups,stat.user_updates ) index_stat ON index_stat.object_id = i.object_id AND index_stat.index_id = i.index_id WHERE i.type IN (1,2,5,6) AND st.is_ms_shipped=0 AND i.is_unique_constraint=0", + "transform": { + "type": "indexDefinition" + } } } ], - "FKNoIndexes": [ + "UserObjectsCountInMasterDB": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", + "name": "master", "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT QUOTENAME(fk.parent_schema_name)+ '.' + QUOTENAME(fk.parent_table_name) + '.' + QUOTENAME(fk.constraint_name) AS ConstraintName FROM ( SELECT t.name AS [parent_schema_name], OBJECT_NAME(FKC.parent_object_id) [parent_table_name], OBJECT_NAME(constraint_object_id) AS [constraint_name], SUBSTRING((SELECT ',' + RTRIM(COL_NAME(k.parent_object_id,parent_column_id)) AS [data()] FROM sys.foreign_key_columns k (NOLOCK) INNER JOIN sys.foreign_keys (NOLOCK) ON k.constraint_object_id = [object_id] AND k.constraint_object_id = FKC.constraint_object_id ORDER BY constraint_column_id FOR XML PATH('')), 2, 8000) AS [parent_columns] FROM sys.foreign_key_columns FKC (NOLOCK) INNER JOIN sys.objects o (NOLOCK) ON FKC.parent_object_id = o.[object_id] INNER JOIN sys.tables mst (NOLOCK) ON mst.[object_id] = o.[object_id] INNER JOIN sys.schemas t (NOLOCK) ON t.[schema_id] = mst.[schema_id] INNER JOIN sys.objects so (NOLOCK) ON FKC.referenced_object_id = so.[object_id] WHERE o.type = 'U' AND so.type = 'U' GROUP BY o.[schema_id],so.[schema_id],FKC.parent_object_id,constraint_object_id,referenced_object_id,t.name ) fk WHERE NOT EXISTS (SELECT 1 FROM ( SELECT t.name AS schemaName, OBJECT_NAME(mst.[object_id]) AS objectName, SUBSTRING(( SELECT ',' + RTRIM(ac.name) FROM sys.tables AS st INNER JOIN sys.indexes AS mi ON st.[object_id] = mi.[object_id] INNER JOIN sys.index_columns AS ic ON mi.[object_id] = ic.[object_id] AND mi.[index_id] = ic.[index_id] INNER JOIN sys.all_columns AS ac ON st.[object_id] = ac.[object_id] AND ic.[column_id] = ac.[column_id] WHERE i.[object_id] = mi.[object_id] AND i.index_id = mi.index_id AND ic.is_included_column = 0 ORDER BY ac.column_id FOR XML PATH('')), 2, 8000) AS KeyCols FROM sys.indexes AS i INNER JOIN sys.tables AS mst ON mst.[object_id] = i.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id] = mst.[schema_id] WHERE i.[type] IN (1,2,5,6) AND i.is_unique_constraint = 0 AND mst.is_ms_shipped = 0 ) ict WHERE fk.parent_schema_name = ict.schemaName AND fk.parent_table_name = ict.objectName AND REPLACE(fk.parent_columns,' ,',',') = ict.KeyCols);", + "query": "SELECT sao.name AS [Object_Name] FROM master.sys.all_objects sao INNER JOIN master.sys.schemas ss ON sao.[schema_id] = ss.[schema_id] WHERE sao.is_ms_shipped = 0 AND sao.[type] IN ('AF','FN','P','IF','PC','TF','TR','T','V') ORDER BY sao.name, sao.type_desc;", "transform": { "type": "aggregate", "map": { - "ConstraintName": "join" + "Object_Name": "join" } } } } ], - "Hints.InstanceStatistics": [ + "Autogrow1GB": [ { "type": "SQL", "target": { - "type": "Server", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", - "version": "[11.0,)" + "type": "Database", + "version": "[13.0.4001,)", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance" }, "implementation": { - "query": "SELECT COUNT([counter]) AS [HintUsageCount] FROM [sys].[dm_exec_query_optimizer_info] WHERE ([counter] = 'order hint' OR [counter] = 'join hint') AND occurrence > 1;" + "query": "DECLARE @ifi bit IF ( SELECT instant_file_initialization_enabled FROM sys.dm_server_services WHERE servicename LIKE 'SQL Server%' AND servicename NOT LIKE 'SQL Server Agent%' AND servicename NOT LIKE 'SQL Server Launchpad%' ) = 'Y' SET @ifi = 1; ELSE SET @ifi = 0; SELECT mf.[name] AS FileName FROM [sys].[master_files] AS mf (NOLOCK) INNER JOIN [sys].[databases] as dbs (NOLOCK) ON mf.database_id = dbs.database_id WHERE [type] >= CASE WHEN @ifi = 1 THEN 1 ELSE 0 END AND [type] < 2 AND ((is_percent_growth = 1 AND ((CONVERT(bigint,size)*8)*growth)/100 > 1048576) OR (is_percent_growth = 0 AND growth*8 > 1048576)) AND dbs.name = @TargetName", + "transform": { + "type": "aggregate", + "map": { + "FileName": "join" + } + } } } ], - "Hints.ModuleUsage": [ + "CpuIdle": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT ss.name AS [Schema_Name], so.name AS [Object_Name], so.type_desc, CASE WHEN sm.[definition] LIKE '%FORCE ORDER%' THEN '[FORCE ORDER Hint]' WHEN sm.[definition] LIKE '%MERGE JOIN%' OR sm.[definition] LIKE '%LOOP JOIN%' OR sm.[definition] LIKE '%HASH JOIN%' THEN '[JOIN Hint]' END AS Hint FROM [sys].[sql_modules] AS sm INNER JOIN [sys].[objects] AS so ON sm.[object_id] = so.[object_id] INNER JOIN [sys].[schemas] AS ss ON so.[schema_id] = ss.[schema_id] WHERE (sm.[definition] LIKE '%FORCE ORDER%' OR sm.[definition] LIKE '%MERGE JOIN%' OR sm.[definition] LIKE '%LOOP JOIN%' OR sm.[definition] LIKE '%HASH JOIN%') AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped') = 0;" + "query": "DECLARE @ts_now bigint; SELECT @ts_now=ms_ticks FROM sys.dm_os_sys_info (NOLOCK); SELECT ISNULL(MIN(SystemIdle),100) AS MinIdle FROM (SELECT AVG(SystemIdle) AS SystemIdle FROM (SELECT record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle, [TIMESTAMP] FROM (SELECT [TIMESTAMP], CONVERT(xml, record) AS record FROM sys.dm_os_ring_buffers (NOLOCK) WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE '%%' AND @ts_now-[TIMESTAMP]<=7200000) AS xrb) AS si GROUP BY (@ts_now-[TIMESTAMP])/600000) AS avg;" } } ], - "CachedPlans.SingleUseRatio": [ + "ReplicationErrors": [ { "type": "SQL", "target": { "type": "Server", - "platform": ["Windows", "Linux"], + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "DECLARE @Size1 AS REAL, @Size2 AS REAL; SET @Size1=COALESCE((SELECT SUM(CAST(size_in_bytes AS bigint)) AS Size1 FROM [sys].[dm_exec_cached_plans] (NOLOCK) WHERE cacheobjtype LIKE '%Plan%' AND usecounts = 1),0);SET @Size2=COALESCE((SELECT SUM(CAST(size_in_bytes AS bigint)) AS Size2 FROM [sys].[dm_exec_cached_plans] (NOLOCK) WHERE cacheobjtype LIKE '%Plan%' AND usecounts > 1),0);SELECT @Size1/(@Size1+@Size2) AS [SingleUsePlansUseRatio];" + "query": "IF EXISTS(SELECT * FROM [sys].[databases] WHERE is_distributor = 1) BEGIN DECLARE @dbName sysname, @sqlcmd NVARCHAR(max), @dbId int = 0 DECLARE @resultTbl TABLE(publication sysname) WHILE EXISTS(SELECT * FROM [sys].[databases] WHERE is_distributor = 1 AND database_id > @dbId) BEGIN SELECT TOP(1) @dbId = database_id, @dbName = [name] FROM [sys].[databases] WHERE is_distributor = 1 AND database_id > @dbId ORDER BY database_id; SET @sqlcmd = N'SELECT ''['+@dbName+'].'' + msa.publication FROM ['+@dbName+'].[dbo].[MSdistribution_history] AS msh INNER JOIN ['+@dbName+'].[dbo].[MSrepl_errors] AS mse ON mse.id = msh.error_id INNER JOIN ['+@dbName+'].[dbo].[MSdistribution_agents] AS msa ON msh.agent_id = msa.id WHERE mse.time >= DATEADD(hh, -24, GETDATE()) GROUP BY msa.publication' INSERT INTO @resultTbl EXECUTE sp_executesql @sqlcmd END SELECT * FROM @resultTbl END;", + "transform": { + "type": "aggregate", + "map": { + "publication": "join" + } + } } } ], - "Hypothetical.Indexes": [ + "SysAlerts": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT QUOTENAME(t.name) AS [Schema], QUOTENAME(o.[name]) AS [Object], i.name AS [IndexName] FROM [sys].[indexes] i INNER JOIN [sys].[objects] AS o ON o.[object_id] = i.[object_id] INNER JOIN [sys].[tables] AS mst ON mst.[object_id] = i.[object_id] INNER JOIN [sys].[schemas] AS t ON t.[schema_id] = mst.[schema_id] WHERE i.is_hypothetical = 1;" + "query": "SELECT DISTINCT severity, message_id FROM [msdb].[dbo].[sysalerts]", + "transform": { + "type": "aggregate", + "map": { + "severity": "array", + "message_id": "array" + } + } } } ], - "Hypothetical.Statistics": [ + "WeakPassword": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT QUOTENAME(t.name) AS [Schema], QUOTENAME(o.[name]) AS [Object], s.name AS [StatName] FROM [sys].[stats] s INNER JOIN [sys].[objects] AS o (NOLOCK) ON o.[object_id] = s.[object_id] INNER JOIN [sys].[tables] AS mst (NOLOCK) ON mst.[object_id] = s.[object_id] INNER JOIN [sys].[schemas] AS t (NOLOCK) ON t.[schema_id] = mst.[schema_id] WHERE (s.name LIKE 'hind_%' OR s.name LIKE '_dta_stat%') AND auto_created = 0 AND s.name NOT IN (SELECT name FROM sys.indexes);" + "query": "DECLARE @word TABLE (word NVARCHAR(50)); INSERT INTO @word values ('0'),('012'),('0123'),('01234'),('012345'),('0123456'),('01234567'),('012345678'),('0123456789'),('01234567890'),('11111'),('111111'),('1111111'),('11111111'),('21'),('321'),('4321'),('54321'),('654321'),('7654321'),('87654321'),('987654321'),('0987654321'),('pwd'),('Password'),('password'),('P@ssw0rd'),('p@ssw0rd'),('Teste'),('teste'),('Test'),('test'),(''),('p@wd'),('Qwerty'),('qwerty'),('Password1'),('password1'); SELECT DISTINCT RTRIM(s.name) AS [PasswordData] FROM @word d INNER JOIN master.sys.sql_logins s ON PWDCOMPARE(d.word, s.[password_hash]) = 1", + "transform": { + "type": "aggregate", + "map": { + "PasswordData": "join" + } + } } } ], - "SQLServerVersion": [ + "VLF": [ { - "type": "CLR", - "name": "SQLServerVersion", + "type": "SQL", + "target": { + "type": "Database", + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" + }, "implementation": { - "class": "Microsoft.SqlServer.Management.Assessment.Probes.ServerVersionProbe" + "query": "DBCC LOGINFO (@TargetName) WITH NO_INFOMSGS" } } ], - "MissedIndexes": [ + "BadNamingSP": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { "useDatabase": true, - "query": "SELECT RIGHT(i.[statement],LEN(i.[statement])-(LEN(m.[name])+3)) AS [Table], CASE WHEN (i.equality_columns IS NOT NULL AND i.inequality_columns IS NULL) THEN i.equality_columns WHEN (i.equality_columns IS NULL AND i.inequality_columns IS NOT NULL) THEN i.inequality_columns ELSE i.equality_columns+','+i.inequality_columns END AS [KeyCols], ISNULL(i.included_columns,'') AS [IncludedCols],(CONVERT(NUMERIC(19,3),s.user_seeks)+CONVERT(NUMERIC(19,3),s.user_scans))*CONVERT(NUMERIC(19,3),s.avg_total_user_cost)*CONVERT(NUMERIC(19,3),s.avg_user_impact) AS [Score] FROM [sys].[dm_db_missing_index_details] i INNER JOIN [master].[sys].[databases] m ON i.database_id=m.database_id INNER JOIN [sys].[dm_db_missing_index_groups] g ON i.index_handle=g.index_handle INNER JOIN [sys].[dm_db_missing_index_group_stats] s ON s.group_handle=g.index_group_handle WHERE m.[name]=@TargetName" + "query": "SELECT s.[name]+'.'+so.[name] AS ObjectName FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] = 'P' AND so.[name] LIKE 'sp[_]%' AND so.[name] NOT IN ('sp_alterdiagram','sp_creatediagram','sp_dropdiagram','sp_helpdiagramdefinition','sp_helpdiagrams','sp_renamediagram','sp_upgraddiagrams');", + "transform": { + "type": "aggregate", + "map": { + "ObjectName": "join" + } + } } } ], - "DatabaseBackups": [ + "BadNamingSpecialChars": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises", + "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT db.recovery_model, db.recovery_model_desc, fb.LastFullBackup, tl.LastTLBackup FROM [master].[sys].[databases] db (NOLOCK) LEFT JOIN (SELECT b.database_name, DATEDIFF(HH, MAX(b.backup_finish_date),GETDATE()) AS LastFullBackup FROM [msdb].[dbo].[backupset] b WHERE b.is_copy_only=0 AND b.type='D' GROUP BY b.database_name) fb ON fb.database_name=db.name LEFT JOIN (SELECT b.database_name, DATEDIFF(HH, MAX(b.backup_finish_date), GETDATE()) AS LastTLBackup FROM [msdb].[dbo].[backupset] b WHERE b.is_copy_only=0 AND b.type='L' GROUP BY b.database_name HAVING MAX(b.backup_finish_date)>=(SELECT MAX(f.backup_finish_date) FROM [msdb].[dbo].[backupset] f WHERE f.is_copy_only=0 AND f.type IN ('D','I') AND f.database_name=b.database_name GROUP BY f.database_name )) tl ON fb.database_name=tl.database_name WHERE db.name=@TargetName;" + "useDatabase": true, + "query": "SELECT s.[name] +'.'+so.[name] as ObjectName FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S' AND (so.[name] LIKE '% %' OR so.[name] LIKE '%[[]%' OR so.[name] LIKE '%]%' OR so.[name] LIKE '%-%' OR so.[name] LIKE '%.%' OR so.[name] LIKE '%,%' OR so.[name] LIKE '%;%' OR so.[name] LIKE '%' + CHAR(34) + '%' OR so.[name] LIKE '%' + CHAR(39) + '%');", + "transform": { + "type": "aggregate", + "map": { + "ObjectName": "join" + } + } } } ], - "TempDBFiles": [ + "BadNamingSpecialCharsColumns": [ { "type": "SQL", "target": { - "type": "Server", - "platform": ["Windows", "Linux"], + "type": "Database", "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT COUNT(DISTINCT size) AS filesizeCount FROM tempdb.sys.database_files WHERE [type] = 0" + "useDatabase": true, + "query": "SELECT s.name +'.'+ so.name + '.'+sc.name AS ObjectName FROM sys.columns sc INNER JOIN sys.objects so ON sc.object_id = so.object_id INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND (sc.[name] LIKE '% %' OR sc.[name] LIKE '%[[]%' OR sc.[name] LIKE '%]%' OR sc.[name] LIKE '%-%' OR sc.[name] LIKE '%.%' OR sc.[name] LIKE '%,%' OR sc.[name] LIKE '%;%' OR sc.[name] LIKE '%' + CHAR(34) + '%' OR sc.[name] LIKE '%' + CHAR(39) + '%') ORDER BY 1;", + "transform": { + "type": "aggregate", + "map": { + "ObjectName": "join" + } + } } } ], - "ServerInstanceConfiguration": [ + "BadNamingUserFunctions": [ { "type": "SQL", "target": { - "type": "Server", - "platform": ["Windows", "Linux"], + "type": "Database", "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT (SELECT COUNT(cpu_id) FROM sys.dm_os_schedulers WHERE is_online=1 AND scheduler_id<255 AND parent_node_id<64) AS online_logical_processors,(SELECT COUNT(DISTINCT parent_node_id) FROM sys.dm_os_schedulers WHERE scheduler_id<255 AND parent_node_id<64) AS numa_nodes,(SELECT COUNT(*) FROM (SELECT COUNT(cpu_id) CpuNodeCnt from sys.dm_os_schedulers WHERE is_online=1 AND scheduler_id<255 AND parent_node_id<64 GROUP BY parent_node_id,is_online HAVING COUNT(cpu_id)=1)AS Node_CPU) AS nodes_single_cpu,(SELECT COUNT(cpu_id) FROM sys.dm_os_schedulers WHERE scheduler_id<255 AND parent_node_id<64) AS total_logical_processors,(SELECT [value] FROM sys.configurations (NOLOCK) WHERE name='max degree of parallelism') AS MaxDOP" + "useDatabase": true, + "query": "SELECT s.name+'.'+so.name AS ObjectName FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] IN ('FN','FS','TF','IF') AND so.[name] LIKE 'fn[_]%' AND so.[name] NOT IN ('fn_diagram_objects')", + "transform": { + "type": "aggregate", + "map": { + "ObjectName": "join" + } + } } } ], - "DatabaseMasterFiles": [ + "BadNamingKeywords": [ { "type": "SQL", "target": { - "type": "Server", - "platform": ["Windows", "Linux"], + "type": "Database", "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT mf.database_id,dbs.name AS databaseName,[type],physical_name,mf.name AS fileName,size,growth,is_percent_growth FROM [sys].[master_files] AS mf INNER JOIN [sys].databases AS dbs ON mf.database_id=dbs.database_id WHERE mf.database_id=ISNULL(@dbId,mf.database_id) AND [type]=ISNULL(@type,[type])" + "useDatabase": true, + "query": [ + "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('ABSOLUTE'),('ACTION'),('ADA'),('ADD'),('ADMIN'),('AFTER'),('AGGREGATE'),('ALIAS'),('ALL'),('ALLOCATE'),('ALTER'),('AND'),('ANY'),('ARE'),('ARRAY'),('AS'),('ASC'),('ASSERTION'),('AT'),('AUTHORIZATION'),('AVG'),('BACKUP'),('BEFORE'),('BEGIN'),('BETWEEN'),('BINARY'),('BIT'),('BIT_LENGTH'),('BLOB'),('BOOLEAN'),('BOTH'),('BREADTH'),('BREAK'),('BROWSE'),('BULK'),('BY'),('CALL'),('CASCADE'),('CASCADED'),('CASE'),('CAST'),('CATALOG'),('CHAR'),('CHAR_LENGTH'),('CHARACTER'),('CHARACTER_LENGTH'),('CHECK'),('CHECKPOINT'),('CLASS'),('CLOB'),('CLOSE'),('CLUSTERED'),('COALESCE'),('COLLATE'),('COLLATION'),('COLUMN'),('COMMIT'),('COMPLETION'),('COMPUTE'),('CONNECT'),('CONNECTION'),('CONSTRAINT'),('CONSTRAINTS'),('CONSTRUCTOR'),('CONTAINS'),('CONTAINSTABLE'),('CONTINUE'),('CONVERT'),('CORRESPONDING'),('COUNT'),('CREATE'),('CROSS'),('CUBE'),('CURRENT'),('CURRENT_DATE'),('CURRENT_PATH'),('CURRENT_ROLE'),('CURRENT_TIME'),('CURRENT_TIMESTAMP'),('CURRENT_USER'),('CURSOR'),('CYCLE'),('DATA'),('DATABASE'),('DATE'),('DAY'),('DBCC'),('DEALLOCATE'),('DEC'),('DECIMAL'),('DECLARE'),('DEFAULT'),('DEFERRABLE'),('DEFERRED'),('DELETE'),('DENY'),('DEPTH'),('DEREF'),('DESC'),('DESCRIBE'),('DESCRIPTOR'),('DESTROY'),('DESTRUCTOR'),('DETERMINISTIC'),('DIAGNOSTICS'),('DICTIONARY'),('DISCONNECT'),('DISK'),('DISTINCT'),('DISTRIBUTED'),('DOMAIN'),('DOUBLE'),('DROP'),('DUMMY'),('DUMP'),('DYNAMIC') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword", + "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('EACH'),('ELSE'),('END'),('END-EXEC'),('EQUALS'),('ERRLVL'),('ESCAPE'),('EVERY'),('EXCEPT'),('EXCEPTION'),('EXEC'),('EXECUTE'),('EXISTS'),('EXIT'),('EXTERNAL'),('EXTRACT'),('FALSE'),('FETCH'),('FILE'),('FILLFACTOR'),('FIRST'),('FLOAT'),('FOR'),('FOREIGN'),('FORTRAN'),('FOUND'),('FREE'),('FREETEXT'),('FREETEXTTABLE'),('FROM'),('FULL'),('FULLTEXTTABLE'),('FUNCTION'),('GENERAL'),('GET'),('GLOBAL'),('GO'),('GOTO'),('GRANT'),('GROUP'),('GROUPING'),('HAVING'),('HOLDLOCK'),('HOST'),('HOUR'),('IDENTITY'),('IDENTITY_INSERT'),('IDENTITYCOL'),('IF'),('IGNORE'),('IMMEDIATE'),('IN'),('INCLUDE'),('INDEX'),('INDICATOR'),('INITIALIZE'),('INITIALLY'),('INNER'),('INOUT'),('INPUT'),('INSENSITIVE'),('INSERT'),('INT'),('INTEGER'),('INTERSECT'),('INTERVAL'),('INTO'),('IS'),('ISOLATION'),('ITERATE'),('JOIN'),('KEY'),('KILL'),('LANGUAGE'),('LARGE'),('LAST'),('LATERAL'),('LEADING'),('LEFT'),('LESS'),('LEVEL'),('LIKE'),('LIMIT'),('LINENO'),('LOAD'),('LOCAL'),('LOCALTIME'),('LOCALTIMESTAMP'),('LOCATOR'),('LOWER'),('MAP'),('MATCH'),('MAX'),('MIN'),('MINUTE'),('MODIFIES'),('MODIFY'),('MODULE'),('MONTH') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword", + "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('NAMES'),('NATIONAL'),('NATURAL'),('NCHAR'),('NCLOB'),('NEW'),('NEXT'),('NO'),('NOCHECK'),('NONCLUSTERED'),('NONE'),('NOT'),('NULL'),('NULLIF'),('NUMERIC'),('OBJECT'),('OCTET_LENGTH'),('OF'),('OFF'),('OFFSETS'),('OLD'),('ON'),('ONLY'),('OPEN'),('OPENDATASOURCE'),('OPENQUERY'),('OPENROWSET'),('OPENXML'),('OPERATION'),('OPTION'),('OR'),('ORDER'),('ORDINALITY'),('OUT'),('OUTER'),('OUTPUT'),('OVER'),('OVERLAPS'),('PAD'),('PARAMETER'),('PARAMETERS'),('PARTIAL'),('PASCAL'),('PATH'),('PERCENT'),('PLAN'),('POSITION'),('POSTFIX'),('PRECISION'),('PREFIX'),('PREORDER'),('PREPARE'),('PRESERVE'),('PRIMARY'),('PRINT'),('PRIOR'),('PRIVILEGES'),('PROC'),('PROCEDURE'),('PUBLIC'),('RAISERROR'),('READ'),('READS'),('READTEXT'),('REAL'),('RECONFIGURE'),('RECURSIVE'),('REF'),('REFERENCES'),('REFERENCING'),('RELATIVE'),('REPLICATION'),('RESTORE'),('RESTRICT'),('RESULT'),('RETURN'),('RETURNS'),('REVOKE'),('RIGHT'),('ROLE'),('ROLLBACK'),('ROLLUP'),('ROUTINE'),('ROW'),('ROWCOUNT'),('ROWGUIDCOL'),('ROWS'),('RULE') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword", + "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('SAVE'),('SAVEPOINT'),('SCHEMA'),('SCOPE'),('SCROLL'),('SEARCH'),('SECOND'),('SECTION'),('SELECT'),('SEQUENCE'),('SESSION'),('SESSION_USER'),('SET'),('SETS'),('SETUSER'),('SHUTDOWN'),('SIZE'),('SMALLINT'),('SOME'),('SPACE'),('SPECIFIC'),('SPECIFICTYPE'),('SQL'),('SQLCA'),('SQLCODE'),('SQLERROR'),('SQLEXCEPTION'),('SQLSTATE'),('SQLWARNING'),('START'),('STATE'),('STATEMENT'),('STATIC'),('STATISTICS'),('STRUCTURE'),('SUBSTRING'),('SUM'),('SYSTEM_USER'),('TABLE'),('TEMPORARY'),('TERMINATE'),('TEXTSIZE'),('THAN'),('THEN'),('TIME'),('TIMESTAMP'),('TIMEZONE_HOUR'),('TIMEZONE_MINUTE'),('TO'),('TOP'),('TRAILING'),('TRAN'),('TRANSACTION'),('TRANSLATE'),('TRANSLATION'),('TREAT'),('TRIGGER'),('TRIM'),('TRUE'),('TRUNCATE'),('UNDER'),('UNION'),('UNIQUE'),('UNKNOWN'),('UNNEST'),('UPDATE'),('UPDATETEXT'),('UPPER'),('USAGE'),('USE'),('USER'),('USING'),('VALUE'),('VALUES'),('VARCHAR'),('VARIABLE'),('VARYING'),('VIEW'),('WAITFOR'),('WHEN'),('WHENEVER'),('WHERE'),('WHILE'),('WITH'),('WITHOUT'),('WORK'),('WRITE'),('WRITETEXT'),('YEAR'),('ZONE') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword" + ], + "transform": { + "type": "aggregate", + "map": { + "ObjectName": "join" + } + } } - }, + } + ], + "DeprecatedFeaturesSQLModules": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT [type],physical_name,mf.name AS fileName,size,growth,is_percent_growth FROM [sys].[master_files] AS mf INNER JOIN [sys].databases AS dbs ON mf.database_id=dbs.database_id WHERE dbs.name=@TargetName AND [type]=ISNULL(@type,[type]) AND is_percent_growth=ISNULL(@is_percent_growth,is_percent_growth)" + "useDatabase": true, + "query": [ + "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('disk init',NULL,9),('disk resize',NULL,9),('for load',NULL,9),('dbcc dbrepair',NULL,9),('dbcc newalloc',NULL,9),('dbcc pintable',NULL,9),('dbcc unpintable',NULL,9),('dbcc rowlock',NULL,9),('dbcc textall',NULL,9),('dbcc textalloc',NULL,9),('*=',NULL,9),('=*',NULL,9),('setuser',9,NULL),('sp_helpdevice',9,NULL),('sp_addtype',9,NULL),('sp_attach_db',9,NULL),('sp_attach_single_file_db',9,NULL),('sp_bindefault',9,NULL),('sp_unbindefault',9,NULL),('sp_bindrule',9,NULL),('sp_unbindrule',9,NULL),('create default',9,NULL),('drop default',9,NULL),('create rule',9,NULL),('drop rule',9,NULL),('sp_renamedb',9,NULL),('sp_resetstatus',9,NULL),('dbcc dbreindex',9,NULL),('dbcc indexdefrag',9,NULL),('dbcc showcontig',9,NULL),('sp_addextendedproc',9,NULL),('sp_dropextendedproc',9,NULL),('sp_helpextendedproc',9,NULL),('xp_loginconfig',1,NULL),('sp_fulltext_catalog',9,NULL),('sp_fulltext_table',9,NULL),('sp_fulltext_column',9,NULL),('sp_fulltext_database',9,NULL),('sp_help_fulltext_tables',9,NULL),('sp_help_fulltext_columns',9,NULL),('sp_help_fulltext_catalogs',9,NULL),('sp_help_fulltext_tables_cursor',9,NULL),('sp_help_fulltext_columns_cursor',9,NULL) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", + "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_help_fulltext_catalogs_cursor',9,NULL),('fn_get_sql',9,NULL),('sp_indexoption',9,NULL),('sp_lock',9,NULL),('indexkey_property',9,NULL),('file_id',9,NULL),('sp_certify_removable',9,NULL),('sp_create_removable',9,NULL),('sp_dbremove',9,NULL),('sp_addapprole',9,NULL),('sp_dropapprole',9,NULL),('sp_addlogin',9,NULL),('sp_droplogin',9,NULL),('sp_adduser',9,NULL),('sp_dropuser',9,NULL),('sp_grantdbaccess',9,NULL),('sp_revokedbaccess',9,NULL),('sp_addrole',9,NULL),('sp_droprole',9,NULL),('sp_approlepassword',9,NULL),('sp_password',9,NULL),('sp_changeobjectowner',9,NULL),('sp_defaultdb',9,NULL),('sp_defaultlanguage',9,NULL),('sp_denylogin',9,NULL),('sp_grantlogin',9,NULL),('sp_revokelogin',9,NULL),('user_id',9,NULL),('sp_srvrolepermission',9,NULL),('sp_dbfixedrolepermission',9,NULL),('text',9,NULL),('ntext',9,NULL),('image',9,NULL),('textptr',9,NULL),('textvalid',9,NULL),('sp_addalias',9,10),('no_log',9,10),('truncate_only',9,10),('backup transaction',9,10),('dbcc concurrencyviolation',9,10),('sp_addgroup',9,10),('sp_changegroup',9,10),('sp_dropgroup',9,10),('sp_helpgroup',9,10),('sp_makewebtask',NULL,10),('sp_dropwebtask',NULL,10),('sp_runwebtask',NULL,10),('sp_enumcodepages',NULL,10),('dump',9,10),('load',9,10),('sp_articlesynctranprocs',NULL,10),('sp_diskdefault',NULL,10),('sp_eventlog',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", + "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_getmbcscharlen',NULL,10),('sp_helplog',NULL,10),('sp_helpsql',NULL,10),('sp_ismbcsleadbyte',NULL,10),('sp_lock2',NULL,10),('sp_msget_current_activity',NULL,10),('sp_msset_current_activity',NULL,10),('sp_msobjessearch',NULL,10),('xp_enum_activescriptengines',NULL,10),('xp_eventlog',NULL,10),('xp_getadmingroupname',NULL,10),('xp_getfiledetails',NULL,10),('xp_getlocalsystemaccountname',NULL,10),('xp_isntadmin',NULL,10),('xp_mslocalsystem',NULL,10),('xp_msnt2000',NULL,10),('xp_msplatform',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", + "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('xp_setsecurity',NULL,10),('xp_varbintohexstr',NULL,10),('spt_datatype_info',NULL,10),('spt_datatype_info_ext',NULL,10),('spt_provider_types',NULL,10),('spt_server_info',NULL,10),('spt_values',NULL,10),('sysfulltextnotify ',NULL,10),('syslocks',NULL,10),('sysproperties',NULL,10),('sysprotects_aux',NULL,10),('sysprotects_view',NULL,10),('sysremote_catalogs',NULL,10),('sysremote_column_privileges',NULL,10),('sysremote_columns',NULL,10),('sysremote_foreign_keys',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", + "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sysremote_indexes',NULL,10),('sysremote_primary_keys',NULL,10),('sysremote_provider_types',NULL,10),('sysremote_schemata',NULL,10),('sysremote_statistics',NULL,10),('sysremote_table_privileges',NULL,10),('sysremote_tables',NULL,10),('sysremote_views',NULL,10),('syssegments',NULL,10),('sysxlogins',NULL,10),('sp_droptype',10,NULL),('@@remserver',10,NULL),('remote_proc_transactions',10,NULL),('sp_addumpdevice',10,NULL),('xp_grantlogin',10,NULL),('xp_revokelogin',10,NULL),('grant all',10,NULL),('deny all',10,NULL),('revoke all',10,NULL),('fn_virtualservernodes',10,NULL),('fn_servershareddrives',10,NULL),('writetext',10,NULL),('updatetext',10,NULL),('readtext',10,NULL),('torn_page_detection',10,NULL),('set rowcount',10,NULL),('dbo_only',9,11) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", + "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('mediapassword',9,11 ),('password',9,11 ),('with append',10,11),('sp_dboption',9,11),('databaseproperty',9,11),('fastfirstrow',10,11),('sp_addserver',10,11 ),('sp_dropalias',9,11),('disable_def_cnst_chk',10,11),('sp_activedirectory_obj',NULL,11),('sp_activedirectory_scp',NULL,11),('sp_activedirectory_start',NULL,11),('sys.database_principal_aliases',NULL,11),('compute',10,11),('compute by',10,11),('sp_change_users_login',11,NULL),('sp_depends',11,NULL),('sp_getbindtoken',11,NULL),('sp_bindsession',11,NULL),('fmtonly',11,NULL),('raiserror',11,NULL),('sp_db_increased_partitions',11,NULL),('databasepropertyex(''isfulltextenabled'')',11,NULL),('sp_dbcmptlevel',11,NULL),('set ansi_nulls off',11,NULL),('set ansi_padding off',11,NULL),('set concat_null_yields_null off',11,NULL),('set offsets',11,NULL),('sys.numbered_procedures',12,NULL),('sys.numbered_procedure_parameters',12,NULL),('sys.sql_dependencies',12,NULL),('sp_db_vardecimal_storage_format',12,NULL),('sp_estimated_rowsize_reduction_for_vardecimal',12,NULL),('sp_trace_create',12,NULL),('sp_trace_setevent',12,NULL),('sp_trace_setstatus',12,NULL),('fn_trace_geteventinfo',12,NULL),('fn_trace_getfilterinfo',12,NULL),('fn_trace_gettable',12,NULL),('sys.traces',12,NULL),('sys.trace_events',12,NULL),('sys.trace_event_bindings',12,NULL),('sys.trace_categories',12,NULL),('sys.trace_columns',12,NULL),('sys.trace_subclass_values',12,NULL),('disable_interleaved_execution_tvf',10,15),('disable_batch_mode_memory_grant_feedback',10,15),('disable_batch_mode_adaptive_joins',10,15) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END" + ], + "transform": { + "type": "aggregate", + "group": "ObjectName", + "map": { + "Keyword": "join" + } + } } } ], - "InstantFileInitialization": [ + "DeprecatedFeaturesJobs": [ { "type": "SQL", "target": { "type": "Server", - "version": "[13.0.4001,)", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises" + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" }, "implementation": { - "query": "SELECT instant_file_initialization_enabled FROM [sys].[dm_server_services] WHERE servicename LIKE 'SQL Server%' AND servicename NOT LIKE 'SQL Server Agent%' AND servicename NOT LIKE 'SQL Server Launchpad%'" + "query": [ + "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('disk init',NULL,9),('disk resize',NULL,9),('for load',NULL,9),('dbcc dbrepair',NULL,9),('dbcc newalloc',NULL,9),('dbcc pintable',NULL,9),('dbcc unpintable',NULL,9),('dbcc rowlock',NULL,9),('dbcc textall',NULL,9),('dbcc textalloc',NULL,9),('*=',NULL,9),('=*',NULL,9),('setuser',9,NULL),('sp_helpdevice',9,NULL),('sp_addtype',9,NULL),('sp_attach_db',9,NULL),('sp_attach_single_file_db',9,NULL),('sp_bindefault',9,NULL),('sp_unbindefault',9,NULL),('sp_bindrule',9,NULL),('sp_unbindrule',9,NULL),('create default',9,NULL),('drop default',9,NULL),('create rule',9,NULL),('drop rule',9,NULL),('sp_renamedb',9,NULL),('sp_resetstatus',9,NULL),('dbcc dbreindex',9,NULL),('dbcc indexdefrag',9,NULL),('dbcc showcontig',9,NULL),('sp_addextendedproc',9,NULL),('sp_dropextendedproc',9,NULL),('sp_helpextendedproc',9,NULL),('xp_loginconfig',1,NULL),('sp_fulltext_catalog',9,NULL),('sp_fulltext_table',9,NULL),('sp_fulltext_column',9,NULL),('sp_fulltext_database',9,NULL),('sp_help_fulltext_tables',9,NULL),('sp_help_fulltext_columns',9,NULL),('sp_help_fulltext_catalogs',9,NULL),('sp_help_fulltext_tables_cursor',9,NULL),('sp_help_fulltext_columns_cursor',9,NULL) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", + "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_help_fulltext_catalogs_cursor',9,NULL),('fn_get_sql',9,NULL),('sp_indexoption',9,NULL),('sp_lock',9,NULL),('indexkey_property',9,NULL),('file_id',9,NULL),('sp_certify_removable',9,NULL),('sp_create_removable',9,NULL),('sp_dbremove',9,NULL),('sp_addapprole',9,NULL),('sp_dropapprole',9,NULL),('sp_addlogin',9,NULL),('sp_droplogin',9,NULL),('sp_adduser',9,NULL),('sp_dropuser',9,NULL),('sp_grantdbaccess',9,NULL),('sp_revokedbaccess',9,NULL),('sp_addrole',9,NULL),('sp_droprole',9,NULL),('sp_approlepassword',9,NULL),('sp_password',9,NULL),('sp_changeobjectowner',9,NULL),('sp_defaultdb',9,NULL),('sp_defaultlanguage',9,NULL),('sp_denylogin',9,NULL),('sp_grantlogin',9,NULL),('sp_revokelogin',9,NULL),('user_id',9,NULL),('sp_srvrolepermission',9,NULL),('sp_dbfixedrolepermission',9,NULL),('text',9,NULL),('ntext',9,NULL),('image',9,NULL),('textptr',9,NULL),('textvalid',9,NULL),('sp_addalias',9,10),('no_log',9,10),('truncate_only',9,10),('backup transaction',9,10),('dbcc concurrencyviolation',9,10),('sp_addgroup',9,10),('sp_changegroup',9,10),('sp_dropgroup',9,10),('sp_helpgroup',9,10),('sp_makewebtask',NULL,10),('sp_dropwebtask',NULL,10),('sp_runwebtask',NULL,10),('sp_enumcodepages',NULL,10),('dump',9,10),('load',9,10),('sp_articlesynctranprocs',NULL,10),('sp_diskdefault',NULL,10),('sp_eventlog',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", + "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_getmbcscharlen',NULL,10),('sp_helplog',NULL,10),('sp_helpsql',NULL,10),('sp_ismbcsleadbyte',NULL,10),('sp_lock2',NULL,10),('sp_msget_current_activity',NULL,10),('sp_msset_current_activity',NULL,10),('sp_msobjessearch',NULL,10),('xp_enum_activescriptengines',NULL,10),('xp_eventlog',NULL,10),('xp_getadmingroupname',NULL,10),('xp_getfiledetails',NULL,10),('xp_getlocalsystemaccountname',NULL,10),('xp_isntadmin',NULL,10),('xp_mslocalsystem',NULL,10),('xp_msnt2000',NULL,10),('xp_msplatform',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", + "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('xp_setsecurity',NULL,10),('xp_varbintohexstr',NULL,10),('spt_datatype_info',NULL,10),('spt_datatype_info_ext',NULL,10),('spt_provider_types',NULL,10),('spt_server_info',NULL,10),('spt_values',NULL,10),('sysfulltextnotify ',NULL,10),('syslocks',NULL,10),('sysproperties',NULL,10),('sysprotects_aux',NULL,10),('sysprotects_view',NULL,10),('sysremote_catalogs',NULL,10),('sysremote_column_privileges',NULL,10),('sysremote_columns',NULL,10),('sysremote_foreign_keys',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", + "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sysremote_indexes',NULL,10),('sysremote_primary_keys',NULL,10),('sysremote_provider_types',NULL,10),('sysremote_schemata',NULL,10),('sysremote_statistics',NULL,10),('sysremote_table_privileges',NULL,10),('sysremote_tables',NULL,10),('sysremote_views',NULL,10),('syssegments',NULL,10),('sysxlogins',NULL,10),('sp_droptype',10,NULL),('@@remserver',10,NULL),('remote_proc_transactions',10,NULL),('sp_addumpdevice',10,NULL),('xp_grantlogin',10,NULL),('xp_revokelogin',10,NULL),('grant all',10,NULL),('deny all',10,NULL),('revoke all',10,NULL),('fn_virtualservernodes',10,NULL),('fn_servershareddrives',10,NULL),('writetext',10,NULL),('updatetext',10,NULL),('readtext',10,NULL),('torn_page_detection',10,NULL),('set rowcount',10,NULL),('dbo_only',9,11 ) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", + "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('mediapassword',9,11 ),('password',9,11 ),('with append',10,11),('sp_dboption',9,11),('databaseproperty',9,11),('fastfirstrow',10,11),('sp_addserver',10,11 ),('sp_dropalias',9,11),('disable_def_cnst_chk',10,11),('sp_activedirectory_obj',NULL,11),('sp_activedirectory_scp',NULL,11),('sp_activedirectory_start',NULL,11),('sys.database_principal_aliases',NULL,11),('compute',10,11),('compute by',10,11),('sp_change_users_login',11,NULL),('sp_depends',11,NULL),('sp_getbindtoken',11,NULL),('sp_bindsession',11,NULL),('fmtonly',11,NULL),('raiserror',11,NULL),('sp_db_increased_partitions',11,NULL),('databasepropertyex(''isfulltextenabled'')',11,NULL),('sp_dbcmptlevel',11,NULL),('set ansi_nulls off',11,NULL),('set ansi_padding off',11,NULL),('set concat_null_yields_null off',11,NULL),('set offsets',11,NULL),('sys.numbered_procedures',12,NULL),('sys.numbered_procedure_parameters',12,NULL),('sys.sql_dependencies',12,NULL),('sp_db_vardecimal_storage_format',12,NULL),('sp_estimated_rowsize_reduction_for_vardecimal',12,NULL),('sp_trace_create',12,NULL),('sp_trace_setevent',12,NULL),('sp_trace_setstatus',12,NULL),('fn_trace_geteventinfo',12,NULL),('fn_trace_getfilterinfo',12,NULL),('fn_trace_gettable',12,NULL),('sys.traces',12,NULL),('sys.trace_events',12,NULL),('sys.trace_event_bindings',12,NULL),('sys.trace_categories',12,NULL),('sys.trace_columns',12,NULL),('sys.trace_subclass_values',12,NULL),('sp_addremotelogin',10,14),('sp_dropremotelogin',10,14),('sp_helpremotelogin',10,14),('sp_remoteoption',10,14) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END" + ], + "transform": { + "type": "aggregate", + "group": "ObjectName", + "map": { + "Keyword": "join" + } + } } - }, + } + ], + "AffinityNUMANodeNoAssignedCPUs": [ { "type": "SQL", "target": { "type": "Server", - "platform": ["Windows", "Linux"], - "engineEdition": "ManagedInstance", + "platform": "Windows", "version": "[11.0,)" }, "implementation": { - "query": "SELECT 'N' AS instant_file_initialization_enabled" + "query": "WITH cpuCTE (node, afin) AS (SELECT DISTINCT(parent_node_id), is_online FROM sys.dm_os_schedulers WHERE scheduler_id < 255 AND parent_node_id < 64 GROUP BY parent_node_id, is_online) SELECT COUNT(DISTINCT(node)) AS NodeCnt FROM cpuCTE WHERE afin = 0 AND node NOT IN ( SELECT DISTINCT(node) FROM cpuCTE WHERE afin = 1)" } } ], - "IndexesDefinitions": [ + "IndexesGuidKeyColumns": [ { "type": "SQL", "target": { "type": "Database", - "version": "[11.0,)", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance" + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises, ManagedInstance", + "version": "[11.0,)" }, "implementation": { "useDatabase": true, - "query": "SELECT i.object_id,QUOTENAME(t.name)+'.'+QUOTENAME(st.name) AS TableName,QUOTENAME(i.name) AS IndexName,QUOTENAME(ac.Name) AS ColumnName,ic.is_included_column,i.is_primary_key,i.filter_definition,i.is_unique,ic.key_ordinal,sty.name AS ColTypeName,CASE sty.name WHEN 'nvarchar' THEN ac.max_length/2 ELSE ac.max_length END AS ColTypeSize,i.fill_factor,i.is_disabled,i.type AS IndexType,index_stat.Hits,index_stat.Reads_Ratio,index_stat.last_user_update FROM [sys].[tables] AS st INNER JOIN [sys].[schemas] AS t ON t.[schema_id]=st.[schema_id] INNER JOIN [sys].[indexes] AS i ON st.[object_id]=i.[object_id] INNER JOIN [sys].[index_columns] AS ic ON i.[object_id]=ic.[object_id] AND i.[index_id]=ic.[index_id] INNER JOIN [sys].[all_columns] AS ac ON st.[object_id]=ac.[object_id] AND ic.[column_id]=ac.[column_id] INNER JOIN [sys].[types] AS sty ON ac.user_type_id=sty.user_type_id LEFT JOIN(SELECT s.object_id,s.index_id,(stat.user_seeks+stat.user_scans+stat.user_lookups) AS [Hits],RTRIM(CONVERT(NVARCHAR(10),CAST(CASE WHEN (stat.user_seeks+stat.user_scans+stat.user_lookups) = 0 THEN 0 ELSE CONVERT(REAL,(stat.user_seeks+stat.user_scans+stat.user_lookups)) * 100/CASE (stat.user_seeks+stat.user_scans+stat.user_lookups+stat.user_updates) WHEN 0 THEN 1 ELSE CONVERT(REAL,(stat.user_seeks+stat.user_scans+stat.user_lookups+stat.user_updates)) END END AS DECIMAL(18,2)))) AS [Reads_Ratio],MAX(stat.last_user_update) AS last_user_update FROM sys.indexes s INNER JOIN sys.dm_db_index_usage_stats stat on stat.object_id = s.object_id and stat.index_id = s.index_id WHERE s.type IN (2,6) AND s.is_primary_key=0 AND s.is_unique_constraint=0 GROUP BY s.object_id,s.index_id,stat.user_seeks,stat.user_scans,stat.user_lookups,stat.user_updates ) index_stat ON index_stat.object_id = i.object_id AND index_stat.index_id = i.index_id WHERE i.type IN (1,2,5,6) AND st.is_ms_shipped=0 AND i.is_unique_constraint=0", + "query": "SELECT ss.[name]+'.'+t.[name]+'.'+i.[name] as IndexName FROM [sys].[indexes] AS i INNER JOIN [sys].[tables] AS t ON t.[object_id]=i.[object_id] INNER JOIN [sys].[schemas] ss ON ss.[schema_id]=t.[schema_id] INNER JOIN [sys].[index_columns] AS sic ON sic.[object_id]=t.[object_id] AND sic.index_id=i.index_id INNER JOIN [sys].[columns] AS sc ON sc.[object_id]=t.[object_id] AND sc.column_id=sic.column_id INNER JOIN [sys].[types] AS sty ON sc.user_type_id=sty.user_type_id WHERE sic.is_included_column=0 AND sty.name='uniqueidentifier' and i.type=1 AND i.is_unique_constraint=0 AND t.is_ms_shipped=0 GROUP BY ss.name,t.[name],i.name HAVING COUNT(sty.name)>0", "transform": { - "type": "indexDefinition" + "type": "aggregate", + "map": { + "IndexName": "join" + } } } } ], - "UserObjectsCountInMasterDB": [ + "SuspectPagesValidation": [ { "type": "SQL", "target": { "type": "Database", - "name": "master", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "query": "SELECT sao.name AS [Object_Name] FROM master.sys.all_objects sao INNER JOIN master.sys.schemas ss ON sao.[schema_id] = ss.[schema_id] WHERE sao.is_ms_shipped = 0 AND sao.[type] IN ('AF','FN','P','IF','PC','TF','TR','T','V') ORDER BY sao.name, sao.type_desc;", - "transform": { - "type": "aggregate", - "map": { - "Object_Name": "join" - } - } + "query": "IF (SELECT COUNT(*) FROM msdb.dbo.suspect_pages WHERE (event_type = 1 OR event_type = 2 OR event_type = 3)) > 0 BEGIN SELECT CASE event_type WHEN 1 THEN 'Error 823 or unspecified Error 824' WHEN 2 THEN 'Bad Checksum' WHEN 3 THEN 'Torn Page' ELSE NULL END AS [EventType] FROM msdb.dbo.suspect_pages (NOLOCK) WHERE (event_type = 1 OR event_type = 2 OR event_type = 3) AND DB_NAME(database_id)=(@TargetName) END;" } } ], - "Autogrow1GB": [ + "SparseFilesValidation": [ { "type": "SQL", "target": { "type": "Database", - "version": "[13.0.4001,)", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance" + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0,)" }, "implementation": { - "query": "DECLARE @ifi bit IF ( SELECT instant_file_initialization_enabled FROM sys.dm_server_services WHERE servicename LIKE 'SQL Server%' AND servicename NOT LIKE 'SQL Server Agent%' AND servicename NOT LIKE 'SQL Server Launchpad%' ) = 'Y' SET @ifi = 1; ELSE SET @ifi = 0; SELECT mf.[name] AS FileName FROM [sys].[master_files] AS mf (NOLOCK) INNER JOIN [sys].[databases] as dbs (NOLOCK) ON mf.database_id = dbs.database_id WHERE [type] >= CASE WHEN @ifi = 1 THEN 1 ELSE 0 END AND [type] < 2 AND ((is_percent_growth = 1 AND ((CONVERT(bigint,size)*8)*growth)/100 > 1048576) OR (is_percent_growth = 0 AND growth*8 > 1048576)) AND dbs.name = @TargetName", - "transform": { - "type": "aggregate", - "map": { - "FileName": "join" - } - } + "query": "IF (SELECT COUNT(sd.database_id) FROM sys.databases sd INNER JOIN sys.master_files smf ON sd.database_id = smf.database_id WHERE sd.source_database_id IS NULL AND smf.is_sparse = 1) > 0 BEGIN SELECT 'Database_checks' AS [Category], 'DB_nonSnap_Sparse' AS [Information], DB_NAME(sd.database_id) AS database_name, smf.name AS [SparseFiles], smf.physical_name FROM sys.databases sd INNER JOIN sys.master_files smf ON sd.database_id = smf.database_id WHERE sd.source_database_id IS NULL AND smf.is_sparse = 1 AND DB_NAME(sd.database_id)=@TargetName END;" } } ], - "CpuIdle": [ + "TableIndexes": [ { "type": "SQL", "target": { - "type": "Server", - "platform": ["Windows", "Linux"], + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "DECLARE @ts_now bigint; SELECT @ts_now=ms_ticks FROM sys.dm_os_sys_info (NOLOCK); SELECT ISNULL(MIN(SystemIdle),100) AS MinIdle FROM (SELECT AVG(SystemIdle) AS SystemIdle FROM (SELECT record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS SystemIdle, [TIMESTAMP] FROM (SELECT [TIMESTAMP], CONVERT(xml, record) AS record FROM sys.dm_os_ring_buffers (NOLOCK) WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE '%%' AND @ts_now-[TIMESTAMP]<=7200000) AS xrb) AS si GROUP BY (@ts_now-[TIMESTAMP])/600000) AS avg;" + "useDatabase": true, + "query": "SELECT s.name+'.'+t.name AS TableName, COUNT(si.index_id) AS IndexCount, MIN(si.index_id) AS MinIndexId, MAX(si.index_id) AS MaxIndexId FROM sys.indexes AS si (NOLOCK) INNER JOIN sys.tables AS t (NOLOCK) ON si.[object_id]=t.[object_id] INNER JOIN sys.schemas AS s (NOLOCK) ON s.[schema_id]=t.[schema_id] WHERE si.is_hypothetical=0 GROUP BY s.name,t.name" } } ], - "ReplicationErrors": [ + "TableIndexesPartitioned": [ { "type": "SQL", "target": { - "type": "Server", - "platform": ["Windows", "Linux"], + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "IF EXISTS(SELECT * FROM [sys].[databases] WHERE is_distributor = 1) BEGIN DECLARE @dbName sysname, @sqlcmd NVARCHAR(max), @dbId int = 0 DECLARE @resultTbl TABLE(publication sysname) WHILE EXISTS(SELECT * FROM [sys].[databases] WHERE is_distributor = 1 AND database_id > @dbId) BEGIN SELECT TOP(1) @dbId = database_id, @dbName = [name] FROM [sys].[databases] WHERE is_distributor = 1 AND database_id > @dbId ORDER BY database_id; SET @sqlcmd = N'SELECT ''['+@dbName+'].'' + msa.publication FROM ['+@dbName+'].[dbo].[MSdistribution_history] AS msh INNER JOIN ['+@dbName+'].[dbo].[MSrepl_errors] AS mse ON mse.id = msh.error_id INNER JOIN ['+@dbName+'].[dbo].[MSdistribution_agents] AS msa ON msh.agent_id = msa.id WHERE mse.time >= DATEADD(hh, -24, GETDATE()) GROUP BY msa.publication' INSERT INTO @resultTbl EXECUTE sp_executesql @sqlcmd END SELECT * FROM @resultTbl END;", - "transform": { - "type": "aggregate", - "map": { - "publication": "join" - } - } + "useDatabase": true, + "query": "SELECT DISTINCT s.name+'.'+t.name AS TableName, i.name AS IndexName FROM sys.tables AS t (NOLOCK) INNER JOIN sys.indexes AS i (NOLOCK) ON t.[object_id]=i.[object_id] INNER JOIN sys.data_spaces AS ds (NOLOCK) ON ds.data_space_id=i.data_space_id INNER JOIN sys.schemas AS s (NOLOCK) ON s.[schema_id]=t.[schema_id] WHERE t.[type]='U' AND i.[type] IN (1,2) AND i.is_hypothetical=0 AND t.name IN(SELECT ob.name FROM sys.tables AS ob (NOLOCK) INNER JOIN sys.indexes AS ind (NOLOCK) ON ind.[object_id]=ob.[object_id] INNER JOIN sys.data_spaces AS sds (NOLOCK) ON sds.data_space_id=ind.data_space_id WHERE sds.[type]='PS' GROUP BY ob.name) AND ds.[type]<>'PS'" } } ], - "SysAlerts": [ + "NullPassword": [ { "type": "SQL", "target": { "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "SELECT DISTINCT severity, message_id FROM [msdb].[dbo].[sysalerts]", + "query": "SELECT RTRIM(name) AS [PasswordData] FROM master.sys.sql_logins WHERE [password_hash] IS NULL AND name NOT IN ('MSCRMSqlClrLogin','##MS_SmoExtendedSigningCertificate##','##MS_PolicySigningCertificate##','##MS_SQLResourceSigningCertificate##','##MS_SQLReplicationSigningCertificate##','##MS_SQLAuthenticatorCertificate##','##MS_AgentSigningCertificate##','##MS_SQLEnableSystemAssemblyLoadingUser##')", "transform": { "type": "aggregate", "map": { - "severity": "array", - "message_id": "array" + "PasswordData": "join" } } } } ], - "WeakPassword": [ + "NamePassword": [ { "type": "SQL", "target": { "type": "Server", - "platform": ["Windows", "Linux"], + "platform": [ + "Windows", + "Linux" + ], "engineEdition": "OnPremises, ManagedInstance", "version": "[11.0,)" }, "implementation": { - "query": "DECLARE @word TABLE (word NVARCHAR(50)); INSERT INTO @word values ('0'),('012'),('0123'),('01234'),('012345'),('0123456'),('01234567'),('012345678'),('0123456789'),('01234567890'),('11111'),('111111'),('1111111'),('11111111'),('21'),('321'),('4321'),('54321'),('654321'),('7654321'),('87654321'),('987654321'),('0987654321'),('pwd'),('Password'),('password'),('P@ssw0rd'),('p@ssw0rd'),('Teste'),('teste'),('Test'),('test'),(''),('p@wd'),('Qwerty'),('qwerty'),('Password1'),('password1'); SELECT DISTINCT RTRIM(s.name) AS [PasswordData] FROM @word d INNER JOIN master.sys.sql_logins s ON PWDCOMPARE(d.word, s.[password_hash]) = 1", + "query": "SELECT DISTINCT RTRIM(s.name) AS [PasswordData] FROM master.sys.sql_logins s WHERE PWDCOMPARE(RTRIM(RTRIM(s.name)), s.[password_hash]) = 1", "transform": { "type": "aggregate", "map": { @@ -3932,512 +8164,613 @@ } } ], - "VLF": [ + "SystemHealth": [ { "type": "SQL", "target": { - "type": "Database", - "engineEdition": "OnPremises, ManagedInstance", + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "query": "DBCC LOGINFO (@TargetName) WITH NO_INFOMSGS" + "query": "IF EXISTS (SELECT [object_id] FROM tempdb.sys.objects (NOLOCK) WHERE [object_id]=OBJECT_ID('tempdb.dbo.#SystemHealthSessionData')) DROP TABLE #SystemHealthSessionData; IF NOT EXISTS (SELECT [object_id] FROM tempdb.sys.objects (NOLOCK) WHERE [object_id]=OBJECT_ID('tempdb.dbo.#SystemHealthSessionData')) CREATE TABLE #SystemHealthSessionData (target_data XML); INSERT INTO #SystemHealthSessionData SELECT CAST(xet.target_data AS XML) FROM sys.dm_xe_session_targets xet INNER JOIN sys.dm_xe_sessions xe ON xe.address=xet.event_session_address WHERE xe.name='system_health' IF (SELECT COUNT(*) FROM #SystemHealthSessionData a WHERE CONVERT(VARCHAR(max), target_data) LIKE '%error_reported%')>0 BEGIN ;WITH cteHealthSession (EventXML) AS (SELECT C.query('.') EventXML FROM #SystemHealthSessionData a CROSS APPLY a.target_data.nodes('/RingBufferTarget/event') AS T(C)),cteErrorReported (EventTime, ErrorNumber) AS (SELECT EventXML.value('(/event/@timestamp)[1]','datetime') AS EventTime,EventXML.value('(/event/data[@name=''error_number'']/value)[1]','int') AS ErrorNumber FROM cteHealthSession WHERE EventXML.value('(/event/@name)[1]','VARCHAR(500)')='error_reported') SELECT ErrorNumber AS [Error_Number], DATEDIFF(hour,MAX(EventTime),GETUTCDATE()) AS [Last_Logged_Days_Ago],COUNT(ErrorNumber) AS Error_Count FROM cteErrorReported a INNER JOIN sys.messages b ON a.ErrorNumber=b.message_id WHERE b.language_id=1033 GROUP BY a.ErrorNumber, b.[text] END" } } ], - "BadNamingSP": [ + "CompatibilityLevel": [ { "type": "SQL", "target": { "type": "Database", - "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT s.[name]+'.'+so.[name] AS ObjectName FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] = 'P' AND so.[name] LIKE 'sp[_]%' AND so.[name] NOT IN ('sp_alterdiagram','sp_creatediagram','sp_dropdiagram','sp_helpdiagramdefinition','sp_helpdiagrams','sp_renamediagram','sp_upgraddiagrams');", - "transform": { - "type": "aggregate", - "map": { - "ObjectName": "join" - } - } + "query": "SELECT compatibility_level as [CompatibilityLevel] FROM sys.databases where name=@TargetName" } } ], - "BadNamingSpecialChars": [ + "PendingIORequests": [ { "type": "SQL", "target": { - "type": "Database", - "engineEdition": "OnPremises, ManagedInstance", + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT s.[name] +'.'+so.[name] as ObjectName FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S' AND (so.[name] LIKE '% %' OR so.[name] LIKE '%[[]%' OR so.[name] LIKE '%]%' OR so.[name] LIKE '%-%' OR so.[name] LIKE '%.%' OR so.[name] LIKE '%,%' OR so.[name] LIKE '%;%' OR so.[name] LIKE '%' + CHAR(34) + '%' OR so.[name] LIKE '%' + CHAR(39) + '%');", - "transform": { - "type": "aggregate", - "map": { - "ObjectName": "join" - } - } + "query": "DECLARE @IOCnt INT SET @IOCnt=1 WHILE @IOCnt<5 BEGIN IF EXISTS(SELECT * FROM sys.dm_io_pending_io_requests WHERE io_type=@io_type) BREAK; WAITFOR DELAY '00:00:01' SET @IOCnt=@IOCnt+1 END; IF @IOCnt<5 SELECT 1" } } ], - "BadNamingSpecialCharsColumns": [ + "DBMetaInfo": [ { "type": "SQL", "target": { "type": "Database", - "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT s.name +'.'+ so.name + '.'+sc.name AS ObjectName FROM sys.columns sc INNER JOIN sys.objects so ON sc.object_id = so.object_id INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND (sc.[name] LIKE '% %' OR sc.[name] LIKE '%[[]%' OR sc.[name] LIKE '%]%' OR sc.[name] LIKE '%-%' OR sc.[name] LIKE '%.%' OR sc.[name] LIKE '%,%' OR sc.[name] LIKE '%;%' OR sc.[name] LIKE '%' + CHAR(34) + '%' OR sc.[name] LIKE '%' + CHAR(39) + '%') ORDER BY 1;", + "query": "DBCC DBINFO(@TargetName) WITH TABLERESULTS,NO_INFOMSGS", "transform": { - "type": "aggregate", - "map": { - "ObjectName": "join" - } + "type": "dbInfo" } } } ], - "BadNamingUserFunctions": [ + "StatSamplingRate": [ { "type": "SQL", "target": { "type": "Database", - "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT s.name+'.'+so.name AS ObjectName FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] IN ('FN','FS','TF','IF') AND so.[name] LIKE 'fn[_]%' AND so.[name] NOT IN ('fn_diagram_objects')", - "transform": { - "type": "aggregate", - "map": { - "ObjectName": "join" - } - } + "query": "SELECT CONCAT( sh.[name], '.', o.[name] ) AS FullName, CAST(sp.rows_sampled/(sp.[rows]*1.00) AS DECIMAL(5,2)) AS stat_sampling_rate FROM sys.objects AS o INNER JOIN sys.tables AS mst ON mst.[object_id] = o.[object_id] INNER JOIN sys.stats AS ss ON ss.[object_id] = o.[object_id] INNER JOIN sys.schemas AS sh ON sh.[schema_id] = o.[schema_id] CROSS APPLY sys.dm_db_stats_properties(o.[object_id], ss.[stats_id]) AS sp WHERE sp.[rows] > 0 AND sp.rows_sampled/(sp.[rows]*1.00) < @threshold" } } ], - "BadNamingKeywords": [ + "IndexStatistics": [ { "type": "SQL", "target": { "type": "Database", - "engineEdition": "OnPremises, ManagedInstance", - "version": "[11.0,)" + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0,12.0)" }, "implementation": { "useDatabase": true, - "query": [ - "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('ABSOLUTE'),('ACTION'),('ADA'),('ADD'),('ADMIN'),('AFTER'),('AGGREGATE'),('ALIAS'),('ALL'),('ALLOCATE'),('ALTER'),('AND'),('ANY'),('ARE'),('ARRAY'),('AS'),('ASC'),('ASSERTION'),('AT'),('AUTHORIZATION'),('AVG'),('BACKUP'),('BEFORE'),('BEGIN'),('BETWEEN'),('BINARY'),('BIT'),('BIT_LENGTH'),('BLOB'),('BOOLEAN'),('BOTH'),('BREADTH'),('BREAK'),('BROWSE'),('BULK'),('BY'),('CALL'),('CASCADE'),('CASCADED'),('CASE'),('CAST'),('CATALOG'),('CHAR'),('CHAR_LENGTH'),('CHARACTER'),('CHARACTER_LENGTH'),('CHECK'),('CHECKPOINT'),('CLASS'),('CLOB'),('CLOSE'),('CLUSTERED'),('COALESCE'),('COLLATE'),('COLLATION'),('COLUMN'),('COMMIT'),('COMPLETION'),('COMPUTE'),('CONNECT'),('CONNECTION'),('CONSTRAINT'),('CONSTRAINTS'),('CONSTRUCTOR'),('CONTAINS'),('CONTAINSTABLE'),('CONTINUE'),('CONVERT'),('CORRESPONDING'),('COUNT'),('CREATE'),('CROSS'),('CUBE'),('CURRENT'),('CURRENT_DATE'),('CURRENT_PATH'),('CURRENT_ROLE'),('CURRENT_TIME'),('CURRENT_TIMESTAMP'),('CURRENT_USER'),('CURSOR'),('CYCLE'),('DATA'),('DATABASE'),('DATE'),('DAY'),('DBCC'),('DEALLOCATE'),('DEC'),('DECIMAL'),('DECLARE'),('DEFAULT'),('DEFERRABLE'),('DEFERRED'),('DELETE'),('DENY'),('DEPTH'),('DEREF'),('DESC'),('DESCRIBE'),('DESCRIPTOR'),('DESTROY'),('DESTRUCTOR'),('DETERMINISTIC'),('DIAGNOSTICS'),('DICTIONARY'),('DISCONNECT'),('DISK'),('DISTINCT'),('DISTRIBUTED'),('DOMAIN'),('DOUBLE'),('DROP'),('DUMMY'),('DUMP'),('DYNAMIC') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword", - "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('EACH'),('ELSE'),('END'),('END-EXEC'),('EQUALS'),('ERRLVL'),('ESCAPE'),('EVERY'),('EXCEPT'),('EXCEPTION'),('EXEC'),('EXECUTE'),('EXISTS'),('EXIT'),('EXTERNAL'),('EXTRACT'),('FALSE'),('FETCH'),('FILE'),('FILLFACTOR'),('FIRST'),('FLOAT'),('FOR'),('FOREIGN'),('FORTRAN'),('FOUND'),('FREE'),('FREETEXT'),('FREETEXTTABLE'),('FROM'),('FULL'),('FULLTEXTTABLE'),('FUNCTION'),('GENERAL'),('GET'),('GLOBAL'),('GO'),('GOTO'),('GRANT'),('GROUP'),('GROUPING'),('HAVING'),('HOLDLOCK'),('HOST'),('HOUR'),('IDENTITY'),('IDENTITY_INSERT'),('IDENTITYCOL'),('IF'),('IGNORE'),('IMMEDIATE'),('IN'),('INCLUDE'),('INDEX'),('INDICATOR'),('INITIALIZE'),('INITIALLY'),('INNER'),('INOUT'),('INPUT'),('INSENSITIVE'),('INSERT'),('INT'),('INTEGER'),('INTERSECT'),('INTERVAL'),('INTO'),('IS'),('ISOLATION'),('ITERATE'),('JOIN'),('KEY'),('KILL'),('LANGUAGE'),('LARGE'),('LAST'),('LATERAL'),('LEADING'),('LEFT'),('LESS'),('LEVEL'),('LIKE'),('LIMIT'),('LINENO'),('LOAD'),('LOCAL'),('LOCALTIME'),('LOCALTIMESTAMP'),('LOCATOR'),('LOWER'),('MAP'),('MATCH'),('MAX'),('MIN'),('MINUTE'),('MODIFIES'),('MODIFY'),('MODULE'),('MONTH') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword", - "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('NAMES'),('NATIONAL'),('NATURAL'),('NCHAR'),('NCLOB'),('NEW'),('NEXT'),('NO'),('NOCHECK'),('NONCLUSTERED'),('NONE'),('NOT'),('NULL'),('NULLIF'),('NUMERIC'),('OBJECT'),('OCTET_LENGTH'),('OF'),('OFF'),('OFFSETS'),('OLD'),('ON'),('ONLY'),('OPEN'),('OPENDATASOURCE'),('OPENQUERY'),('OPENROWSET'),('OPENXML'),('OPERATION'),('OPTION'),('OR'),('ORDER'),('ORDINALITY'),('OUT'),('OUTER'),('OUTPUT'),('OVER'),('OVERLAPS'),('PAD'),('PARAMETER'),('PARAMETERS'),('PARTIAL'),('PASCAL'),('PATH'),('PERCENT'),('PLAN'),('POSITION'),('POSTFIX'),('PRECISION'),('PREFIX'),('PREORDER'),('PREPARE'),('PRESERVE'),('PRIMARY'),('PRINT'),('PRIOR'),('PRIVILEGES'),('PROC'),('PROCEDURE'),('PUBLIC'),('RAISERROR'),('READ'),('READS'),('READTEXT'),('REAL'),('RECONFIGURE'),('RECURSIVE'),('REF'),('REFERENCES'),('REFERENCING'),('RELATIVE'),('REPLICATION'),('RESTORE'),('RESTRICT'),('RESULT'),('RETURN'),('RETURNS'),('REVOKE'),('RIGHT'),('ROLE'),('ROLLBACK'),('ROLLUP'),('ROUTINE'),('ROW'),('ROWCOUNT'),('ROWGUIDCOL'),('ROWS'),('RULE') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword", - "DECLARE @KeywordTbl AS TABLE(Keyword VARCHAR(255)) INSERT INTO @KeywordTbl VALUES ('SAVE'),('SAVEPOINT'),('SCHEMA'),('SCOPE'),('SCROLL'),('SEARCH'),('SECOND'),('SECTION'),('SELECT'),('SEQUENCE'),('SESSION'),('SESSION_USER'),('SET'),('SETS'),('SETUSER'),('SHUTDOWN'),('SIZE'),('SMALLINT'),('SOME'),('SPACE'),('SPECIFIC'),('SPECIFICTYPE'),('SQL'),('SQLCA'),('SQLCODE'),('SQLERROR'),('SQLEXCEPTION'),('SQLSTATE'),('SQLWARNING'),('START'),('STATE'),('STATEMENT'),('STATIC'),('STATISTICS'),('STRUCTURE'),('SUBSTRING'),('SUM'),('SYSTEM_USER'),('TABLE'),('TEMPORARY'),('TERMINATE'),('TEXTSIZE'),('THAN'),('THEN'),('TIME'),('TIMESTAMP'),('TIMEZONE_HOUR'),('TIMEZONE_MINUTE'),('TO'),('TOP'),('TRAILING'),('TRAN'),('TRANSACTION'),('TRANSLATE'),('TRANSLATION'),('TREAT'),('TRIGGER'),('TRIM'),('TRUE'),('TRUNCATE'),('UNDER'),('UNION'),('UNIQUE'),('UNKNOWN'),('UNNEST'),('UPDATE'),('UPDATETEXT'),('UPPER'),('USAGE'),('USE'),('USER'),('USING'),('VALUE'),('VALUES'),('VARCHAR'),('VARIABLE'),('VARYING'),('VIEW'),('WAITFOR'),('WHEN'),('WHENEVER'),('WHERE'),('WHILE'),('WITH'),('WITHOUT'),('WORK'),('WRITE'),('WRITETEXT'),('YEAR'),('ZONE') SELECT [schema]+'.'+[ObjName] AS ObjectName FROM ( SELECT s.name [schema],so.name [ObjName],type,type_desc FROM sys.objects so INNER JOIN sys.schemas s ON so.schema_id = s.schema_id WHERE so.is_ms_shipped = 0 AND [type] <> 'S') AS ObjNames CROSS JOIN @KeywordTbl WHERE ObjName like '% '+Keyword+' %' OR ObjName like '% '+Keyword OR ObjName=Keyword" + "query": "SELECT CASE si.type WHEN 0 THEN CONCAT(t.[name],'.',mst.[name],' (HEAP)') ELSE CONCAT(t.[name],'.',mst.[name],'.',si.name) END AS IndexFullName,index_stat.fragmentation,index_stat.page_count,si.type AS IndexType FROM sys.indexes si INNER JOIN sys.partitions sp ON si.[object_id]=sp.[object_id] AND si.index_id=sp.index_id INNER JOIN sys.tables AS mst ON mst.[object_id]=si.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] LEFT JOIN (SELECT ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,SUM(ps.avg_fragmentation_in_percent) AS fragmentation,SUM(ps.page_count) [page_count] FROM sys.dm_db_index_physical_stats(DB_ID(@TargetName),NULL,NULL,NULL,NULL) ps WHERE ps.index_level=0 AND ps.alloc_unit_type_desc='IN_ROW_DATA' GROUP BY ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,ps.record_count,ps.forwarded_record_count) index_stat on index_stat.[object_id]=si.[object_id] AND index_stat.index_id=si.index_id AND index_stat.[partition_number]=sp.partition_number WHERE mst.is_ms_shipped=0 AND si.[type] IN (0,1,2)" + } + }, + { + "type": "SQL", + "target": { + "type": "Database", + "platform": [ + "Windows", + "Linux" ], - "transform": { - "type": "aggregate", - "map": { - "ObjectName": "join" - } - } + "version": "[12.0,)" + }, + "implementation": { + "useDatabase": true, + "query": "SELECT CASE si.type WHEN 0 THEN CONCAT(t.[name],'.',mst.[name],' (HEAP)') ELSE CONCAT(t.[name],'.',mst.[name],'.',si.name) END AS IndexFullName,ISNULL(index_stat.fragmentation,0) AS fragmentation, ISNULL(index_stat.page_count,0) AS page_count,index_stat_ci.fragmentation_CI,index_stat_ci.state,si.type AS IndexType FROM sys.indexes si INNER JOIN sys.partitions sp ON si.[object_id]=sp.[object_id] AND si.index_id=sp.index_id INNER JOIN sys.tables AS mst ON mst.[object_id]=si.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] LEFT JOIN (SELECT ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,SUM(ps.avg_fragmentation_in_percent) AS fragmentation,SUM(ps.page_count) [page_count] FROM sys.dm_db_index_physical_stats(DB_ID(@TargetName),NULL,NULL,NULL,NULL) ps WHERE ps.index_level=0 AND ps.alloc_unit_type_desc='IN_ROW_DATA' GROUP BY ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,ps.record_count,ps.forwarded_record_count) index_stat on index_stat.[object_id]=si.[object_id] AND index_stat.index_id=si.index_id AND index_stat.[partition_number]=sp.partition_number LEFT JOIN (SELECT rg.object_id,rg.index_id,rg.partition_number,SUM((ISNULL(rg.deleted_rows,1)*100)/CASE WHEN rg.total_rows=0 THEN 1 ELSE rg.total_rows END) AS [fragmentation_CI],rg.[state] FROM sys.column_store_row_groups rg GROUP BY rg.object_id,rg.index_id,rg.partition_number,rg.total_rows,rg.delta_store_hobt_id,rg.row_group_id,rg.state) index_stat_ci on index_stat_ci.[object_id]=si.[object_id] AND index_stat_ci.index_id=si.index_id AND index_stat_ci.[partition_number]=sp.[partition_number] WHERE mst.is_ms_shipped=0 AND si.[type] IN (0,1,2,5,6,7)" } } ], - "DeprecatedFeaturesSQLModules": [ + "XTPIndexHashStatistics": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", - "version": "[11.0,)" + "platform": [ + "Windows", + "Linux" + ], + "version": "[12.0,)" }, "implementation": { "useDatabase": true, - "query": [ - "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('disk init',NULL,9),('disk resize',NULL,9),('for load',NULL,9),('dbcc dbrepair',NULL,9),('dbcc newalloc',NULL,9),('dbcc pintable',NULL,9),('dbcc unpintable',NULL,9),('dbcc rowlock',NULL,9),('dbcc textall',NULL,9),('dbcc textalloc',NULL,9),('*=',NULL,9),('=*',NULL,9),('setuser',9,NULL),('sp_helpdevice',9,NULL),('sp_addtype',9,NULL),('sp_attach_db',9,NULL),('sp_attach_single_file_db',9,NULL),('sp_bindefault',9,NULL),('sp_unbindefault',9,NULL),('sp_bindrule',9,NULL),('sp_unbindrule',9,NULL),('create default',9,NULL),('drop default',9,NULL),('create rule',9,NULL),('drop rule',9,NULL),('sp_renamedb',9,NULL),('sp_resetstatus',9,NULL),('dbcc dbreindex',9,NULL),('dbcc indexdefrag',9,NULL),('dbcc showcontig',9,NULL),('sp_addextendedproc',9,NULL),('sp_dropextendedproc',9,NULL),('sp_helpextendedproc',9,NULL),('xp_loginconfig',1,NULL),('sp_fulltext_catalog',9,NULL),('sp_fulltext_table',9,NULL),('sp_fulltext_column',9,NULL),('sp_fulltext_database',9,NULL),('sp_help_fulltext_tables',9,NULL),('sp_help_fulltext_columns',9,NULL),('sp_help_fulltext_catalogs',9,NULL),('sp_help_fulltext_tables_cursor',9,NULL),('sp_help_fulltext_columns_cursor',9,NULL) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", - "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_help_fulltext_catalogs_cursor',9,NULL),('fn_get_sql',9,NULL),('sp_indexoption',9,NULL),('sp_lock',9,NULL),('indexkey_property',9,NULL),('file_id',9,NULL),('sp_certify_removable',9,NULL),('sp_create_removable',9,NULL),('sp_dbremove',9,NULL),('sp_addapprole',9,NULL),('sp_dropapprole',9,NULL),('sp_addlogin',9,NULL),('sp_droplogin',9,NULL),('sp_adduser',9,NULL),('sp_dropuser',9,NULL),('sp_grantdbaccess',9,NULL),('sp_revokedbaccess',9,NULL),('sp_addrole',9,NULL),('sp_droprole',9,NULL),('sp_approlepassword',9,NULL),('sp_password',9,NULL),('sp_changeobjectowner',9,NULL),('sp_defaultdb',9,NULL),('sp_defaultlanguage',9,NULL),('sp_denylogin',9,NULL),('sp_grantlogin',9,NULL),('sp_revokelogin',9,NULL),('user_id',9,NULL),('sp_srvrolepermission',9,NULL),('sp_dbfixedrolepermission',9,NULL),('text',9,NULL),('ntext',9,NULL),('image',9,NULL),('textptr',9,NULL),('textvalid',9,NULL),('sp_addalias',9,10),('no_log',9,10),('truncate_only',9,10),('backup transaction',9,10),('dbcc concurrencyviolation',9,10),('sp_addgroup',9,10),('sp_changegroup',9,10),('sp_dropgroup',9,10),('sp_helpgroup',9,10),('sp_makewebtask',NULL,10),('sp_dropwebtask',NULL,10),('sp_runwebtask',NULL,10),('sp_enumcodepages',NULL,10),('dump',9,10),('load',9,10),('sp_articlesynctranprocs',NULL,10),('sp_diskdefault',NULL,10),('sp_eventlog',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", - "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_getmbcscharlen',NULL,10),('sp_helplog',NULL,10),('sp_helpsql',NULL,10),('sp_ismbcsleadbyte',NULL,10),('sp_lock2',NULL,10),('sp_msget_current_activity',NULL,10),('sp_msset_current_activity',NULL,10),('sp_msobjessearch',NULL,10),('xp_enum_activescriptengines',NULL,10),('xp_eventlog',NULL,10),('xp_getadmingroupname',NULL,10),('xp_getfiledetails',NULL,10),('xp_getlocalsystemaccountname',NULL,10),('xp_isntadmin',NULL,10),('xp_mslocalsystem',NULL,10),('xp_msnt2000',NULL,10),('xp_msplatform',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", - "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('xp_setsecurity',NULL,10),('xp_varbintohexstr',NULL,10),('spt_datatype_info',NULL,10),('spt_datatype_info_ext',NULL,10),('spt_provider_types',NULL,10),('spt_server_info',NULL,10),('spt_values',NULL,10),('sysfulltextnotify ',NULL,10),('syslocks',NULL,10),('sysproperties',NULL,10),('sysprotects_aux',NULL,10),('sysprotects_view',NULL,10),('sysremote_catalogs',NULL,10),('sysremote_column_privileges',NULL,10),('sysremote_columns',NULL,10),('sysremote_foreign_keys',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", - "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sysremote_indexes',NULL,10),('sysremote_primary_keys',NULL,10),('sysremote_provider_types',NULL,10),('sysremote_schemata',NULL,10),('sysremote_statistics',NULL,10),('sysremote_table_privileges',NULL,10),('sysremote_tables',NULL,10),('sysremote_views',NULL,10),('syssegments',NULL,10),('sysxlogins',NULL,10),('sp_droptype',10,NULL),('@@remserver',10,NULL),('remote_proc_transactions',10,NULL),('sp_addumpdevice',10,NULL),('xp_grantlogin',10,NULL),('xp_revokelogin',10,NULL),('grant all',10,NULL),('deny all',10,NULL),('revoke all',10,NULL),('fn_virtualservernodes',10,NULL),('fn_servershareddrives',10,NULL),('writetext',10,NULL),('updatetext',10,NULL),('readtext',10,NULL),('torn_page_detection',10,NULL),('set rowcount',10,NULL),('dbo_only',9,11) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END", - "IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion/0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('mediapassword',9,11 ),('password',9,11 ),('with append',10,11),('sp_dboption',9,11),('databaseproperty',9,11),('fastfirstrow',10,11),('sp_addserver',10,11 ),('sp_dropalias',9,11),('disable_def_cnst_chk',10,11),('sp_activedirectory_obj',NULL,11),('sp_activedirectory_scp',NULL,11),('sp_activedirectory_start',NULL,11),('sys.database_principal_aliases',NULL,11),('compute',10,11),('compute by',10,11),('sp_change_users_login',11,NULL),('sp_depends',11,NULL),('sp_getbindtoken',11,NULL),('sp_bindsession',11,NULL),('fmtonly',11,NULL),('raiserror',11,NULL),('sp_db_increased_partitions',11,NULL),('databasepropertyex(''isfulltextenabled'')',11,NULL),('sp_dbcmptlevel',11,NULL),('set ansi_nulls off',11,NULL),('set ansi_padding off',11,NULL),('set concat_null_yields_null off',11,NULL),('set offsets',11,NULL),('sys.numbered_procedures',12,NULL),('sys.numbered_procedure_parameters',12,NULL),('sys.sql_dependencies',12,NULL),('sp_db_vardecimal_storage_format',12,NULL),('sp_estimated_rowsize_reduction_for_vardecimal',12,NULL),('sp_trace_create',12,NULL),('sp_trace_setevent',12,NULL),('sp_trace_setstatus',12,NULL),('fn_trace_geteventinfo',12,NULL),('fn_trace_getfilterinfo',12,NULL),('fn_trace_gettable',12,NULL),('sys.traces',12,NULL),('sys.trace_events',12,NULL),('sys.trace_event_bindings',12,NULL),('sys.trace_categories',12,NULL),('sys.trace_columns',12,NULL),('sys.trace_subclass_values',12,NULL),('disable_interleaved_execution_tvf',10,15),('disable_batch_mode_memory_grant_feedback',10,15),('disable_batch_mode_adaptive_joins',10,15) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT QUOTENAME(ss.name)+'.'+QUOTENAME(so.name) AS [ObjectName],tk.Keyword FROM sys.sql_modules sm (NOLOCK) INNER JOIN sys.objects so (NOLOCK) ON sm.[object_id]=so.[object_id] INNER JOIN sys.schemas ss (NOLOCK) ON so.[schema_id]=ss.[schema_id] CROSS JOIN @tblKeywords tk WHERE PATINDEX('%' + tk.Keyword + '%',LOWER(sm.[definition]) COLLATE DATABASE_DEFAULT)>1 AND OBJECTPROPERTY(sm.[object_id],'IsMSShipped')=0 END" - ], - "transform": { - "type": "aggregate", - "group": "ObjectName", - "map": { - "Keyword": "join" - } - } + "query": "IF NOT EXISTS(SELECT * FROM sys.filegroups where [type]='FX') RETURN; DECLARE @tmpXIS TABLE([object_id] int,[schema_name] VARCHAR(100) COLLATE database_default,[table_name] VARCHAR(300) COLLATE database_default,[index_id] int,[index_name] VARCHAR(300) COLLATE database_default,total_bucket_count bigint,empty_bucket_count bigint,avg_chain_length bigint,max_chain_length bigint, KeyCols VARCHAR(4000) COLLATE database_default,DistinctCnt bigint NULL,isdone bit) INSERT INTO @tmpXIS SELECT xis.[object_id],t.name,o.name,xis.index_id,si.name,xhis.total_bucket_count,xhis.empty_bucket_count,xhis.avg_chain_length,xhis.max_chain_length,SUBSTRING((SELECT ','+ac.name FROM sys.tables AS st INNER JOIN sys.indexes AS i ON st.[object_id]=i.[object_id] INNER JOIN sys.index_columns AS ic ON i.[object_id]=ic.[object_id] AND i.[index_id]=ic.[index_id] INNER JOIN sys.all_columns AS ac ON st.[object_id]=ac.[object_id] AND ic.[column_id]=ac.[column_id] WHERE si.[object_id]=i.[object_id] AND si.index_id=i.index_id AND ic.is_included_column=0 ORDER BY ic.key_ordinal FOR XML PATH('')),2,8000) AS KeyCols,NULL distinctCntOUT,0 FROM sys.dm_db_xtp_hash_index_stats AS xhis INNER JOIN sys.dm_db_xtp_index_stats AS xis ON xis.[object_id]=xhis.[object_id] AND xis.[index_id]=xhis.[index_id] INNER JOIN sys.indexes AS si (NOLOCK) ON xis.[object_id]=si.[object_id] AND xis.[index_id]=si.[index_id] INNER JOIN sys.objects AS o (NOLOCK) ON si.[object_id]=o.[object_id] INNER JOIN sys.tables AS mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.[type]='U' DECLARE @objectid int,@indexid int,@sqlcmd NVARCHAR(4000),@params NVARCHAR(500),@schema_name VARCHAR(100),@table_name VARCHAR(300),@KeyCols VARCHAR(4000),@distinctCnt bigint IF EXISTS (SELECT TOP 1 [object_id] FROM @tmpXIS WHERE isdone=0) BEGIN WHILE (SELECT COUNT([object_id]) FROM @tmpXIS WHERE isdone=0)>0 BEGIN SELECT TOP 1 @objectid=[object_id],@indexid=[index_id],@schema_name=[schema_name],@table_name=[table_name],@KeyCols=KeyCols FROM @tmpXIS WHERE isdone=0 SELECT @sqlcmd='SELECT @distinctCntOUT=COUNT(*) FROM (SELECT DISTINCT '+@KeyCols+' FROM '+@schema_name+'.'+@table_name+') t1;' EXECUTE sp_executesql @sqlcmd,N'@distinctCntOUT bigint OUTPUT',@distinctCntOUT=@distinctCnt OUTPUT UPDATE @tmpXIS SET DistinctCnt=@distinctCnt,isdone=1 WHERE [object_id]=@objectid AND [index_id]=@indexid; END; END; SELECT CONCAT([schema_name],'.',table_name,'.',index_name) AS IndexFullName,FLOOR((CAST(empty_bucket_count AS FLOAT)/total_bucket_count)*100) EmptyBucketPct,total_bucket_count,avg_chain_length,DistinctCnt FROM @tmpXIS" + } + } + ], + "XTPNonClusteredIndexHashStatistics": [ + { + "type": "SQL", + "target": { + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], + "version": "[12.0,)" + }, + "implementation": { + "useDatabase": true, + "query": "SELECT DISTINCT CONCAT(t.name,'.',o.name,'.',si.name) AS IndexFullName,FLOOR((CAST(page_update_retry_count AS FLOAT)/CASE WHEN page_update_count=0 THEN 1 ELSE page_update_count END)*100) AS page_update_count_pct,FLOOR((CAST(page_consolidation_retry_count AS FLOAT)/CASE WHEN page_consolidation_count=0 THEN 1 ELSE page_consolidation_count END)*100) AS page_consolidation_count_pct,FLOOR((CAST(page_split_retry_count AS FLOAT)/CASE WHEN page_split_count=0 THEN 1 ELSE page_split_count END)*100) AS page_split_count_pct,FLOOR((CAST(key_split_retry_count AS FLOAT)/CASE WHEN key_split_count=0 THEN 1 ELSE key_split_count END)*100) AS key_split_count_pct,FLOOR((CAST(page_merge_retry_count AS FLOAT)/CASE WHEN page_merge_count=0 THEN 1 ELSE page_merge_count END)*100) AS page_merge_count_pct,FLOOR((CAST(key_merge_retry_count AS FLOAT)/CASE WHEN key_merge_count=0 THEN 1 ELSE key_merge_count END)*100) AS key_merge_count_pct FROM sys.dm_db_xtp_nonclustered_index_stats AS xnis (NOLOCK) INNER JOIN sys.dm_db_xtp_index_stats AS xis (NOLOCK) ON xis.[object_id]=xnis.[object_id] AND xis.[index_id]=xnis.[index_id] INNER JOIN sys.indexes AS si (NOLOCK) ON xis.[object_id]=si.[object_id] AND xis.[index_id]=si.[index_id] INNER JOIN sys.objects AS o (NOLOCK) ON si.[object_id]=o.[object_id] INNER JOIN sys.tables AS mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.[type]='U'" } } ], - "DeprecatedFeaturesJobs": [ + "CpuUsage": [ { "type": "SQL", "target": { "type": "Server", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "query": [ - "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('disk init',NULL,9),('disk resize',NULL,9),('for load',NULL,9),('dbcc dbrepair',NULL,9),('dbcc newalloc',NULL,9),('dbcc pintable',NULL,9),('dbcc unpintable',NULL,9),('dbcc rowlock',NULL,9),('dbcc textall',NULL,9),('dbcc textalloc',NULL,9),('*=',NULL,9),('=*',NULL,9),('setuser',9,NULL),('sp_helpdevice',9,NULL),('sp_addtype',9,NULL),('sp_attach_db',9,NULL),('sp_attach_single_file_db',9,NULL),('sp_bindefault',9,NULL),('sp_unbindefault',9,NULL),('sp_bindrule',9,NULL),('sp_unbindrule',9,NULL),('create default',9,NULL),('drop default',9,NULL),('create rule',9,NULL),('drop rule',9,NULL),('sp_renamedb',9,NULL),('sp_resetstatus',9,NULL),('dbcc dbreindex',9,NULL),('dbcc indexdefrag',9,NULL),('dbcc showcontig',9,NULL),('sp_addextendedproc',9,NULL),('sp_dropextendedproc',9,NULL),('sp_helpextendedproc',9,NULL),('xp_loginconfig',1,NULL),('sp_fulltext_catalog',9,NULL),('sp_fulltext_table',9,NULL),('sp_fulltext_column',9,NULL),('sp_fulltext_database',9,NULL),('sp_help_fulltext_tables',9,NULL),('sp_help_fulltext_columns',9,NULL),('sp_help_fulltext_catalogs',9,NULL),('sp_help_fulltext_tables_cursor',9,NULL),('sp_help_fulltext_columns_cursor',9,NULL) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", - "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_help_fulltext_catalogs_cursor',9,NULL),('fn_get_sql',9,NULL),('sp_indexoption',9,NULL),('sp_lock',9,NULL),('indexkey_property',9,NULL),('file_id',9,NULL),('sp_certify_removable',9,NULL),('sp_create_removable',9,NULL),('sp_dbremove',9,NULL),('sp_addapprole',9,NULL),('sp_dropapprole',9,NULL),('sp_addlogin',9,NULL),('sp_droplogin',9,NULL),('sp_adduser',9,NULL),('sp_dropuser',9,NULL),('sp_grantdbaccess',9,NULL),('sp_revokedbaccess',9,NULL),('sp_addrole',9,NULL),('sp_droprole',9,NULL),('sp_approlepassword',9,NULL),('sp_password',9,NULL),('sp_changeobjectowner',9,NULL),('sp_defaultdb',9,NULL),('sp_defaultlanguage',9,NULL),('sp_denylogin',9,NULL),('sp_grantlogin',9,NULL),('sp_revokelogin',9,NULL),('user_id',9,NULL),('sp_srvrolepermission',9,NULL),('sp_dbfixedrolepermission',9,NULL),('text',9,NULL),('ntext',9,NULL),('image',9,NULL),('textptr',9,NULL),('textvalid',9,NULL),('sp_addalias',9,10),('no_log',9,10),('truncate_only',9,10),('backup transaction',9,10),('dbcc concurrencyviolation',9,10),('sp_addgroup',9,10),('sp_changegroup',9,10),('sp_dropgroup',9,10),('sp_helpgroup',9,10),('sp_makewebtask',NULL,10),('sp_dropwebtask',NULL,10),('sp_runwebtask',NULL,10),('sp_enumcodepages',NULL,10),('dump',9,10),('load',9,10),('sp_articlesynctranprocs',NULL,10),('sp_diskdefault',NULL,10),('sp_eventlog',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", - "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sp_getmbcscharlen',NULL,10),('sp_helplog',NULL,10),('sp_helpsql',NULL,10),('sp_ismbcsleadbyte',NULL,10),('sp_lock2',NULL,10),('sp_msget_current_activity',NULL,10),('sp_msset_current_activity',NULL,10),('sp_msobjessearch',NULL,10),('xp_enum_activescriptengines',NULL,10),('xp_eventlog',NULL,10),('xp_getadmingroupname',NULL,10),('xp_getfiledetails',NULL,10),('xp_getlocalsystemaccountname',NULL,10),('xp_isntadmin',NULL,10),('xp_mslocalsystem',NULL,10),('xp_msnt2000',NULL,10),('xp_msplatform',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", - "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('xp_setsecurity',NULL,10),('xp_varbintohexstr',NULL,10),('spt_datatype_info',NULL,10),('spt_datatype_info_ext',NULL,10),('spt_provider_types',NULL,10),('spt_server_info',NULL,10),('spt_values',NULL,10),('sysfulltextnotify ',NULL,10),('syslocks',NULL,10),('sysproperties',NULL,10),('sysprotects_aux',NULL,10),('sysprotects_view',NULL,10),('sysremote_catalogs',NULL,10),('sysremote_column_privileges',NULL,10),('sysremote_columns',NULL,10),('sysremote_foreign_keys',NULL,10) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", - "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('sysremote_indexes',NULL,10),('sysremote_primary_keys',NULL,10),('sysremote_provider_types',NULL,10),('sysremote_schemata',NULL,10),('sysremote_statistics',NULL,10),('sysremote_table_privileges',NULL,10),('sysremote_tables',NULL,10),('sysremote_views',NULL,10),('syssegments',NULL,10),('sysxlogins',NULL,10),('sp_droptype',10,NULL),('@@remserver',10,NULL),('remote_proc_transactions',10,NULL),('sp_addumpdevice',10,NULL),('xp_grantlogin',10,NULL),('xp_revokelogin',10,NULL),('grant all',10,NULL),('deny all',10,NULL),('revoke all',10,NULL),('fn_virtualservernodes',10,NULL),('fn_servershareddrives',10,NULL),('writetext',10,NULL),('updatetext',10,NULL),('readtext',10,NULL),('torn_page_detection',10,NULL),('set rowcount',10,NULL),('dbo_only',9,11 ) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END", - "USE [msdb]; IF (SELECT COUNT(instance_name) FROM sys.dm_os_performance_counters WHERE [object_name] LIKE '%Deprecated Features%' AND cntr_value>0)>0 BEGIN DECLARE @sqlmajorver INT; SELECT @sqlmajorver=CONVERT(int,(@@microsoftversion / 0x1000000) & 0xff); DECLARE @tblKeywords as TABLE (KeywordID int IDENTITY(1,1) PRIMARY KEY, Keyword VARCHAR(64), DeprecatedIn tinyint, DiscontinuedIn tinyint) INSERT INTO @tblKeywords VALUES ('mediapassword',9,11 ),('password',9,11 ),('with append',10,11),('sp_dboption',9,11),('databaseproperty',9,11),('fastfirstrow',10,11),('sp_addserver',10,11 ),('sp_dropalias',9,11),('disable_def_cnst_chk',10,11),('sp_activedirectory_obj',NULL,11),('sp_activedirectory_scp',NULL,11),('sp_activedirectory_start',NULL,11),('sys.database_principal_aliases',NULL,11),('compute',10,11),('compute by',10,11),('sp_change_users_login',11,NULL),('sp_depends',11,NULL),('sp_getbindtoken',11,NULL),('sp_bindsession',11,NULL),('fmtonly',11,NULL),('raiserror',11,NULL),('sp_db_increased_partitions',11,NULL),('databasepropertyex(''isfulltextenabled'')',11,NULL),('sp_dbcmptlevel',11,NULL),('set ansi_nulls off',11,NULL),('set ansi_padding off',11,NULL),('set concat_null_yields_null off',11,NULL),('set offsets',11,NULL),('sys.numbered_procedures',12,NULL),('sys.numbered_procedure_parameters',12,NULL),('sys.sql_dependencies',12,NULL),('sp_db_vardecimal_storage_format',12,NULL),('sp_estimated_rowsize_reduction_for_vardecimal',12,NULL),('sp_trace_create',12,NULL),('sp_trace_setevent',12,NULL),('sp_trace_setstatus',12,NULL),('fn_trace_geteventinfo',12,NULL),('fn_trace_getfilterinfo',12,NULL),('fn_trace_gettable',12,NULL),('sys.traces',12,NULL),('sys.trace_events',12,NULL),('sys.trace_event_bindings',12,NULL),('sys.trace_categories',12,NULL),('sys.trace_columns',12,NULL),('sys.trace_subclass_values',12,NULL),('sp_addremotelogin',10,14),('sp_dropremotelogin',10,14),('sp_helpremotelogin',10,14),('sp_remoteoption',10,14) DELETE FROM @tblKeywords WHERE DeprecatedIn>@sqlmajorver OR DiscontinuedIn>@sqlmajorver SELECT 'Job: '+sj.[name]+' Step: '+sjs.step_name AS ObjectName,Keyword FROM msdb.dbo.sysjobsteps sjs (NOLOCK) INNER JOIN msdb.dbo.sysjobs sj (NOLOCK) ON sjs.job_id=sj.job_id CROSS JOIN @tblKeywords tk WHERE PATINDEX('%'+tk.Keyword+'%',LOWER(sjs.[command]) COLLATE DATABASE_DEFAULT)>1 AND sjs.[subsystem] IN ('TSQL','PowerShell'); END" - ], - "transform": { - "type": "aggregate", - "group": "ObjectName", - "map": { - "Keyword": "join" - } - } + "query": "DECLARE @ts_now bigint;SELECT @ts_now=ms_ticks FROM sys.dm_os_sys_info (NOLOCK);SELECT 100-ISNULL(SystemIdle,0) AS AVGTotalCPUUsage,AVGSQLCPUUsage,100-ISNULL(SystemIdle,0)-AVGSQLCPUUsage AS AVGCPUUsageByOther FROM(SELECT AVG(SystemIdle) AS SystemIdle,AVG(SQLProcessUtilization) AS AVGSQLCPUUsage FROM(SELECT record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]','int') AS SystemIdle,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]','int') AS SQLProcessUtilization,[TIMESTAMP] FROM (SELECT [TIMESTAMP],CONVERT(xml,record) AS record FROM sys.dm_os_ring_buffers (NOLOCK) WHERE ring_buffer_type=N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE '%%' AND @ts_now-[TIMESTAMP]<=7200000) AS xrb ) AS si) AS a" } } ], - "AffinityNUMANodeNoAssignedCPUs": [ + "TF6533SpatialFunctionsUsage": [ { "type": "SQL", "target": { - "type": "Server", - "platform": "Windows", + "type": "Database", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "query": "WITH cpuCTE (node, afin) AS (SELECT DISTINCT(parent_node_id), is_online FROM sys.dm_os_schedulers WHERE scheduler_id < 255 AND parent_node_id < 64 GROUP BY parent_node_id, is_online) SELECT COUNT(DISTINCT(node)) AS NodeCnt FROM cpuCTE WHERE afin = 0 AND node NOT IN ( SELECT DISTINCT(node) FROM cpuCTE WHERE afin = 1)" + "useDatabase": true, + "query": "SELECT DISTINCT 1 AS InUse FROM sys.sql_modules (NOLOCK) WHERE OBJECTPROPERTY([object_id],'IsMSShipped')=0 AND (PATINDEX('%.strelate(%',LOWER([definition]) COLLATE DATABASE_DEFAULT)>1 OR PATINDEX('%.stasbinary(%',LOWER([definition]) COLLATE DATABASE_DEFAULT)>1)", + "transform": { + "type": "noData", + "define": { + "InUse": 0 + } + } } } ], - "IndexesGuidKeyColumns": [ + "FKNotTrusted": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { "useDatabase": true, - "query": "SELECT ss.[name]+'.'+t.[name]+'.'+i.[name] as IndexName FROM [sys].[indexes] AS i INNER JOIN [sys].[tables] AS t ON t.[object_id]=i.[object_id] INNER JOIN [sys].[schemas] ss ON ss.[schema_id]=t.[schema_id] INNER JOIN [sys].[index_columns] AS sic ON sic.[object_id]=t.[object_id] AND sic.index_id=i.index_id INNER JOIN [sys].[columns] AS sc ON sc.[object_id]=t.[object_id] AND sc.column_id=sic.column_id INNER JOIN [sys].[types] AS sty ON sc.user_type_id=sty.user_type_id WHERE sic.is_included_column=0 AND sty.name='uniqueidentifier' and i.type=1 AND i.is_unique_constraint=0 AND t.is_ms_shipped=0 GROUP BY ss.name,t.[name],i.name HAVING COUNT(sty.name)>0", + "query": "SELECT CONCAT(QUOTENAME(t.name),'.',QUOTENAME(mst.name),'.',QUOTENAME(FKC.name)) AS [constraint_name] FROM sys.foreign_keys FKC (NOLOCK) INNER JOIN sys.objects o (NOLOCK) ON FKC.parent_object_id=o.[object_id] INNER JOIN sys.tables mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.type='U' AND FKC.is_not_trusted=1 AND FKC.is_not_for_replication=0 GROUP BY o.[schema_id],mst.[object_id],FKC.name,t.name,mst.name UNION ALL SELECT CONCAT(QUOTENAME(t.name),'.',QUOTENAME(mst.name),'.',QUOTENAME(CC.name)) FROM sys.check_constraints CC (NOLOCK) INNER JOIN sys.objects o (NOLOCK) ON CC.parent_object_id=o.[object_id] INNER JOIN sys.tables mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.type='U' AND CC.is_not_trusted=1 AND CC.is_not_for_replication=0 AND CC.is_disabled=0 GROUP BY t.[schema_id],mst.[object_id],CC.name,t.name,mst.name", "transform": { "type": "aggregate", "map": { - "IndexName": "join" + "constraint_name": "join" } } } } ], - "SuspectPagesValidation": [ + "ObjectStatistics": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[11.0,)" + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0.3000,)" }, "implementation": { - "query": "IF (SELECT COUNT(*) FROM msdb.dbo.suspect_pages WHERE (event_type = 1 OR event_type = 2 OR event_type = 3)) > 0 BEGIN SELECT CASE event_type WHEN 1 THEN 'Error 823 or unspecified Error 824' WHEN 2 THEN 'Bad Checksum' WHEN 3 THEN 'Torn Page' ELSE NULL END AS [EventType] FROM msdb.dbo.suspect_pages (NOLOCK) WHERE (event_type = 1 OR event_type = 2 OR event_type = 3) AND DB_NAME(database_id)=(@TargetName) END;" + "useDatabase": true, + "query": "SELECT DISTINCT CONCAT(t.name,'.',OBJECT_NAME(mst.[object_id])) AS [TableName],ss.name AS [StatName],sp.[rows],sp.modification_counter,sp.rows_sampled FROM sys.objects AS o INNER JOIN sys.tables AS mst ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] INNER JOIN sys.stats AS ss ON ss.[object_id]=mst.[object_id] CROSS APPLY sys.dm_db_stats_properties(ss.[object_id],ss.[stats_id]) AS sp WHERE sp.[rows]>0" } - } - ], - "SparseFilesValidation": [ + }, { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[11.0,)" + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0, 11.0.3000)" }, "implementation": { - "query": "IF (SELECT COUNT(sd.database_id) FROM sys.databases sd INNER JOIN sys.master_files smf ON sd.database_id = smf.database_id WHERE sd.source_database_id IS NULL AND smf.is_sparse = 1) > 0 BEGIN SELECT 'Database_checks' AS [Category], 'DB_nonSnap_Sparse' AS [Information], DB_NAME(sd.database_id) AS database_name, smf.name AS [SparseFiles], smf.physical_name FROM sys.databases sd INNER JOIN sys.master_files smf ON sd.database_id = smf.database_id WHERE sd.source_database_id IS NULL AND smf.is_sparse = 1 AND DB_NAME(sd.database_id)=@TargetName END;" + "useDatabase": true, + "query": "SELECT DISTINCT CONCAT(t.name,'.',OBJECT_NAME(mst.[object_id])) AS [TableName],ss.name AS [StatName],SUM(p.[rows]) AS [rows],si.rowmodctr AS modification_counter,0 AS rows_sampled AS FROM sys.sysindexes AS si INNER JOIN sys.objects AS o ON si.id=o.[object_id] INNER JOIN sys.tables AS mst ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] INNER JOIN sys.stats AS ss ON ss.[object_id]=o.[object_id] INNER JOIN sys.partitions AS p ON p.[object_id]=ss.[object_id] LEFT JOIN sys.indexes i ON si.id=i.[object_id] AND si.indid=i.index_id WHERE o.type<>'S' AND i.name IS NOT NULL GROUP BY mst.[object_id],t.name,rowmodctr,ss.name HAVING SUM(p.[rows])>0" } } ], - "TableIndexes": [ + "FullTextServiceInfo": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT s.name+'.'+t.name AS TableName, COUNT(si.index_id) AS IndexCount, MIN(si.index_id) AS MinIndexId, MAX(si.index_id) AS MaxIndexId FROM sys.indexes AS si (NOLOCK) INNER JOIN sys.tables AS t (NOLOCK) ON si.[object_id]=t.[object_id] INNER JOIN sys.schemas AS s (NOLOCK) ON s.[schema_id]=t.[schema_id] WHERE si.is_hypothetical=0 GROUP BY s.name,t.name" + "query": "SELECT ISNULL(FULLTEXTSERVICEPROPERTY('IsFulltextInstalled'), 0) AS [IsFulltextInstalled] ,FULLTEXTSERVICEPROPERTY('VerifySignature') AS [VerifySignature] ,FULLTEXTSERVICEPROPERTY('LoadOSResources') AS [LoadOSResources];" } } ], - "TableIndexesPartitioned": [ + "IsClusteredServer": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", + "type": "Server", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { "useDatabase": true, - "query": "SELECT DISTINCT s.name+'.'+t.name AS TableName, i.name AS IndexName FROM sys.tables AS t (NOLOCK) INNER JOIN sys.indexes AS i (NOLOCK) ON t.[object_id]=i.[object_id] INNER JOIN sys.data_spaces AS ds (NOLOCK) ON ds.data_space_id=i.data_space_id INNER JOIN sys.schemas AS s (NOLOCK) ON s.[schema_id]=t.[schema_id] WHERE t.[type]='U' AND i.[type] IN (1,2) AND i.is_hypothetical=0 AND t.name IN(SELECT ob.name FROM sys.tables AS ob (NOLOCK) INNER JOIN sys.indexes AS ind (NOLOCK) ON ind.[object_id]=ob.[object_id] INNER JOIN sys.data_spaces AS sds (NOLOCK) ON sds.data_space_id=ind.data_space_id WHERE sds.[type]='PS' GROUP BY ob.name) AND ds.[type]<>'PS'" + "query": "SELECT SERVERPROPERTY('IsClustered') AS is_clustered_server" } } ], - "NullPassword": [ + "MisalignedDiskPartition": [ { - "type": "SQL", + "type": "WMI", "target": { "type": "Server", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", + "platform": "Windows", + "engineEdition": "OnPremises", "version": "[11.0,)" }, "implementation": { - "query": "SELECT RTRIM(name) AS [PasswordData] FROM master.sys.sql_logins WHERE [password_hash] IS NULL AND name NOT IN ('MSCRMSqlClrLogin','##MS_SmoExtendedSigningCertificate##','##MS_PolicySigningCertificate##','##MS_SQLResourceSigningCertificate##','##MS_SQLReplicationSigningCertificate##','##MS_SQLAuthenticatorCertificate##','##MS_AgentSigningCertificate##','##MS_SQLEnableSystemAssemblyLoadingUser##')", - "transform": { - "type": "aggregate", - "map": { - "PasswordData": "join" - } - } + "query": "SELECT Name, StartingOffset FROM Win32_DiskPartition WHERE StartingOffset < $threshold" } } ], - "NamePassword": [ + "NtfsBlockSize": [ { - "type": "SQL", + "type": "WMI", "target": { "type": "Server", - "platform": ["Windows", "Linux"], - "engineEdition": "OnPremises, ManagedInstance", + "platform": "Windows", + "engineEdition": "OnPremises", "version": "[11.0,)" }, "implementation": { - "query": "SELECT DISTINCT RTRIM(s.name) AS [PasswordData] FROM master.sys.sql_logins s WHERE PWDCOMPARE(RTRIM(RTRIM(s.name)), s.[password_hash]) = 1", - "transform": { - "type": "aggregate", - "map": { - "PasswordData": "join" - } - } + "query": "SELECT name, blocksize FROM Win32_Volume WHERE Capacity <> NULL" } } ], - "SystemHealth": [ + "OsSysMemory": [ { "type": "SQL", "target": { "type": "Server", - "platform": ["Windows", "Linux"], + "engineEdition": "OnPremises", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "query": "IF EXISTS (SELECT [object_id] FROM tempdb.sys.objects (NOLOCK) WHERE [object_id]=OBJECT_ID('tempdb.dbo.#SystemHealthSessionData')) DROP TABLE #SystemHealthSessionData; IF NOT EXISTS (SELECT [object_id] FROM tempdb.sys.objects (NOLOCK) WHERE [object_id]=OBJECT_ID('tempdb.dbo.#SystemHealthSessionData')) CREATE TABLE #SystemHealthSessionData (target_data XML); INSERT INTO #SystemHealthSessionData SELECT CAST(xet.target_data AS XML) FROM sys.dm_xe_session_targets xet INNER JOIN sys.dm_xe_sessions xe ON xe.address=xet.event_session_address WHERE xe.name='system_health' IF (SELECT COUNT(*) FROM #SystemHealthSessionData a WHERE CONVERT(VARCHAR(max), target_data) LIKE '%error_reported%')>0 BEGIN ;WITH cteHealthSession (EventXML) AS (SELECT C.query('.') EventXML FROM #SystemHealthSessionData a CROSS APPLY a.target_data.nodes('/RingBufferTarget/event') AS T(C)),cteErrorReported (EventTime, ErrorNumber) AS (SELECT EventXML.value('(/event/@timestamp)[1]','datetime') AS EventTime,EventXML.value('(/event/data[@name=''error_number'']/value)[1]','int') AS ErrorNumber FROM cteHealthSession WHERE EventXML.value('(/event/@name)[1]','VARCHAR(500)')='error_reported') SELECT ErrorNumber AS [Error_Number], DATEDIFF(hour,MAX(EventTime),GETUTCDATE()) AS [Last_Logged_Days_Ago],COUNT(ErrorNumber) AS Error_Count FROM cteErrorReported a INNER JOIN sys.messages b ON a.ErrorNumber=b.message_id WHERE b.language_id=1033 GROUP BY a.ErrorNumber, b.[text] END" + "useDatabase": true, + "query": "SELECT * FROM sys.dm_os_sys_memory(NOLOCK)" } } ], - "CompatibilityLevel": [ + "PageFileManagement": [ { - "type": "SQL", + "type": "Registry", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", + "engineEdition": "OnPremises", + "platform": "Windows", "version": "[11.0,)" }, "implementation": { - "query": "SELECT compatibility_level as [CompatibilityLevel] FROM sys.databases where name=@TargetName" + "query": { + "HKEY_LOCAL_MACHINE": { + "System\\CurrentControlSet\\Control\\Session Manager\\Memory Management": [ + "PagingFiles" + ] + } + } } } ], - "PendingIORequests": [ + "PowerPlan": [ { - "type": "SQL", + "type": "Registry", "target": { "type": "Server", - "platform": ["Windows", "Linux"], + "platform": "Windows", + "engineEdition": "OnPremises", "version": "[11.0,)" }, "implementation": { - "query": "DECLARE @IOCnt INT SET @IOCnt=1 WHILE @IOCnt<5 BEGIN IF EXISTS(SELECT * FROM sys.dm_io_pending_io_requests WHERE io_type=@io_type) BREAK; WAITFOR DELAY '00:00:01' SET @IOCnt=@IOCnt+1 END; IF @IOCnt<5 SELECT 1" + "query": { + "HKEY_LOCAL_MACHINE": { + "SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings": [ + "ActivePowerScheme" + ], + "SYSTEM\\CurrentControlSet\\Control\\Power\\User\\PowerSchemes": [ + "ActivePowerScheme" + ] + } + } } } ], - "DBMetaInfo": [ + "ProcessBlockingChains": [ { "type": "SQL", "target": { "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[11.0,)" + "version": "[11.0,)", + "platform": [ + "Windows", + "Linux" + ], + "engineEdition": "OnPremises" }, "implementation": { - "query": "DBCC DBINFO(@TargetName) WITH TABLERESULTS,NO_INFOMSGS", - "transform": { - "type": "dbInfo" - } + "useDatabase": true, + "query": "SELECT es.[session_id] AS [blocked_spid], es.[status] AS [blocked_spid_status], ot.task_state AS [blocked_task_status], COALESCE ( owt.wait_duration_ms, ABS(CONVERT(BIGINT,(DATEDIFF(ms, es.last_request_start_time, GETDATE())))) ) / 60000 AS [block_time_min] FROM sys.dm_exec_sessions es LEFT OUTER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id LEFT OUTER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id LEFT OUTER JOIN sys.dm_os_waiting_tasks wt ON es.session_id = wt.session_id LEFT OUTER JOIN sys.dm_os_tasks ot ON er.session_id = ot.session_id AND er.request_id = ot.request_id LEFT OUTER JOIN ( SELECT waiting_task_address, wait_duration_ms, ROW_NUMBER() OVER (PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC) AS row_num FROM sys.dm_os_waiting_tasks WHERE wait_type <> 'SP_SERVER_DIAGNOSTICS_SLEEP' ) owt ON ot.task_address = owt.waiting_task_address AND owt.row_num = 1 OUTER APPLY sys.dm_exec_sql_text(COALESCE(er.sql_handle, ec.most_recent_sql_handle)) AS query WHERE CONVERT(VARCHAR(max), query.text) not like '%sp_server_diagnostics%' AND (es.session_id <> @@SPID AND es.is_user_process = 1) AND (es.session_id IN (SELECT er3.blocking_session_id FROM sys.dm_exec_requests er3) OR er.blocking_session_id IS NOT NULL) AND ((owt.wait_duration_ms/1000) > @waitThreshold OR (er.total_elapsed_time/1000) > @waitThreshold OR er.total_elapsed_time IS NULL) AND er.database_id = DB_ID(@TargetName)" } } ], - "StatSamplingRate": [ + "ReplicationInfo": [ { - "type": "SQL", + "type": "Registry", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", + "engineEdition": "OnPremises", + "platform": "Windows", "version": "[11.0,)" }, "implementation": { - "query": "SELECT CONCAT( sh.[name], '.', o.[name] ) AS FullName, CAST(sp.rows_sampled/(sp.[rows]*1.00) AS DECIMAL(5,2)) AS stat_sampling_rate FROM sys.objects AS o INNER JOIN sys.tables AS mst ON mst.[object_id] = o.[object_id] INNER JOIN sys.stats AS ss ON ss.[object_id] = o.[object_id] INNER JOIN sys.schemas AS sh ON sh.[schema_id] = o.[schema_id] CROSS APPLY sys.dm_db_stats_properties(o.[object_id], ss.[stats_id]) AS sp WHERE sp.[rows] > 0 AND sp.rows_sampled/(sp.[rows]*1.00) < @threshold" + "instance": true, + "query": { + "HKEY_LOCAL_MACHINE": { + "SOFTWARE\\Microsoft\\MSSQLServer\\Replication": [ + "IsInstalled" + ] + } + } } } ], - "IndexStatistics": [ + "ServerBIOSInfo": [ { - "type": "SQL", + "type": "Registry", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[11.0,12.0)" + "type": "Server", + "engineEdition": "OnPremises", + "platform": "Windows", + "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT CASE si.type WHEN 0 THEN CONCAT(t.[name],'.',mst.[name],' (HEAP)') ELSE CONCAT(t.[name],'.',mst.[name],'.',si.name) END AS IndexFullName,index_stat.fragmentation,index_stat.page_count,si.type AS IndexType FROM sys.indexes si INNER JOIN sys.partitions sp ON si.[object_id]=sp.[object_id] AND si.index_id=sp.index_id INNER JOIN sys.tables AS mst ON mst.[object_id]=si.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] LEFT JOIN (SELECT ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,SUM(ps.avg_fragmentation_in_percent) AS fragmentation,SUM(ps.page_count) [page_count] FROM sys.dm_db_index_physical_stats(DB_ID(@TargetName),NULL,NULL,NULL,NULL) ps WHERE ps.index_level=0 AND ps.alloc_unit_type_desc='IN_ROW_DATA' GROUP BY ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,ps.record_count,ps.forwarded_record_count) index_stat on index_stat.[object_id]=si.[object_id] AND index_stat.index_id=si.index_id AND index_stat.[partition_number]=sp.partition_number WHERE mst.is_ms_shipped=0 AND si.[type] IN (0,1,2)" + "query": { + "HKEY_LOCAL_MACHINE": { + "HARDWARE\\DESCRIPTION\\System\\BIOS": [ + "BIOSVendor" + ] + } + } } - }, + } + ], + "ServerCPUInfo": [ { - "type": "SQL", + "type": "Registry", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[12.0,)" + "type": "Server", + "engineEdition": "OnPremises", + "platform": "Windows", + "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT CASE si.type WHEN 0 THEN CONCAT(t.[name],'.',mst.[name],' (HEAP)') ELSE CONCAT(t.[name],'.',mst.[name],'.',si.name) END AS IndexFullName,ISNULL(index_stat.fragmentation,0) AS fragmentation, ISNULL(index_stat.page_count,0) AS page_count,index_stat_ci.fragmentation_CI,index_stat_ci.state,si.type AS IndexType FROM sys.indexes si INNER JOIN sys.partitions sp ON si.[object_id]=sp.[object_id] AND si.index_id=sp.index_id INNER JOIN sys.tables AS mst ON mst.[object_id]=si.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] LEFT JOIN (SELECT ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,SUM(ps.avg_fragmentation_in_percent) AS fragmentation,SUM(ps.page_count) [page_count] FROM sys.dm_db_index_physical_stats(DB_ID(@TargetName),NULL,NULL,NULL,NULL) ps WHERE ps.index_level=0 AND ps.alloc_unit_type_desc='IN_ROW_DATA' GROUP BY ps.database_id,ps.[object_id],ps.index_id,ps.partition_number,ps.record_count,ps.forwarded_record_count) index_stat on index_stat.[object_id]=si.[object_id] AND index_stat.index_id=si.index_id AND index_stat.[partition_number]=sp.partition_number LEFT JOIN (SELECT rg.object_id,rg.index_id,rg.partition_number,SUM((ISNULL(rg.deleted_rows,1)*100)/CASE WHEN rg.total_rows=0 THEN 1 ELSE rg.total_rows END) AS [fragmentation_CI],rg.[state] FROM sys.column_store_row_groups rg GROUP BY rg.object_id,rg.index_id,rg.partition_number,rg.total_rows,rg.delta_store_hobt_id,rg.row_group_id,rg.state) index_stat_ci on index_stat_ci.[object_id]=si.[object_id] AND index_stat_ci.index_id=si.index_id AND index_stat_ci.[partition_number]=sp.[partition_number] WHERE mst.is_ms_shipped=0 AND si.[type] IN (0,1,2,5,6,7)" + "query": { + "HKEY_LOCAL_MACHINE": { + "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\*": [ + "ProcessorNameString" + ] + } + }, + "transform": { + "type": "rename", + "map": { + "CPUid": "RegistryKeyName" + } + } } } ], - - "XTPIndexHashStatistics": [ + "SysConfiguration": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[12.0,)" + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0,)" }, "implementation": { "useDatabase": true, - "query": "IF NOT EXISTS(SELECT * FROM sys.filegroups where [type]='FX') RETURN; DECLARE @tmpXIS TABLE([object_id] int,[schema_name] VARCHAR(100) COLLATE database_default,[table_name] VARCHAR(300) COLLATE database_default,[index_id] int,[index_name] VARCHAR(300) COLLATE database_default,total_bucket_count bigint,empty_bucket_count bigint,avg_chain_length bigint,max_chain_length bigint, KeyCols VARCHAR(4000) COLLATE database_default,DistinctCnt bigint NULL,isdone bit) INSERT INTO @tmpXIS SELECT xis.[object_id],t.name,o.name,xis.index_id,si.name,xhis.total_bucket_count,xhis.empty_bucket_count,xhis.avg_chain_length,xhis.max_chain_length,SUBSTRING((SELECT ','+ac.name FROM sys.tables AS st INNER JOIN sys.indexes AS i ON st.[object_id]=i.[object_id] INNER JOIN sys.index_columns AS ic ON i.[object_id]=ic.[object_id] AND i.[index_id]=ic.[index_id] INNER JOIN sys.all_columns AS ac ON st.[object_id]=ac.[object_id] AND ic.[column_id]=ac.[column_id] WHERE si.[object_id]=i.[object_id] AND si.index_id=i.index_id AND ic.is_included_column=0 ORDER BY ic.key_ordinal FOR XML PATH('')),2,8000) AS KeyCols,NULL distinctCntOUT,0 FROM sys.dm_db_xtp_hash_index_stats AS xhis INNER JOIN sys.dm_db_xtp_index_stats AS xis ON xis.[object_id]=xhis.[object_id] AND xis.[index_id]=xhis.[index_id] INNER JOIN sys.indexes AS si (NOLOCK) ON xis.[object_id]=si.[object_id] AND xis.[index_id]=si.[index_id] INNER JOIN sys.objects AS o (NOLOCK) ON si.[object_id]=o.[object_id] INNER JOIN sys.tables AS mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.[type]='U' DECLARE @objectid int,@indexid int,@sqlcmd NVARCHAR(4000),@params NVARCHAR(500),@schema_name VARCHAR(100),@table_name VARCHAR(300),@KeyCols VARCHAR(4000),@distinctCnt bigint IF EXISTS (SELECT TOP 1 [object_id] FROM @tmpXIS WHERE isdone=0) BEGIN WHILE (SELECT COUNT([object_id]) FROM @tmpXIS WHERE isdone=0)>0 BEGIN SELECT TOP 1 @objectid=[object_id],@indexid=[index_id],@schema_name=[schema_name],@table_name=[table_name],@KeyCols=KeyCols FROM @tmpXIS WHERE isdone=0 SELECT @sqlcmd='SELECT @distinctCntOUT=COUNT(*) FROM (SELECT DISTINCT '+@KeyCols+' FROM '+@schema_name+'.'+@table_name+') t1;' EXECUTE sp_executesql @sqlcmd,N'@distinctCntOUT bigint OUTPUT',@distinctCntOUT=@distinctCnt OUTPUT UPDATE @tmpXIS SET DistinctCnt=@distinctCnt,isdone=1 WHERE [object_id]=@objectid AND [index_id]=@indexid; END; END; SELECT CONCAT([schema_name],'.',table_name,'.',index_name) AS IndexFullName,FLOOR((CAST(empty_bucket_count AS FLOAT)/total_bucket_count)*100) EmptyBucketPct,total_bucket_count,avg_chain_length,DistinctCnt FROM @tmpXIS" + "query": "SELECT [name], [value] FROM sys.configurations", + "transform": { + "type": "nameValuePairs", + "keyColumn": "name", + "valueColumn": "value", + "map": { + "allow updates": "allow_updates", + "Ad Hoc Distributed Queries": "ad_hoc_distributed_queries", + "affinity mask": "affinity_mask", + "affinity I/O mask": "affinity_io_mask", + "affinity64 mask": "affinity64_mask", + "affinity64 I/O mask": "affinity64_io_mask", + "automatic soft-NUMA disabled": "automatic_soft_NUMA_disabled", + "backup compression default": "backup_compression", + "blocked process threshold (s)": "block_threshold", + "clr enabled": "clr_enabled", + "cost threshold for parallelism": "cost_threshold_for_parallelism", + "cross db ownership chaining": "cross_db_ownership_chaining", + "default trace enabled": "default_trace_enabled", + "index create memory (KB)": "index_create_memory", + "lightweight pooling": "lightweight_pooling", + "locks": "locks", + "max worker threads": "max_worker_threads", + "max degree of parallelism": "max_dop", + "min memory per query (KB)": "min_memory_per_query", + "network packet size (B)": "network_packet_size", + "Ole Automation Procedures": "ole_automation_procedures", + "optimize for ad hoc workloads": "optimize_for_ad_hoc_workloads", + "priority boost": "priority_boost", + "query wait (s)": "query_wait", + "recovery interval (min)": "recovery_interval", + "remote admin connections": "remote_admin_connections", + "remote query timeout (s)": "remote_query_timeout", + "scan for startup procs": "startup_stored_procedures", + "xp_cmdshell": "xp_cmdshell" + } + } } } ], - "XTPNonClusteredIndexHashStatistics": [ + "SysDmOsHostInfo": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[12.0,)" + "type": "Server", + "engineEdition": "OnPremises", + "platform": "Windows", + "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT DISTINCT CONCAT(t.name,'.',o.name,'.',si.name) AS IndexFullName,FLOOR((CAST(page_update_retry_count AS FLOAT)/CASE WHEN page_update_count=0 THEN 1 ELSE page_update_count END)*100) AS page_update_count_pct,FLOOR((CAST(page_consolidation_retry_count AS FLOAT)/CASE WHEN page_consolidation_count=0 THEN 1 ELSE page_consolidation_count END)*100) AS page_consolidation_count_pct,FLOOR((CAST(page_split_retry_count AS FLOAT)/CASE WHEN page_split_count=0 THEN 1 ELSE page_split_count END)*100) AS page_split_count_pct,FLOOR((CAST(key_split_retry_count AS FLOAT)/CASE WHEN key_split_count=0 THEN 1 ELSE key_split_count END)*100) AS key_split_count_pct,FLOOR((CAST(page_merge_retry_count AS FLOAT)/CASE WHEN page_merge_count=0 THEN 1 ELSE page_merge_count END)*100) AS page_merge_count_pct,FLOOR((CAST(key_merge_retry_count AS FLOAT)/CASE WHEN key_merge_count=0 THEN 1 ELSE key_merge_count END)*100) AS key_merge_count_pct FROM sys.dm_db_xtp_nonclustered_index_stats AS xnis (NOLOCK) INNER JOIN sys.dm_db_xtp_index_stats AS xis (NOLOCK) ON xis.[object_id]=xnis.[object_id] AND xis.[index_id]=xnis.[index_id] INNER JOIN sys.indexes AS si (NOLOCK) ON xis.[object_id]=si.[object_id] AND xis.[index_id]=si.[index_id] INNER JOIN sys.objects AS o (NOLOCK) ON si.[object_id]=o.[object_id] INNER JOIN sys.tables AS mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.[type]='U'" + "query": "SELECT N'Windows' AS [host_platform] ,CASE WHEN [windows_release] IN ( '6.3' ,'10.0' ) AND ( @@VERSION LIKE N'%Build 10586%' OR @@VERSION LIKE N'%Build 14393%' ) THEN N'10.0' ELSE [windows_release] END AS [host_release] ,CASE WHEN @@VERSION LIKE '%%' THEN 64 ELSE 32 END AS [host_architecture] FROM sys.dm_os_windows_info(NOLOCK)", + "transform": { + "type": "parse", + "map": { + "host_release": "/^(?\\d+)\\.(?\\d+)(?:\\.(?\\d+))?(?:\\.(?\\d+))?$/x" + } + } } - } - ], - "CpuUsage": [ + }, { "type": "SQL", "target": { "type": "Server", - "platform": ["Windows", "Linux"], + "engineEdition": "OnPremises", + "platform": "Linux", "version": "[11.0,)" }, "implementation": { - "query": "DECLARE @ts_now bigint;SELECT @ts_now=ms_ticks FROM sys.dm_os_sys_info (NOLOCK);SELECT 100-ISNULL(SystemIdle,0) AS AVGTotalCPUUsage,AVGSQLCPUUsage,100-ISNULL(SystemIdle,0)-AVGSQLCPUUsage AS AVGCPUUsageByOther FROM(SELECT AVG(SystemIdle) AS SystemIdle,AVG(SQLProcessUtilization) AS AVGSQLCPUUsage FROM(SELECT record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]','int') AS SystemIdle,record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]','int') AS SQLProcessUtilization,[TIMESTAMP] FROM (SELECT [TIMESTAMP],CONVERT(xml,record) AS record FROM sys.dm_os_ring_buffers (NOLOCK) WHERE ring_buffer_type=N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE '%%' AND @ts_now-[TIMESTAMP]<=7200000) AS xrb ) AS si) AS a" + "query": "SELECT [host_platform] AS [host_platform] ,[host_release] AS [host_release] ,64 AS [host_architecture] FROM sys.dm_os_host_info(NOLOCK)", + "transform": { + "type": "parse", + "map": { + "host_release": "/^(?\\d+)\\.(?\\d+)(?:\\.(?\\d+))?(?:\\.(?\\d+))?$/x" + } + } } } ], - "TF6533SpatialFunctionsUsage": [ + "SysDmOsProcessMemory": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT DISTINCT 1 AS InUse FROM sys.sql_modules (NOLOCK) WHERE OBJECTPROPERTY([object_id],'IsMSShipped')=0 AND (PATINDEX('%.strelate(%',LOWER([definition]) COLLATE DATABASE_DEFAULT)>1 OR PATINDEX('%.stasbinary(%',LOWER([definition]) COLLATE DATABASE_DEFAULT)>1)", - "transform": { - "type": "noData", - "define": { - "InUse": 0 - } - } + "query": "SELECT locked_page_allocations_kb FROM sys.dm_os_process_memory (NOLOCK)" } } ], - "FKNotTrusted": [ + "SysDmOsSysInfo": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], + "type": "Server", + "engineEdition": "OnPremises, ManagedInstance", + "platform": [ + "Windows", + "Linux" + ], "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT CONCAT(QUOTENAME(t.name),'.',QUOTENAME(mst.name),'.',QUOTENAME(FKC.name)) AS [constraint_name] FROM sys.foreign_keys FKC (NOLOCK) INNER JOIN sys.objects o (NOLOCK) ON FKC.parent_object_id=o.[object_id] INNER JOIN sys.tables mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.type='U' AND FKC.is_not_trusted=1 AND FKC.is_not_for_replication=0 GROUP BY o.[schema_id],mst.[object_id],FKC.name,t.name,mst.name UNION ALL SELECT CONCAT(QUOTENAME(t.name),'.',QUOTENAME(mst.name),'.',QUOTENAME(CC.name)) FROM sys.check_constraints CC (NOLOCK) INNER JOIN sys.objects o (NOLOCK) ON CC.parent_object_id=o.[object_id] INNER JOIN sys.tables mst (NOLOCK) ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas t (NOLOCK) ON t.[schema_id]=mst.[schema_id] WHERE o.type='U' AND CC.is_not_trusted=1 AND CC.is_not_for_replication=0 AND CC.is_disabled=0 GROUP BY t.[schema_id],mst.[object_id],CC.name,t.name,mst.name", - "transform": { - "type": "aggregate", - "map": { - "constraint_name": "join" - } - } + "query": "SELECT max_workers_count, sql_memory_model, virtual_machine_type FROM sys.dm_os_sys_info (NOLOCK)" } } ], - "ObjectStatistics": [ + "Win32Volume": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[11.0.3000,)" + "type": "Server", + "platform": "Windows", + "engineEdition": "OnPremises", + "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT DISTINCT CONCAT(t.name,'.',OBJECT_NAME(mst.[object_id])) AS [TableName],ss.name AS [StatName],sp.[rows],sp.modification_counter,sp.rows_sampled FROM sys.objects AS o INNER JOIN sys.tables AS mst ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] INNER JOIN sys.stats AS ss ON ss.[object_id]=mst.[object_id] CROSS APPLY sys.dm_db_stats_properties(ss.[object_id],ss.[stats_id]) AS sp WHERE sp.[rows]>0" + "query": "SELECT DISTINCT CASE WHEN LEFT(physical_name, 1)= '\\' THEN LEFT(physical_name, charindex('\\',physical_name,5)) ELSE LEFT(physical_name,3) END AS [masterFilesVolumeName] FROM sys.master_files WHERE [database_id] <> 32767;" } - }, + } + ], + "WorkerThreads": [ { "type": "SQL", "target": { - "type": "Database", - "platform": ["Windows", "Linux"], - "version": "[11.0, 11.0.3000)" + "type": "Server", + "engineEdition": "OnPremises", + "platform": [ + "Windows", + "Linux" + ], + "version": "[11.0,)" }, "implementation": { - "useDatabase": true, - "query": "SELECT DISTINCT CONCAT(t.name,'.',OBJECT_NAME(mst.[object_id])) AS [TableName],ss.name AS [StatName],SUM(p.[rows]) AS [rows],si.rowmodctr AS modification_counter,0 AS rows_sampled AS FROM sys.sysindexes AS si INNER JOIN sys.objects AS o ON si.id=o.[object_id] INNER JOIN sys.tables AS mst ON mst.[object_id]=o.[object_id] INNER JOIN sys.schemas AS t ON t.[schema_id]=mst.[schema_id] INNER JOIN sys.stats AS ss ON ss.[object_id]=o.[object_id] INNER JOIN sys.partitions AS p ON p.[object_id]=ss.[object_id] LEFT JOIN sys.indexes i ON si.id=i.[object_id] AND si.indid=i.index_id WHERE o.type<>'S' AND i.name IS NOT NULL GROUP BY mst.[object_id],t.name,rowmodctr,ss.name HAVING SUM(p.[rows])>0" + "query": "SELECT (SUM(runnable_tasks_count) / COUNT(scheduler_id)) AS [overall_runnable_tasks_count], SUM(work_queue_count) AS [schedulers_work_queue_count] FROM sys.dm_os_schedulers WHERE parent_node_id < 64 AND scheduler_id < 255" } } ] } -} +} \ No newline at end of file diff --git a/samples/tutorials/README.md b/samples/tutorials/README.md index e4d025e4a9..15f0e50665 100644 --- a/samples/tutorials/README.md +++ b/samples/tutorials/README.md @@ -12,5 +12,4 @@ Contains samples that show how to connect to Microsoft SQL databases, including * Ruby - - +You can find many Azure-specific samples in the AzureSqlGettingStarted folder. diff --git a/samples/tutorials/c#/README.md b/samples/tutorials/c#/README.md index 6b5a5e6a82..92e0e9f914 100644 --- a/samples/tutorials/c#/README.md +++ b/samples/tutorials/c#/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- csharp +products: +- azure-sql-database +--- + # Developing applications with C# and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/f#/README.md b/samples/tutorials/f#/README.md index daa36dd6f5..d80ee5947c 100644 --- a/samples/tutorials/f#/README.md +++ b/samples/tutorials/f#/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- fsharp +products: +- azure-sql-database +--- + # Get started with SQL Server and F# Get started quickly with developing applications in F# on any OS with SQL Server diff --git a/samples/tutorials/go/README.md b/samples/tutorials/go/README.md index 13b186f538..f6f8257142 100644 --- a/samples/tutorials/go/README.md +++ b/samples/tutorials/go/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- go +products: +- azure-sql-database +--- + # Set up instructions 1. `go get github.com/denisenkom/go-mssqldb` diff --git a/samples/tutorials/java/README.md b/samples/tutorials/java/README.md index 15b2c175c2..ee91dd2a03 100644 --- a/samples/tutorials/java/README.md +++ b/samples/tutorials/java/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- java +products: +- azure-sql-database +--- + # Developing applications with Java and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/node.js/README.md b/samples/tutorials/node.js/README.md index 83595486e1..f7b07960a1 100644 --- a/samples/tutorials/node.js/README.md +++ b/samples/tutorials/node.js/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- nodejs +products: +- azure-sql-database +--- + # Developing applications with Node.js and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/php/1.0 PHP Configuration and Getting Started/test.php b/samples/tutorials/php/1.0 PHP Configuration and Getting Started/test.php index 1ad8faa394..568aa0b53d 100644 --- a/samples/tutorials/php/1.0 PHP Configuration and Getting Started/test.php +++ b/samples/tutorials/php/1.0 PHP Configuration and Getting Started/test.php @@ -1,63 +1,68 @@ "yourpassword", - "Uid"=>"yourusername", "PWD"=>"yourpassword"); - - $conn = sqlsrv_connect($serverName, $connectionOptions); - - $tsql = "SELECT [CompanyName] FROM SalesLT.Customer"; - - $getProducts = sqlsrv_query($conn, $tsql); - - if ($getProducts == FALSE) - die(FormatErrors(sqlsrv_errors())); - - $productCount = 0; - $ctr = 0; - while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) - { - $ctr++; - echo($row['CompanyName']); - echo("
"); - $productCount++; - if($ctr>10) - break; - } - - sqlsrv_free_stmt($getProducts); - - $tsql = "INSERT SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) OUTPUT INSERTED.ProductID VALUES ('SQL Server 15', 'SQL Server 12', 0, 0, getdate())"; - - - $insertReview = sqlsrv_query($conn, $tsql); - if($insertReview == FALSE) - die(FormatErrors( sqlsrv_errors())); - - - while($row = sqlsrv_fetch_array($insertReview, SQLSRV_FETCH_ASSOC)) - { - echo($row['ProductID']); - } - sqlsrv_free_stmt($insertReview); - - $tsql = "DELETE FROM [SalesLT].[Product] WHERE Name=?"; - $params = array("SQL Server 15"); - - $deleteReview = sqlsrv_prepare($conn, $tsql, $params); - if($deleteReview == FALSE) - die(FormatErrors(sqlsrv_errors())); - - if(sqlsrv_execute($deleteReview) == FALSE) - die(FormatErrors(sqlsrv_errors())); - - while($row = sqlsrv_fetch_array($deleteReview, SQLSRV_FETCH_ASSOC)) - { - echo($row['ProductID']); - } - sqlsrv_free_stmt($deleteReview); - - -?> - +echo "\n"; +$serverName = 'tcp:your_server.database.windows.net,1433'; + +$connectionOptions = [ + 'Database' => 'your_database', + 'Uid' => 'your_username', + 'PWD' => 'your_password', +]; + +$conn = sqlsrv_connect($serverName, $connectionOptions); + +$tsql = 'SELECT [CompanyName] FROM SalesLT.Customer'; + +$getProducts = sqlsrv_query($conn, $tsql); + +if ($getProducts === false) { + format_errors(sqlsrv_errors()); + die(); +} + +$productCount = 0; +$ctr = 0; +while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) { + $ctr++; + echo($row['CompanyName']); + echo('
'); + $productCount++; + if ($ctr > 10) { + break; + } +} + +sqlsrv_free_stmt($getProducts); + +$tsql = "INSERT SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) +OUTPUT INSERTED.ProductID +VALUES ('SQL Server 15', 'SQL Server 12', 0, 0, getdate());"; + +$insertReview = sqlsrv_query($conn, $tsql); +if ($insertReview === false) { + format_errors(sqlsrv_errors()); + die(); +} + +while ($row = sqlsrv_fetch_array($insertReview, SQLSRV_FETCH_ASSOC)) { + echo($row['ProductID']); +} +sqlsrv_free_stmt($insertReview); + +$tsql = 'DELETE FROM [SalesLT].[Product] WHERE Name=?'; +$params = ['SQL Server 15']; + +$deleteReview = sqlsrv_prepare($conn, $tsql, $params); +if ($deleteReview === false) { + format_errors(sqlsrv_errors()); + die(); +} + +if (sqlsrv_execute($deleteReview) === false) { + format_errors(sqlsrv_errors()); + die(); +} + +while ($row = sqlsrv_fetch_array($deleteReview, SQLSRV_FETCH_ASSOC)) { + echo($row['ProductID']); +} +sqlsrv_free_stmt($deleteReview); diff --git a/samples/tutorials/php/2.0 PHP Server programming - Stored procedures, Transactions, and UDFs/test.php b/samples/tutorials/php/2.0 PHP Server programming - Stored procedures, Transactions, and UDFs/test.php index 06bd878591..f9175ff519 100644 --- a/samples/tutorials/php/2.0 PHP Server programming - Stored procedures, Transactions, and UDFs/test.php +++ b/samples/tutorials/php/2.0 PHP Server programming - Stored procedures, Transactions, and UDFs/test.php @@ -1,138 +1,159 @@ -"yourdatabase", - "Uid"=>"yourusername", "PWD"=>"yourpassword"); - //Establishes the connection - $conn = sqlsrv_connect($serverName, $connectionOptions); - //////////////////STORED PROCEDURE///////////////////////// - $tsql = "CREATE PROCEDURE sp_GetCompanies22 AS BEGIN SELECT [CompanyName] FROM SalesLT.Customer END"; - $storedProc = sqlsrv_query($conn, $tsql); - if($storedProc == FALSE){ - echo "Error creating Stored Procedure"; - die(FormatErrors( sqlsrv_errors())); - } - sqlsrv_free_stmt($storedProc); + 'your_database', + 'Uid' => 'your_username', + 'PWD' => ' your_password', +]; +// Establishes the connection +$conn = sqlsrv_connect($serverName, $connectionOptions); + +/* + * Stored Procedure + */ + +$tsql = 'CREATE PROCEDURE sp_GetCompanies22 AS BEGIN SELECT [CompanyName] FROM SalesLT.Customer END'; +$storedProc = sqlsrv_query($conn, $tsql); +if ($storedProc === false) { + echo 'Error creating Stored Procedure'; + format_errors(sqlsrv_errors()); + die(); +} +sqlsrv_free_stmt($storedProc); - $tsql = "exec sp_GETCompanies22"; - //Executes the query - $getProducts = sqlsrv_query($conn, $tsql); - //Error handling - if ($getProducts == FALSE){ - echo "Error executing Stored Procedure"; - die(FormatErrors(sqlsrv_errors())); - } - $productCount = 0; - $ctr = 0; -?> -

First 10 results are after executing the stored procedure:

+$tsql = 'exec sp_GETCompanies22'; +// Executes the query +$getProducts = sqlsrv_query($conn, $tsql); +// Error handling +if ($getProducts === false) { + echo 'Error executing Stored Procedure'; + format_errors(sqlsrv_errors()); + die(); +} +$productCount = 0; +$ctr = 0; +?> +

First 10 results are after executing the stored procedure:

9) - break; - $ctr++; - echo($row['CompanyName']); - echo("
"); - $productCount++; +while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) { + // Printing only the first 10 results + if ($ctr > 9) { + break; } - sqlsrv_free_stmt($getProducts); - $tsql = "DROP PROCEDURE sp_GETCompanies22"; + $ctr++; + echo($row['CompanyName']); + echo('
'); + $productCount++; +} +sqlsrv_free_stmt($getProducts); +$tsql = 'DROP PROCEDURE sp_GETCompanies22'; - $storedProc = sqlsrv_query($conn, $tsql); - if($storedProc == FALSE) - { - echo "Error dropping Stored Procedure"; - die(FormatErrors( sqlsrv_errors())); - } - sqlsrv_free_stmt($storedProc); +$storedProc = sqlsrv_query($conn, $tsql); +if ($storedProc === false) { + echo 'Error dropping Stored Procedure'; + format_errors(sqlsrv_errors()); + die(); +} +sqlsrv_free_stmt($storedProc); ?> -

Transaction was commited

+/* If both queries were successful, commit the transaction. */ +/* Otherwise, rollback the transaction. */ +if ($stmt1 && $stmt2) { + sqlsrv_commit($conn); + ?> +

Transaction was committed

- -

First 10 results are after executing a query that uses the UDF:

+/* + * UDF + */ +// Dropping function if it already exists +$tsql1 = "IF OBJECT_ID(N'dbo.ifGetTotalItems', N'IF') IS NOT NULL DROP FUNCTION dbo.ifGetTotalItems;"; +$getProducts = sqlsrv_query($conn, $tsql1); +// Error handling +if ($getProducts === false) { + echo 'Error deleting the UDF'; + format_errors(sqlsrv_errors()); + die(); +} +$tsql1 = 'CREATE FUNCTION dbo.ifGetTotalItems (@OrderID INT) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( + SELECT SUM(OrderQty) AS TotalItems FROM SalesLT.SalesOrderDetail + WHERE SalesOrderID = @OrderID + GROUP BY SalesOrderID +);'; +$getProducts = sqlsrv_query($conn, $tsql1); +// Error handling +if ($getProducts === false) { + echo 'Error creating the UDF'; + format_errors(sqlsrv_errors()); + die(); +} +$tsql1 = 'SELECT s.SalesOrderID, s.OrderDate, s.CustomerID, f.TotalItems +FROM SalesLT.SalesOrderHeader s +CROSS APPLY dbo.ifGetTotalItems(s.SalesOrderID) f +ORDER BY SalesOrderID;'; +$getProducts = sqlsrv_query($conn, $tsql1); +// Error handling +if ($getProducts === false) { + echo 'Error executing the UDF'; + format_errors(sqlsrv_errors()); + die(); +} +$productCount = 0; +$ctr = 0; +?> +

First 10 results are after executing a query that uses the UDF:

"); +echo 'SalesOrderID CustomerID TotalItems'; +echo('
'); - while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) - { - //Printing only the top 10 results - if($ctr>9) - break; - $ctr++; - echo $row['SalesOrderID'] . str_repeat(' ', 13) . $row['CustomerID'] . str_repeat(' ', 11) . $row['TotalItems']; - echo("
"); - $productCount++; - +while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) { + // Printing only the top 10 results + if ($ctr > 9) { + break; } - sqlsrv_free_stmt($getProducts); - - -?> \ No newline at end of file + $ctr++; + echo sprintf( + '%s%s%s%s%s', + $row['SalesOrderID'], + str_repeat(' ', 13), + $row['CustomerID'], + str_repeat(' ', 11), + $row['TotalItems'] + ); + echo('
'); + $productCount++; +} +sqlsrv_free_stmt($getProducts); diff --git a/samples/tutorials/php/README.md b/samples/tutorials/php/README.md index b46f012a83..cb18fcc503 100644 --- a/samples/tutorials/php/README.md +++ b/samples/tutorials/php/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- php +products: +- azure-sql-database +--- + # Developing applications with php and SQL Server Pick a platform below to get started: diff --git a/samples/tutorials/php/RHEL/SqlServerColumnstoreSample/columnstore.php b/samples/tutorials/php/RHEL/SqlServerColumnstoreSample/columnstore.php index 12aaa0b264..cc9a0f1adf 100644 --- a/samples/tutorials/php/RHEL/SqlServerColumnstoreSample/columnstore.php +++ b/samples/tutorials/php/RHEL/SqlServerColumnstoreSample/columnstore.php @@ -1,42 +1,40 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -//Read Query -$tsql= "SELECT SUM(Price) as sum FROM Table_with_5M_rows"; -$getResults= sqlsrv_query($conn, $tsql); -echo ("Sum: "); -if ($getResults == FALSE) - die(FormatErrors(sqlsrv_errors())); +// Read Query +$tsql = 'SELECT SUM(Price) as sum FROM Table_with_5M_rows'; +$getResults = sqlsrv_query($conn, $tsql); +echo('Sum: '); +if ($getResults === false) { + format_errors(sqlsrv_errors()); + die(); +} while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { - echo ($row['sum'] . PHP_EOL); - + echo($row['sum'] . PHP_EOL); } sqlsrv_free_stmt($getResults); -function FormatErrors( $errors ) +function format_errors($errors) { /* Display errors. */ - echo "Error information: "; + echo 'Error information: '; - foreach ( $errors as $error ) - { - echo "SQLSTATE: ".$error['SQLSTATE'].""; - echo "Code: ".$error['code'].""; - echo "Message: ".$error['message'].""; + foreach ($errors as $error) { + echo 'SQLSTATE: ' . $error['SQLSTATE'] . ''; + echo 'Code: ' . $error['code'] . ''; + echo 'Message: ' . $error['message'] . ''; } } -$time_end = microtime(true); -$execution_time = round((($time_end - $time_start)*1000),2); -echo 'QueryTime: '.$execution_time.' ms'; - -?> \ No newline at end of file +$timeEnd = microtime(true); +$executionTime = round((($timeEnd - $timeStart) * 1000), 2); +echo 'QueryTime: ' . $executionTime . ' ms'; diff --git a/samples/tutorials/php/RHEL/SqlServerSample/connect.php b/samples/tutorials/php/RHEL/SqlServerSample/connect.php index 506ae39d03..905f5a0c6d 100644 --- a/samples/tutorials/php/RHEL/SqlServerSample/connect.php +++ b/samples/tutorials/php/RHEL/SqlServerSample/connect.php @@ -1,12 +1,12 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -if($conn) - echo "Connected!" -?> \ No newline at end of file +if ($conn) { + echo 'Connected!'; +} diff --git a/samples/tutorials/php/RHEL/SqlServerSample/crud.php b/samples/tutorials/php/RHEL/SqlServerSample/crud.php index 55c0552749..d0a1583b85 100644 --- a/samples/tutorials/php/RHEL/SqlServerSample/crud.php +++ b/samples/tutorials/php/RHEL/SqlServerSample/crud.php @@ -1,74 +1,78 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -//Insert Query -echo ("Inserting a new row into table" . PHP_EOL); -$tsql= "INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);"; -$params = array('Jake','United States'); -$getResults= sqlsrv_query($conn, $tsql, $params); +// Insert Query +echo('Inserting a new row into table' . PHP_EOL); +$tsql = 'INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);'; +$params = ['Jake', 'United States']; +$getResults = sqlsrv_query($conn, $tsql, $params); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) inserted: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) inserted: ' . PHP_EOL); sqlsrv_free_stmt($getResults); -//Update Query +// Update Query $userToUpdate = 'Nikita'; -$tsql= "UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?"; -$params = array('Sweeden', $userToUpdate); -echo("Updating Location for user " . $userToUpdate . PHP_EOL); +$tsql = 'UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?'; +$params = ['Sweden', $userToUpdate]; +echo('Updating Location for user ' . $userToUpdate . PHP_EOL); -$getResults= sqlsrv_query($conn, $tsql, $params); +$getResults = sqlsrv_query($conn, $tsql, $params); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) updated: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) updated: ' . PHP_EOL); sqlsrv_free_stmt($getResults); -//Delte Query +// Delete Query $userToDelete = 'Jared'; -$tsql= "DELETE FROM TestSchema.Employees WHERE Name = ?"; -$params = array($userToDelete); -$getResults= sqlsrv_query($conn, $tsql, $params); -echo("Deleting user " . $userToDelete . PHP_EOL); +$tsql = 'DELETE FROM TestSchema.Employees WHERE Name = ?'; +$params = [$userToDelete]; +$getResults = sqlsrv_query($conn, $tsql, $params); +echo('Deleting user ' . $userToDelete . PHP_EOL); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) deleted: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) deleted: ' . PHP_EOL); sqlsrv_free_stmt($getResults); - -//Read Query -$tsql= "SELECT Id, Name, Location FROM TestSchema.Employees;"; -$getResults= sqlsrv_query($conn, $tsql); -echo ("Reading data from table" . PHP_EOL); -if ($getResults == FALSE) - die(FormatErrors(sqlsrv_errors())); +// Read Query +$tsql = 'SELECT Id, Name, Location FROM TestSchema.Employees;'; +$getResults = sqlsrv_query($conn, $tsql); +echo('Reading data from table' . PHP_EOL); +if ($getResults === false) { + format_errors(sqlsrv_errors()); + die(); +} while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { - echo ($row['Id'] . " " . $row['Name'] . " " . $row['Location'] . PHP_EOL); - + echo($row['Id'] . ' ' . $row['Name'] . ' ' . $row['Location'] . PHP_EOL); } sqlsrv_free_stmt($getResults); -function FormatErrors( $errors ) +function format_errors($errors) { /* Display errors. */ - echo "Error information: "; + echo 'Error information: '; - foreach ( $errors as $error ) - { - echo "SQLSTATE: ".$error['SQLSTATE'].""; - echo "Code: ".$error['code'].""; - echo "Message: ".$error['message'].""; + foreach ($errors as $error) { + echo 'SQLSTATE: ' . $error['SQLSTATE'] . ''; + echo 'Code: ' . $error['code'] . ''; + echo 'Message: ' . $error['message'] . ''; } } -?> \ No newline at end of file diff --git a/samples/tutorials/php/Ubuntu/SqlServerColumnstoreSample/columnstore.php b/samples/tutorials/php/Ubuntu/SqlServerColumnstoreSample/columnstore.php index 12aaa0b264..cc9a0f1adf 100644 --- a/samples/tutorials/php/Ubuntu/SqlServerColumnstoreSample/columnstore.php +++ b/samples/tutorials/php/Ubuntu/SqlServerColumnstoreSample/columnstore.php @@ -1,42 +1,40 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -//Read Query -$tsql= "SELECT SUM(Price) as sum FROM Table_with_5M_rows"; -$getResults= sqlsrv_query($conn, $tsql); -echo ("Sum: "); -if ($getResults == FALSE) - die(FormatErrors(sqlsrv_errors())); +// Read Query +$tsql = 'SELECT SUM(Price) as sum FROM Table_with_5M_rows'; +$getResults = sqlsrv_query($conn, $tsql); +echo('Sum: '); +if ($getResults === false) { + format_errors(sqlsrv_errors()); + die(); +} while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { - echo ($row['sum'] . PHP_EOL); - + echo($row['sum'] . PHP_EOL); } sqlsrv_free_stmt($getResults); -function FormatErrors( $errors ) +function format_errors($errors) { /* Display errors. */ - echo "Error information: "; + echo 'Error information: '; - foreach ( $errors as $error ) - { - echo "SQLSTATE: ".$error['SQLSTATE'].""; - echo "Code: ".$error['code'].""; - echo "Message: ".$error['message'].""; + foreach ($errors as $error) { + echo 'SQLSTATE: ' . $error['SQLSTATE'] . ''; + echo 'Code: ' . $error['code'] . ''; + echo 'Message: ' . $error['message'] . ''; } } -$time_end = microtime(true); -$execution_time = round((($time_end - $time_start)*1000),2); -echo 'QueryTime: '.$execution_time.' ms'; - -?> \ No newline at end of file +$timeEnd = microtime(true); +$executionTime = round((($timeEnd - $timeStart) * 1000), 2); +echo 'QueryTime: ' . $executionTime . ' ms'; diff --git a/samples/tutorials/php/Ubuntu/SqlServerSample/connect.php b/samples/tutorials/php/Ubuntu/SqlServerSample/connect.php index c19bec3cd1..f7aff3ab99 100644 --- a/samples/tutorials/php/Ubuntu/SqlServerSample/connect.php +++ b/samples/tutorials/php/Ubuntu/SqlServerSample/connect.php @@ -1,12 +1,14 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" - ); - //Establishes the connection - $conn = sqlsrv_connect($serverName, $connectionOptions); - if($conn) - echo "Connected!" -?> \ No newline at end of file + // Setup the connection + $serverName = 'localhost'; + $connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password' + ]; + + // Establish the connection + $connection = sqlsrv_connect($serverName, $connectionOptions); + if ($connection) { + echo 'Connected!'; + } diff --git a/samples/tutorials/php/Ubuntu/SqlServerSample/crud.php b/samples/tutorials/php/Ubuntu/SqlServerSample/crud.php index 55c0552749..977f214bea 100644 --- a/samples/tutorials/php/Ubuntu/SqlServerSample/crud.php +++ b/samples/tutorials/php/Ubuntu/SqlServerSample/crud.php @@ -1,74 +1,78 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -//Insert Query -echo ("Inserting a new row into table" . PHP_EOL); -$tsql= "INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);"; -$params = array('Jake','United States'); -$getResults= sqlsrv_query($conn, $tsql, $params); +// Insert Query +echo('Inserting a new row into table' . PHP_EOL); +$tsql = 'INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);'; +$params = ['Jake', 'United States']; +$getResults = sqlsrv_query($conn, $tsql, $params); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) inserted: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) inserted: ' . PHP_EOL); sqlsrv_free_stmt($getResults); -//Update Query +// Update Query $userToUpdate = 'Nikita'; -$tsql= "UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?"; -$params = array('Sweeden', $userToUpdate); -echo("Updating Location for user " . $userToUpdate . PHP_EOL); +$tsql = 'UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?'; +$params = ['Sweden', $userToUpdate]; +echo('Updating Location for user ' . $userToUpdate . PHP_EOL); -$getResults= sqlsrv_query($conn, $tsql, $params); +$getResults = sqlsrv_query($conn, $tsql, $params); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) updated: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) updated: ' . PHP_EOL); sqlsrv_free_stmt($getResults); -//Delte Query +// Delete Query $userToDelete = 'Jared'; -$tsql= "DELETE FROM TestSchema.Employees WHERE Name = ?"; -$params = array($userToDelete); -$getResults= sqlsrv_query($conn, $tsql, $params); -echo("Deleting user " . $userToDelete . PHP_EOL); +$tsql = 'DELETE FROM TestSchema.Employees WHERE Name = ?'; +$params = [$userToDelete]; +$getResults = sqlsrv_query($conn, $tsql, $params); +echo('Deleting user ' . $userToDelete . PHP_EOL); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) deleted: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) deleted: ' . PHP_EOL); sqlsrv_free_stmt($getResults); - -//Read Query -$tsql= "SELECT Id, Name, Location FROM TestSchema.Employees;"; -$getResults= sqlsrv_query($conn, $tsql); -echo ("Reading data from table" . PHP_EOL); -if ($getResults == FALSE) - die(FormatErrors(sqlsrv_errors())); +// Read Query +$tsql = 'SELECT Id, Name, Location FROM TestSchema.Employees;'; +$getResults = sqlsrv_query($conn, $tsql); +echo('Reading data from table' . PHP_EOL); +if ($getResults === false) { + format_errors(sqlsrv_errors()); + die(); +} while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { - echo ($row['Id'] . " " . $row['Name'] . " " . $row['Location'] . PHP_EOL); - + echo($row['Id'] . ' ' . $row['Name'] . ' ' . $row['Location'] . PHP_EOL); } sqlsrv_free_stmt($getResults); -function FormatErrors( $errors ) +function format_errors($errors) { /* Display errors. */ - echo "Error information: "; + echo 'Error information: '; - foreach ( $errors as $error ) - { - echo "SQLSTATE: ".$error['SQLSTATE'].""; - echo "Code: ".$error['code'].""; - echo "Message: ".$error['message'].""; + foreach ($errors as $error) { + echo 'SQLSTATE: ' . $error['SQLSTATE'] . ''; + echo 'Code: ' . $error['code'] . ''; + echo 'Message: ' . $error['message'] . ''; } } -?> \ No newline at end of file diff --git a/samples/tutorials/php/Windows/SqlServerColumnstoreSample/columnstore.php b/samples/tutorials/php/Windows/SqlServerColumnstoreSample/columnstore.php index 12aaa0b264..cc9a0f1adf 100644 --- a/samples/tutorials/php/Windows/SqlServerColumnstoreSample/columnstore.php +++ b/samples/tutorials/php/Windows/SqlServerColumnstoreSample/columnstore.php @@ -1,42 +1,40 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -//Read Query -$tsql= "SELECT SUM(Price) as sum FROM Table_with_5M_rows"; -$getResults= sqlsrv_query($conn, $tsql); -echo ("Sum: "); -if ($getResults == FALSE) - die(FormatErrors(sqlsrv_errors())); +// Read Query +$tsql = 'SELECT SUM(Price) as sum FROM Table_with_5M_rows'; +$getResults = sqlsrv_query($conn, $tsql); +echo('Sum: '); +if ($getResults === false) { + format_errors(sqlsrv_errors()); + die(); +} while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { - echo ($row['sum'] . PHP_EOL); - + echo($row['sum'] . PHP_EOL); } sqlsrv_free_stmt($getResults); -function FormatErrors( $errors ) +function format_errors($errors) { /* Display errors. */ - echo "Error information: "; + echo 'Error information: '; - foreach ( $errors as $error ) - { - echo "SQLSTATE: ".$error['SQLSTATE'].""; - echo "Code: ".$error['code'].""; - echo "Message: ".$error['message'].""; + foreach ($errors as $error) { + echo 'SQLSTATE: ' . $error['SQLSTATE'] . ''; + echo 'Code: ' . $error['code'] . ''; + echo 'Message: ' . $error['message'] . ''; } } -$time_end = microtime(true); -$execution_time = round((($time_end - $time_start)*1000),2); -echo 'QueryTime: '.$execution_time.' ms'; - -?> \ No newline at end of file +$timeEnd = microtime(true); +$executionTime = round((($timeEnd - $timeStart) * 1000), 2); +echo 'QueryTime: ' . $executionTime . ' ms'; diff --git a/samples/tutorials/php/Windows/SqlServerSample/connect.php b/samples/tutorials/php/Windows/SqlServerSample/connect.php index 506ae39d03..905f5a0c6d 100644 --- a/samples/tutorials/php/Windows/SqlServerSample/connect.php +++ b/samples/tutorials/php/Windows/SqlServerSample/connect.php @@ -1,12 +1,12 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -if($conn) - echo "Connected!" -?> \ No newline at end of file +if ($conn) { + echo 'Connected!'; +} diff --git a/samples/tutorials/php/Windows/SqlServerSample/crud.php b/samples/tutorials/php/Windows/SqlServerSample/crud.php index 4e819f6a08..977f214bea 100644 --- a/samples/tutorials/php/Windows/SqlServerSample/crud.php +++ b/samples/tutorials/php/Windows/SqlServerSample/crud.php @@ -1,74 +1,78 @@ "SampleDB", - "Uid" => "sa", - "PWD" => "your_password" -); -//Establishes the connection +$serverName = 'localhost'; +$connectionOptions = [ + 'Database' => 'SampleDB', + 'Uid' => 'sa', + 'PWD' => 'your_password', +]; +// Establishes the connection $conn = sqlsrv_connect($serverName, $connectionOptions); -//Insert Query -echo ("Inserting a new row into table" . PHP_EOL); -$tsql= "INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);"; -$params = array('Jake','United States'); -$getResults= sqlsrv_query($conn, $tsql, $params); +// Insert Query +echo('Inserting a new row into table' . PHP_EOL); +$tsql = 'INSERT INTO TestSchema.Employees (Name, Location) VALUES (?,?);'; +$params = ['Jake', 'United States']; +$getResults = sqlsrv_query($conn, $tsql, $params); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) inserted: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) inserted: ' . PHP_EOL); sqlsrv_free_stmt($getResults); -//Update Query +// Update Query $userToUpdate = 'Nikita'; -$tsql= "UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?"; -$params = array('Sweeden', $userToUpdate); -echo("Updating Location for user " . $userToUpdate . PHP_EOL); +$tsql = 'UPDATE TestSchema.Employees SET Location = ? WHERE Name = ?'; +$params = ['Sweden', $userToUpdate]; +echo('Updating Location for user ' . $userToUpdate . PHP_EOL); -$getResults= sqlsrv_query($conn, $tsql, $params); +$getResults = sqlsrv_query($conn, $tsql, $params); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) updated: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) updated: ' . PHP_EOL); sqlsrv_free_stmt($getResults); -//Delete Query +// Delete Query $userToDelete = 'Jared'; -$tsql= "DELETE FROM TestSchema.Employees WHERE Name = ?"; -$params = array($userToDelete); -$getResults= sqlsrv_query($conn, $tsql, $params); -echo("Deleting user " . $userToDelete . PHP_EOL); +$tsql = 'DELETE FROM TestSchema.Employees WHERE Name = ?'; +$params = [$userToDelete]; +$getResults = sqlsrv_query($conn, $tsql, $params); +echo('Deleting user ' . $userToDelete . PHP_EOL); $rowsAffected = sqlsrv_rows_affected($getResults); -if ($getResults == FALSE or $rowsAffected == FALSE) - die(FormatErrors(sqlsrv_errors())); -echo ($rowsAffected. " row(s) deleted: " . PHP_EOL); +if ($getResults === false || $rowsAffected === false) { + format_errors(sqlsrv_errors()); + die(); +} +echo($rowsAffected . ' row(s) deleted: ' . PHP_EOL); sqlsrv_free_stmt($getResults); - -//Read Query -$tsql= "SELECT Id, Name, Location FROM TestSchema.Employees;"; -$getResults= sqlsrv_query($conn, $tsql); -echo ("Reading data from table" . PHP_EOL); -if ($getResults == FALSE) - die(FormatErrors(sqlsrv_errors())); +// Read Query +$tsql = 'SELECT Id, Name, Location FROM TestSchema.Employees;'; +$getResults = sqlsrv_query($conn, $tsql); +echo('Reading data from table' . PHP_EOL); +if ($getResults === false) { + format_errors(sqlsrv_errors()); + die(); +} while ($row = sqlsrv_fetch_array($getResults, SQLSRV_FETCH_ASSOC)) { - echo ($row['Id'] . " " . $row['Name'] . " " . $row['Location'] . PHP_EOL); - + echo($row['Id'] . ' ' . $row['Name'] . ' ' . $row['Location'] . PHP_EOL); } sqlsrv_free_stmt($getResults); -function FormatErrors( $errors ) +function format_errors($errors) { /* Display errors. */ - echo "Error information: "; + echo 'Error information: '; - foreach ( $errors as $error ) - { - echo "SQLSTATE: ".$error['SQLSTATE'].""; - echo "Code: ".$error['code'].""; - echo "Message: ".$error['message'].""; + foreach ($errors as $error) { + echo 'SQLSTATE: ' . $error['SQLSTATE'] . ''; + echo 'Code: ' . $error['code'] . ''; + echo 'Message: ' . $error['message'] . ''; } } -?> diff --git a/samples/tutorials/python/README.md b/samples/tutorials/python/README.md index 6abd58786b..c9c3fd67f6 100644 --- a/samples/tutorials/python/README.md +++ b/samples/tutorials/python/README.md @@ -1,3 +1,11 @@ +--- +page_type: sample +languages: +- python +products: +- azure-sql-database +--- + # Python samples Simple Python applications to connect to Microsoft SQL databases, including SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. Samples for operating systems including Linux, Windows, and macOS. diff --git a/samples/tutorials/ruby/README.md b/samples/tutorials/ruby/README.md index e94aa56333..15a24d7100 100644 --- a/samples/tutorials/ruby/README.md +++ b/samples/tutorials/ruby/README.md @@ -1,3 +1,12 @@ +--- +page_type: sample +languages: +- ruby +products: +- azure-sql-database +--- + + # Ruby samples Simple Ruby applications to connect to Microsoft SQL databases, including SQL Server, Azure SQL Database, and Azure SQL Data Warehouse. Samples for operating systems including Linux, Windows, and macOS.