From 434b798c981bb187ec2dc4710716910d22e49f83 Mon Sep 17 00:00:00 2001 From: Lorin Thwaits Date: Mon, 20 Feb 2023 18:06:38 +0000 Subject: [PATCH 1/2] Fix incorrect JSON creation in RecordDeliveryVanTemperatures sproc --- .../Stored Procedures/RecordDeliveryVanTemperatures.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/samples/databases/wide-world-importers/wwi-ssdt/wwi-ssdt/DataLoadSimulation/Stored Procedures/RecordDeliveryVanTemperatures.sql b/samples/databases/wide-world-importers/wwi-ssdt/wwi-ssdt/DataLoadSimulation/Stored Procedures/RecordDeliveryVanTemperatures.sql index 5106cecc..eff707c9 100644 --- a/samples/databases/wide-world-importers/wwi-ssdt/wwi-ssdt/DataLoadSimulation/Stored Procedures/RecordDeliveryVanTemperatures.sql +++ b/samples/databases/wide-world-importers/wwi-ssdt/wwi-ssdt/DataLoadSimulation/Stored Procedures/RecordDeliveryVanTemperatures.sql @@ -47,10 +47,11 @@ BEGIN + N'{"type":"Feature", "geometry": {"type":"Point", "coordinates":[' + CAST(@Longitude AS nvarchar(20)) + N',' + CAST(@Latitude AS nvarchar(20)) + N'] }, "properties":{"rego":"' + STRING_ESCAPE(@VehicleRegistration, N'json') - + N'","sensor":"' + CAST(@SensorCounter + 1 AS nvarchar(20)) + + N'","sensor":' + CAST(@SensorCounter + 1 AS nvarchar(20)) + N',"when":"' + CONVERT(nvarchar(30), @TimeCounter, 126) + N'","temp":' + CAST(@Temperature AS nvarchar(20)) - + N'}} ]'; + + N'}} ]' + + N'}'; INSERT Warehouse.VehicleTemperatures (VehicleRegistration, ChillerSensorNumber, From b062f2c734cf77257c3d1f41860f7e7d857cd1a7 Mon Sep 17 00:00:00 2001 From: Lorin Thwaits Date: Mon, 20 Feb 2023 18:07:15 +0000 Subject: [PATCH 2/2] Remove extra spacing --- .gitignore | 2 +- README.md | 6 +- README_samples_template.md | 2 +- SECURITY.md | 2 +- .../sql-sampledb/sampledb1/sampleDB1.sql | 2 +- .../aspstate_sql2016_no_retry.sql | 254 +- .../aspstate_sql2016_with_retry.sql | 1082 +- .../applications/azure-data-studio/README.md | 2 +- .../DataGenerator/DataGenerator.csproj | 2 +- .../DataGenerator/Properties/AssemblyInfo.cs | 10 +- .../DataGenerator/SqlDataGenerator.cs | 68 +- .../applications/iot-connected-car/README.md | 12 +- .../WinFormsClient/FrmMain.Designer.cs | 68 +- .../WinFormsClient/FrmMain.cs | 40 +- .../WinFormsClient/FrmMain.resx | 54 +- .../WinFormsClient/Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.Designer.cs | 14 +- .../WinFormsClient/Properties/Resources.resx | 54 +- .../WinFormsClient/WinFormsClient.csproj | 2 +- .../WinFormsClient/sample-sql-queries.sql | 6 +- .../iot-connected-car/sample-sql-queries.sql | 6 +- .../iot-connected-car/setup_reset.sql | 70 +- .../applications/iot-smart-grid/App.config | 2 +- .../ConsoleClient/ConsoleClient.csproj | 2 +- .../iot-smart-grid/ConsoleClient/Program.cs | 50 +- .../ConsoleClient/Properties/AssemblyInfo.cs | 10 +- .../DataGenerator/DataGenerator.csproj | 2 +- .../DataGenerator/Properties/AssemblyInfo.cs | 10 +- .../DataGenerator/SqlDataGenerator.cs | 36 +- .../InsertMeterMeasurement.sql | 2 +- .../InsertMeterMeasurementHistory.sql | 6 +- .../Db/dbo/Views/vwMeterMeasurement.sql | 20 +- samples/applications/iot-smart-grid/README.md | 16 +- .../WinFormsClient/FrmMain.Designer.cs | 40 +- .../iot-smart-grid/WinFormsClient/FrmMain.cs | 64 +- .../WinFormsClient/FrmMain.resx | 54 +- .../WinFormsClient/Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.Designer.cs | 14 +- .../WinFormsClient/Properties/Resources.resx | 54 +- .../WinFormsClient/WinFormsClient.csproj | 2 +- .../iot-smart-grid/setup-or-reset-demo.sql | 34 +- samples/containers/dtc/README.md | 10 +- samples/containers/dtc/docker-compose.yml | 2 +- samples/containers/dtc/dtc1/db-init.sql | 6 +- samples/containers/dtc/dtc1/entrypoint.sh | 4 +- samples/containers/dtc/dtc2/entrypoint.sh | 4 +- samples/containers/dtc/linkedserver.sql | 6 +- samples/containers/replication/README.md | 10 +- .../containers/replication/db1/db-init.sql | 128 +- .../containers/replication/db1/entrypoint.sh | 4 +- .../containers/replication/db2/entrypoint.sh | 4 +- samples/databases/README.md | 2 +- samples/databases/adventure-works/README.md | 20 +- .../DatabaseLog.csv | Bin 328442 -> 330288 bytes ...itionalInternationalProductDescription.csv | Bin 3866728 -> 403666 bytes .../instawdbdw.sql | Bin 112258 -> 111796 bytes .../oltp-install-script/Document.csv | Bin 1157828 -> 1048570 bytes .../oltp-install-script/JobCandidate.csv | Bin 108444 -> 108388 bytes .../JobCandidate_TOREMOVE.csv | Bin 108288 -> 108232 bytes .../oltp-install-script/ProductModel.csv | Bin 107216 -> 107142 bytes .../oltp-install-script/ProductModelorg.csv | Bin 106488 -> 106414 bytes .../oltp-install-script/ProductReview.csv | 22 +- .../oltp-install-script/instawdb.sql | Bin 959826 -> 655900 bytes ...o-data-warehouse-to-sql-data-warehouse.sql | 162 +- ...so-data-warehouse_to-sql-data-warehouse.md | 144 +- .../contoso-data-warehouse/readme.md | 8 +- .../instnwnd (Azure SQL Database).sql | 395 +- samples/databases/northwind-pubs/instnwnd.sql | Bin 2115550 -> 1310616 bytes samples/databases/northwind-pubs/instpubs.sql | 24 +- .../power-bi-dashboards/README.md | 4 +- .../DemonstrateAlwaysEncrypted - Window 2.sql | 6 +- .../DemonstrateAlwaysEncrypted.sql | 28 +- .../PopulateAlwaysEncryptedData/App.config | 2 +- .../PopulateAlwaysEncryptedData.csproj | 2 +- ...opulateAlwaysEncryptedDataMain.Designer.cs | 20 +- .../PopulateAlwaysEncryptedDataMain.cs | 2 +- .../PopulateAlwaysEncryptedDataMain.resx | 54 +- .../Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.resx | 54 +- .../Properties/Settings.Designer.cs | 10 +- .../dynamic-data-masking/DemonstrateDDM.SQL | Bin 3002 -> 2998 bytes .../in-memory-oltp/VehicleLocation.sql | Bin 10490 -> 10486 bytes .../load-sample-data-using-polybase.sql | 154 +- ...nstrateOperationalAnalyticsPerformance.sql | Bin 5470 -> 5462 bytes .../DemonstrateRLS - Window 2.sql | 4 +- .../row-level-security/DemonstrateRLS.sql | 30 +- .../MultithreadedOrderInsert/App.config | 2 +- .../ErrorFormMain.Designer.cs | 20 +- .../ErrorFormMain.resx | 54 +- .../MultithreadedOrderInsert.csproj | 2 +- .../MultithreadedOrderInsertMain.Designer.cs | 40 +- .../MultithreadedOrderInsertMain.resx | 54 +- .../Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.Designer.cs | 14 +- .../Properties/Resources.resx | 54 +- .../Properties/Settings.Designer.cs | 10 +- .../App.config | 2 +- .../ErrorFormMain.Designer.cs | 20 +- .../ErrorFormMain.resx | 54 +- .../MultithreadedInMemoryTableInsert.csproj | 2 +- ...hreadedInMemoryTableInsertMain.Designer.cs | 56 +- .../MultithreadedInMemoryTableInsertMain.resx | 54 +- .../Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.resx | 54 +- .../Properties/Settings.Designer.cs | 10 +- .../VehicleLocation.sql | 26 +- .../wwi-app/Controllers/FrontEndController.cs | 2 +- .../wwi-app/Controllers/ODataController.tt | 2 +- .../wide-world-importers/wwi-app/Startup.cs | 8 +- .../wwi-app/Views/FrontEnd/Customers.cshtml | 2 +- .../wwi-app/Views/FrontEnd/Offers.cshtml | 2 +- .../wwi-app/Views/Shared/_InvoicesForm.cshtml | 2 +- .../wwi-app/Views/Shared/_Layout.cshtml | 4 +- .../Views/Shared/_StockItemsForm.cshtml | 2 +- .../wwi-app/wwwroot/OData.tt | 2 +- .../wwwroot/js/CustomerTransactions.Edit.js | 2 +- .../wwi-app/wwwroot/js/Customers.js | 4 +- .../wwi-app/wwwroot/js/Dashboard.js | 2 +- .../wwi-app/wwwroot/js/Invoices.Edit.js | 2 +- .../wwi-app/wwwroot/js/Invoices.js | 2 +- .../wwi-app/wwwroot/js/SalesOrders.Edit.js | 2 +- .../wwwroot/js/SupplierTransactions.Edit.js | 2 +- .../wwwroot/js/Suppliers.StockItemsTable.js | 2 +- .../wwi-app/wwwroot/js/Suppliers.js | 2 +- .../media/js/dataTables.bootstrap.js | 2 +- .../media/js/dataTables.bootstrap4.js | 2 +- .../media/js/dataTables.material.js | 2 +- .../media/js/dataTables.semanticui.js | 2 +- .../datatables/media/js/dataTables.uikit.js | 2 +- .../datatables/media/js/jquery.dataTables.js | 5980 +-------- .../wwwroot/lib/dtodata/css/site_jui.ccss.css | 2 +- .../lib/dtodata/css/themes/base/jquery-ui.css | 8 +- .../smoothness/jquery-ui-1.7.2.custom.css | 4 +- .../lib/dtodata/js/jquery.dataTables.js | 5835 +------- .../lib/dtodata/js/jquery.dataTables.odata.js | 22 +- .../wwwroot/lib/jquery.serializejson.js | 2 +- .../wwi-app/wwwroot/lib/jquery.view-engine.js | 24 +- .../wwi-app/wwwroot/lib/nvd3/nv.d3.js | 6435 +-------- .../example/js/ko.bindinghandler.currency.js | 20 +- .../wwi-app/wwwroot/lib/o.js/o.js | 2 +- .../wwi-app/wwwroot/lib/q/CHANGES.md | 2 +- .../wwi-app/wwwroot/lib/toastr/README.md | 2 +- .../wwwroot/lib/webcomponentsjs/README.md | 2 +- .../wwi-azure-functions/ODataFunctions.tt | 2 +- .../wwi-dw-ssdt/Dimension/Tables/Date.sql | 118 +- .../GenerateDateDimensionColumns.sql | 156 +- .../PopulateDateDimensionForYear.sql | 226 +- .../Script.PostDeployment1.sql | 36 +- .../Stored Procedures/ReseedAllSequences.sql | 4 +- .../ReseedSequenceBeyondTableValues.sql | 8 +- .../wwi-dw-ssdt/dbo/Tables/SampleVersion.sql | 4 +- .../wide-world-importers/wwi-ssasmd/README.md | 2 +- .../Wide World Importers-DESKTOP-OS5I5AQ.cube | 402 +- .../Wide World Importers-ThinkerPad.cube | 402 +- .../wwi-ssasmd/Wide World Importers.cube | 402 +- .../wide-world-importers/wwi-ssdt/README.md | 2 +- .../Configuration_DisableInMemory.sql | 22 +- .../Configuration_PrepareForAzureStandard.sql | 2 +- .../Functions/GetBogativePhoneNumber.sql | 12 +- .../Functions/GetCityLocation.sql | 12 +- .../Functions/GetCustomerCount.sql | 10 +- .../Functions/GetDeliveryMethodID.sql | 4 +- .../Functions/GetPaymentMethodID.sql | 6 +- .../Functions/GetPersonID.sql | 2 +- .../Functions/GetStateProvinceID.sql | 8 +- .../Functions/GetSupplierCategoryID.sql | 6 +- .../Functions/GetTransactionTypeID.sql | 6 +- .../ActivateWebsiteLogons.sql | 4 +- .../Stored Procedures/AddCustomers.sql | 28 +- .../Stored Procedures/AddStockItems.sql | 4 +- .../Stored Procedures/ChangePasswords.sql | 4 +- .../DailyProcessToCreateHistory.sql | 20 +- ...DeactivateTemporalTablesBeforeDataLoad.sql | 144 +- .../GetBogativePostalCode.sql | 10 +- .../GetBuyingGroupDomain.sql | 4 +- .../Stored Procedures/GetFicticiousName.sql | 16 +- .../GetRandomBuyingGroup.sql | 4 +- .../GetRandomBuyingGroupNotInUse.sql | 32 +- .../Stored Procedures/GetRandomCity.sql | 10 +- .../Stored Procedures/GetRandomCustomer.sql | 6 +- .../GetRandomCustomerCategory.sql | 10 +- .../GetRandomDeliveryMethod.sql | 2 +- .../GetRandomEmployeePerson.sql | 8 +- .../GetRandomPaymentDays.sql | 6 +- .../GetRandomSalesPersonID.sql | 4 +- .../GetRandomSecondaryAddress.sql | 6 +- .../GetRandomStockItemToAdjust.sql | 8 +- .../Stored Procedures/GetRandomStreet.sql | 8 +- .../Stored Procedures/GetRandomStreetName.sql | 8 +- .../GetRandomStreetSuffix.sql | 10 +- .../Stored Procedures/InvoicePickedOrders.sql | 4 +- .../Stored Procedures/MakeTemporalChanges.sql | 4 +- .../Stored Procedures/PlaceSupplierOrders.sql | 2 +- .../PopulateColdRoomTemperatures_temp.sql | 2 +- .../ProcessCustomerPayments.sql | 2 +- .../ReactivateTemporalTablesAfterDataLoad.sql | 40 +- .../RecordColdRoomTemperatures.sql | 16 +- .../Stored Procedures/UpdateCustomFields.sql | 4 +- .../Tables/ColdRoomTemperatures_temp.sql | 6 +- .../Script.PostDeployment1.sql | 44 +- .../pds100-ins-app-people.sql | 6 +- .../pds106-ins-dls-areacode.sql | 2 +- .../pds110-ins-app-countries.sql | 166 +- .../pds120-ins-app-deliverymethods.sql | 6 +- .../pds130-ins-app-paymentmethods.sql | 6 +- .../pds140-ins-app-stateprovinces.sql | 6 +- .../pds142-upd-app-stateprovinces-borders.sql | 2768 +--- .../pds150-ins-app-cities-a.sql | 24 +- .../pds150-ins-app-cities-b.sql | 882 +- .../pds150-ins-app-cities-c.sql | 1883 +-- .../pds150-ins-app-cities-d.sql | 24 +- .../pds150-ins-app-cities-e.sql | 24 +- .../pds150-ins-app-cities-f.sql | 18 +- .../pds150-ins-app-cities-g.sql | 267 +- .../pds150-ins-app-cities-h.sql | 418 +- .../pds150-ins-app-cities-i.sql | 6 +- .../pds150-ins-app-cities-j.sql | 12 +- .../pds150-ins-app-cities-k.sql | 10 +- .../pds150-ins-app-cities-l.sql | 436 +- .../pds150-ins-app-cities-m.sql | 1575 +-- .../pds150-ins-app-cities-n.sql | 10 +- .../pds150-ins-app-cities-o.sql | 8 +- .../pds150-ins-app-cities-p.sql | 628 +- .../pds150-ins-app-cities-r.sql | 16 +- .../pds150-ins-app-cities-s.sql | 2042 +-- .../pds150-ins-app-cities-t.sql | 10 +- .../pds150-ins-app-cities-u.sql | 2 +- .../pds150-ins-app-cities-v.sql | 2 +- .../pds150-ins-app-cities-w.sql | 483 +- .../pds150-ins-app-cities-y.sql | 2 +- .../pds150-ins-app-cities.sql | 854 +- .../pds151-ins-post-app-cities.sql | 6 +- .../pds160-ins-app-transactiontypes.sql | 6 +- ...s170-ins-purchasing-suppliercategories.sql | 6 +- .../pds180-ins-sales-groups-categories.sql | 12 +- .../pds190-ins-warehouse-colors.sql | 6 +- .../pds200-ins-warehouse-packagetypes.sql | 6 +- .../pds210-ins-warehouse-stockgroups.sql | 6 +- .../pds220-ins-purchasing-suppliers.sql | 64 +- .../pds230-ins-sales-customers.sql | 188 +- .../pds240-ins-warehouse-stockitems.sql | 6 +- ...pds250-ins-warehouse-stockitemholdings.sql | 6 +- .../pds270-ins-app-systemparameters.sql | 16 +- .../Stored Procedures/ReseedAllSequences.sql | 4 +- .../ReseedSequenceBeyondTableValues.sql | 8 +- .../Stored Procedures/SearchForStockItems.sql | 2 +- .../UpdateBuyingGroupFromJson.sql | 2 +- .../Stored Procedures/UpdateCityFromJson.sql | 2 +- .../Stored Procedures/UpdateColorFromJson.sql | 2 +- .../UpdateCountryFromJson.sql | 2 +- .../UpdateCustomerCategoryFromJson.sql | 2 +- .../UpdateCustomerFromJson.sql | 2 +- .../UpdateCustomerTransactionFromJson.sql | 2 +- .../UpdateDeliveryMethodFromJson.sql | 2 +- .../UpdateInvoiceFromJson.sql | 2 +- .../UpdatePackageTypeFromJson.sql | 2 +- .../UpdatePaymentMethodFromJson.sql | 2 +- .../UpdatePurchaseOrderFromJson.sql | 2 +- .../UpdateSalesOrderFromJson.sql | 2 +- .../UpdateSpecialDealFromJson.sql | 2 +- .../UpdateStateProvinceFromJson.sql | 2 +- .../UpdateStockGroupFromJson.sql | 2 +- .../UpdateStockItemFromJson.sql | 2 +- .../UpdateSupplierCategoryFromJson.sql | 2 +- .../UpdateSupplierFromJson.sql | 2 +- .../UpdateSupplierTransactionFromJson.sql | 2 +- .../UpdateTransactionTypeFromJson.sql | 2 +- .../wwi-ssdt/wwi-ssdt/WebApi/Views/Cities.sql | 4 +- .../wwi-ssdt/WebApi/Views/Invoices.sql | 6 +- .../WebApi/Views/PurchaseOrderLines.sql | 2 +- .../wwi-ssdt/WebApi/Views/PurchaseOrders.sql | 2 +- .../wwi-ssdt/WebApi/Views/SalesOrders.sql | 4 +- .../wwi-ssdt/WebApi/Views/SpecialDeals.sql | 2 +- .../wwi-ssdt/WebApi/Views/StateProvinces.sql | 4 +- .../wwi-ssdt/WebApi/Views/StockItems.sql | 2 +- .../WebApi/Views/SupplierTransactions.sql | 2 +- .../wwi-ssdt/WebApi/Views/Suppliers.sql | 2 +- .../wwi-ssdt/dbo/Tables/SampleVersion.sql | 2 +- .../wwi-ssis/wwi-ssis/DailyETLMain.dtsx | 6261 +-------- .../Live Query Stats - Activity Monitor.sql | 92 +- .../LQS/Live Query Stats - Own Session.sql | 92 +- samples/demos/LQS/README.md | 2 +- .../Inside-Query-Store/README.md | 4 +- .../demos/Plan-Comparison/Offline/README.md | 6 +- samples/demos/README.md | 2 +- samples/demos/SQLDW/free-trial-lab/CTAS.sql | 14 +- samples/demos/SQLDW/free-trial-lab/README.md | 2 +- .../free-trial-lab/create-external-ds.sql | 6 +- .../create-external-file-format.sql | 6 +- .../free-trial-lab/create-external-tables.sql | 216 +- samples/demos/Showplan/HashWarning.sql | 14 +- .../Showplan/MemoryGrant_Warning_Setup.sql | 2 +- samples/demos/Showplan/README.md | 2 +- samples/demos/Showplan/SortWarning.sql | 4 +- .../DemoWorkload/DemoWorkload.csproj | 2 +- .../DemoWorkload/FrmConfig.Designer.cs | 64 +- .../DemoWorkload/FrmConfig.resx | 54 +- .../DemoWorkload/FrmMain.Designer.cs | 104 +- .../automatic-tuning/DemoWorkload/FrmMain.cs | 114 +- .../DemoWorkload/FrmMain.resx | 54 +- .../DemoWorkload/GlobalSuppressions.cs | Bin 1474 -> 1466 bytes .../DemoWorkload/Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.Designer.cs | 20 +- .../DemoWorkload/Properties/Resources.resx | 54 +- .../Properties/Settings.Designer.cs | 8 +- samples/demos/automatic-tuning/README.md | 2 +- .../Wind Turbine Demo/README.md | 46 +- .../SensorModule/DataStructures/RingBuffer.cs | 24 +- .../SensorModule/Helpers/GeneratorHelper.cs | 6 +- .../modules/SensorModule/SensorModule.csproj | 2 +- .../Services/DataGeneratorService.cs | 2 +- .../Wind Turbine Demo/ml/scripts/train.py | 2 +- .../Wind Turbine Demo/ml/scripts/utils.py | 2 +- .../src/components/Layout/Layout.scss | 2 +- .../ClientApp/src/pages/Alerts/Alerts.scss | 4 +- .../ClientApp/src/pages/Alerts/index.js | 4 +- .../ClientApp/src/pages/Home/README.md | 4 +- .../pages/Home/components/Turbine/index.js | 2 +- .../ClientApp/src/pages/Home/index.js | 2 +- samples/demos/azure-sql-edge-demos/readme.md | 2 +- .../Controllers/ProductCatalogController.cs | 2 +- .../Controllers/ProductController.cs | 2 +- .../belgrade-product-catalog-demo/README.md | 8 +- .../belgrade-product-catalog-demo/Startup.cs | 6 +- .../Views/Shared/_Layout.cshtml | 2 +- .../belgrade-product-catalog-demo/nlog.config | 2 +- .../sql-scripts/1 setup.sql | 8 +- .../sql-scripts/2 json.sql | 10 +- .../sql-scripts/3 setup-temporal.sql | 8 +- .../sql-scripts/4 temporal.sql | 6 +- .../sql-scripts/6 rls.sql | 4 +- .../sql-scripts/7. xtp.sql | 2 +- .../sql-scripts/8. bcp.sql | 8 +- .../sql-scripts/A1 fraud-detection.sql | 4 +- .../sql-scripts/A2 compare-products.sql | 2 +- .../A3 setup-temporal-3-part-name.sql | 8 +- .../sql-scripts/bcp.tt | 12 +- .../wwwroot/dashboard.html | 2 +- .../wwwroot/index.html | 6 +- .../wwwroot/media/js/dashboard.js | 2 +- .../media/js/lib/jquery.html-template.js | 18 +- .../wwwroot/media/js/products-crud.js | 4 +- .../wwwroot/media/js/products-temporal.js | 4 +- .../wwwroot/media/js/rls.js | 2 +- .../wwwroot/temporal.html | 6 +- .../rowstore_vs_columnstore_perf_demo.sql | 8 +- samples/demos/ivs-people-register/README.md | 14 +- .../sql-scripts/1 setup.sql | 2 +- .../ivs-people-register/wwwroot/client.html | 12 +- .../js/lib/simple_incremental_bootstrap.js | 36 +- .../ivs-people-register/wwwroot/server.html | 16 +- .../demos/query-tuning-assistant/README.md | 4 +- ...o1-create-and-populate-nodes-and-edges.sql | 4 +- ...o3-create-and-populate-nodes-and-edges.sql | 2 +- .../demo3-recommendation-system-for-sales.sql | 2 +- samples/demos/xEvents/HashWarning.sql | 18 +- samples/demos/xEvents/MemoryGrant_XE.sql | 2 +- .../demos/xEvents/MemoryGrant_XE_Setup.sql | 2 +- samples/demos/xEvents/PerfStats_XE_Demo.sql | 4 +- samples/demos/xEvents/README.md | 2 +- samples/demos/xEvents/SortWarning.sql | 8 +- .../SqlServerOnDocker/README.md | 2 +- .../development-frameworks/django/README.md | 2 +- .../bootcamp/articles/static/css/articles.css | 4 +- .../articles/partial_article_comment.html | 2 +- .../django/bootcamp/core/static/js/picture.js | 2 +- .../bootcamp/feeds/static/css/feeds.css | 4 +- .../django/bootcamp/feeds/static/js/feeds.js | 4 +- .../bootcamp/feeds/templates/feeds/feeds.html | 2 +- .../messenger/static/css/messages.css | 4 +- .../messenger/static/js/messages.typehead.js | 2 +- .../includes/partial_conversations.html | 2 +- .../questions/static/css/questions.css | 4 +- .../bootcamp/search/static/css/search.css | 8 +- .../development-frameworks/laravel/README.md | 2 +- .../vendor/composer/autoload_static.php | 112 +- .../Doctrine/Common/Inflector/Inflector.php | 4 +- .../doctrine/inflector/phpunit.xml.dist | 2 +- .../Tests/Common/Inflector/InflectorTest.php | 40 +- .../doctrine/instantiator/CONTRIBUTING.md | 2 +- .../faker/src/Faker/Provider/Biased.php | 2 +- .../faker/src/Faker/Provider/Internet.php | 8 +- .../faker/src/Faker/Provider/UserAgent.php | 4 +- .../src/Faker/Provider/en_UG/Address.php | 2 +- .../faker/src/Faker/Provider/hu_HU/Text.php | 877 +- .../faker/src/Faker/Provider/no_NO/Person.php | 12 +- .../faker/test/Faker/Provider/BiasedTest.php | 10 +- .../test/Faker/Provider/InternetTest.php | 4 +- .../html/src/HtmlBuilder.php | 4 +- .../vendor/league/flysystem/src/Handler.php | 2 +- .../vendor/mockery/mockery/CONTRIBUTING.md | 2 +- .../mockery/library/Mockery/MockInterface.php | 2 +- .../library/Mockery/ReceivedMethodCalls.php | 2 +- .../mockery/tests/Mockery/ExpectationTest.php | 2 +- .../mtdowling/cron-expression/CHANGELOG.md | 2 +- .../src/Cron/CronExpression.php | 2 +- .../lib/PhpParser/BuilderFactory.php | 2 +- .../lib/PhpParser/Node/FunctionLike.php | 2 +- .../paragonie/random_compat/CHANGELOG.md | 52 +- .../vendor/paragonie/random_compat/ERRATA.md | 4 +- .../vendor/paragonie/random_compat/README.md | 16 +- .../paragonie/random_compat/SECURITY.md | 20 +- .../random_compat/lib/cast_to_int.php | 10 +- .../random_compat/lib/error_polyfill.php | 16 +- .../lib/random_bytes_com_dotnet.php | 20 +- .../lib/random_bytes_dev_urandom.php | 32 +- .../lib/random_bytes_libsodium.php | 12 +- .../lib/random_bytes_libsodium_legacy.php | 12 +- .../random_compat/lib/random_bytes_mcrypt.php | 20 +- .../lib/random_bytes_openssl.php | 24 +- .../random_compat/lib/random_int.php | 40 +- .../random_compat/other/build_phar.php | 10 +- .../src/phpDocumentor/Reflection/DocBlock.php | 8 +- .../Reflection/DocBlock/Context.php | 36 +- .../Reflection/DocBlock/Location.php | 6 +- .../Reflection/DocBlock/Serializer.php | 30 +- .../phpDocumentor/Reflection/DocBlock/Tag.php | 34 +- .../Reflection/DocBlock/Tag/AuthorTag.php | 18 +- .../Reflection/DocBlock/Tag/ExampleTag.php | 16 +- .../Reflection/DocBlock/Tag/MethodTag.php | 12 +- .../Reflection/DocBlock/Tag/ReturnTag.php | 4 +- .../Reflection/DocBlock/Tag/SeeTag.php | 4 +- .../Reflection/DocBlock/Tag/SourceTag.php | 10 +- .../Reflection/DocBlock/Tag/VersionTag.php | 8 +- .../Reflection/DocBlock/Type/Collection.php | 4 +- .../Reflection/DocBlock/Tag/CoversTagTest.php | 2 +- .../DocBlock/Tag/DeprecatedTagTest.php | 2 +- .../DocBlock/Tag/ExampleTagTest.php | 2 +- .../Reflection/DocBlock/Tag/LinkTagTest.php | 2 +- .../Reflection/DocBlock/Tag/MethodTagTest.php | 4 +- .../Reflection/DocBlock/Tag/ParamTagTest.php | 2 +- .../Reflection/DocBlock/Tag/ReturnTagTest.php | 2 +- .../Reflection/DocBlock/Tag/SeeTagTest.php | 2 +- .../Reflection/DocBlock/Tag/SinceTagTest.php | 2 +- .../Reflection/DocBlock/Tag/SourceTagTest.php | 2 +- .../Reflection/DocBlock/Tag/ThrowsTagTest.php | 2 +- .../Reflection/DocBlock/Tag/UsesTagTest.php | 2 +- .../Reflection/DocBlock/Tag/VarTagTest.php | 2 +- .../DocBlock/Tag/VersionTagTest.php | 2 +- .../Reflection/DocBlock/TagTest.php | 22 +- .../DocBlock/Type/CollectionTest.php | 18 +- .../phpDocumentor/Reflection/DocBlockTest.php | 22 +- .../laravel/vendor/phpspec/php-diff/README | 28 +- .../vendor/phpspec/php-diff/lib/Diff.php | 30 +- .../php-diff/lib/Diff/Renderer/Abstract.php | 30 +- .../php-diff/lib/Diff/Renderer/Html/Array.php | 30 +- .../lib/Diff/Renderer/Html/Inline.php | 30 +- .../lib/Diff/Renderer/Html/SideBySide.php | 30 +- .../lib/Diff/Renderer/Text/Context.php | 30 +- .../lib/Diff/Renderer/Text/Unified.php | 30 +- .../laravel/vendor/phpspec/phpspec/CHANGES.md | 4 +- .../laravel/vendor/phpspec/phpspec/README.rst | 2 +- ...veloper_chooses_no_code_generation.feature | 6 +- .../spec/PhpSpec/Util/MethodAnalyserSpec.php | 2 +- .../Template/ReportSpecificationEnds.html | 2 +- .../Html/Template/ReportSummary.html | 2 +- .../src/PhpSpec/Locator/PSR0/PSR0Locator.php | 2 +- .../Doubler/Generator/Node/MethodNodeSpec.php | 2 +- .../phpunit-mock-objects/CONTRIBUTING.md | 2 +- .../vendor/phpunit/phpunit/ChangeLog-4.1.md | 2 +- .../vendor/phpunit/phpunit/ChangeLog-4.3.md | 2 +- .../laravel/vendor/psr/log/LICENSE | 10 +- .../psr/log/Psr/Log/LoggerAwareTrait.php | 2 +- .../vendor/psr/log/Psr/Log/LoggerTrait.php | 4 +- .../laravel/vendor/psy/psysh/README.md | 2 +- .../tests/acceptance.conf.php.default | 2 +- .../Style/SymfonyStyle/output/output_0.txt | 2 +- .../Style/SymfonyStyle/output/output_1.txt | 2 +- .../Style/SymfonyStyle/output/output_2.txt | 12 +- .../Style/SymfonyStyle/output/output_6.txt | 2 +- .../console/Tests/Fixtures/application_1.xml | 22 +- .../console/Tests/Fixtures/application_2.xml | 22 +- .../Tests/Fixtures/application_asxml1.txt | 22 +- .../Fixtures/application_renderexception1.txt | 8 +- .../Fixtures/application_renderexception2.txt | 8 +- .../Fixtures/application_renderexception3.txt | 24 +- .../Fixtures/application_renderexception4.txt | 10 +- ...plication_renderexception_doublewidth1.txt | 8 +- ...plication_renderexception_doublewidth2.txt | 10 +- .../Tests/Fixtures/application_run2.txt | 8 +- .../Tests/Fixtures/application_run3.txt | 14 +- .../console/Tests/Fixtures/command_2.txt | 4 +- .../Tests/Fixtures/input_definition_4.txt | 2 +- .../Tests/Helper/LegacyTableHelperTest.php | 26 +- .../console/Tests/Helper/TableTest.php | 26 +- .../dic/xliff-core/xliff-core-1.2-strict.xsd | 6 +- .../Loader/schema/dic/xliff-core/xml.xsd | 56 +- .../var-dumper/Tests/VarClonerTest.php | 8 +- .../yaml/Tests/Fixtures/sfComments.yml | 2 +- .../symfony/yaml/Tests/Fixtures/sfTests.yml | 4 +- .../DemoWorkload/DemoWorkload.csproj | 2 +- .../DemoWorkload/FrmConfig.Designer.cs | 64 +- .../DemoWorkload/FrmConfig.resx | 54 +- .../DemoWorkload/FrmMain.Designer.cs | 104 +- .../DemoWorkload/FrmMain.cs | 114 +- .../DemoWorkload/FrmMain.resx | 54 +- .../DemoWorkload/GlobalSuppressions.cs | Bin 1474 -> 1466 bytes .../DemoWorkload/Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.Designer.cs | 20 +- .../DemoWorkload/Properties/Resources.resx | 54 +- .../Properties/Settings.Designer.cs | 8 +- .../force-last-good-plan-2/README.md | 2 +- .../Controllers/DemoController.cs | 4 +- .../force-last-good-plan/README.md | 2 +- .../force-last-good-plan/Startup.cs | 2 +- .../sql-scripts/demo-full.sql | 2 +- .../sql-scripts/init-blank-db.sql | 8 +- .../sql-scripts/init-wwi-db.sql | 2 +- .../cleanup-controller-new.sh | 4 +- .../cleanup-controller.sh | 4 +- .../setup-controller-new.sh | 16 +- .../ubuntu-single-node-vm/setup-controller.sh | 14 +- .../ubuntu/local-storage-provisioner.yaml | 18 +- .../in-memory-columnstore/hk_cs_dmvs.sql | 28 +- .../in-memory-columnstore/hk_memory_dmvs.sql | 28 +- .../in-memory-columnstore/hkcs-demo.sql | 18 +- .../compression-delay-setup.sql | 10 +- .../nonclustered-columnstore/ncci_demo.sql | 46 +- .../PowerShell Script/DMA_Processor_V5.0.ps1 | 220 +- .../PowerShell Script/README.md | 2 +- .../EPM_Create_Database_Objects.sql | 132 +- .../EPM_EnterpriseEvaluation_3.0.0.ps1 | 28 +- .../PolicyReports/PolicyDashboard.rdl | 26 +- .../PolicyReports/PolicyDetails.rdl | 2 +- .../EPM_Create_Database_Objects.sql | 76 +- .../EPM_Upgrade_Database_Objects.sql | 52 +- .../EPM_EnterpriseEvaluation_4.ps1 | 26 +- .../PolicyReports/PolicyDashboard.rdl | 34 +- .../PolicyReports/PolicyDetails.rdl | 2 +- .../PolicyReports/ReportHistory.rsd | 8 +- .../PBM_Fix_ImportedPolicies.sql | 14 +- samples/features/epm-framework/4.0/README.md | 18 +- .../EPM_Create_Database_Objects.sql | 84 +- .../EPM_Upgrade_Database_Objects.sql | 52 +- .../EPM_EnterpriseEvaluation_5.ps1 | 28 +- .../PolicyReports/PolicyDashboard.rdl | 34 +- .../PolicyReports/PolicyDashboardFiltered.rdl | 60 +- .../PolicyReports/PolicyDetails.rdl | 2 +- .../PolicyReports/ReportHistory.rsd | 8 +- .../PBM_Fix_ImportedPolicies.sql | 14 +- .../SQL Policy Management - Name Pattern.sql | 82 +- samples/features/epm-framework/5.0/README.md | 18 +- samples/features/epm-framework/README.md | 6 +- .../DefaultTemplate.11.1.xaml | 2 +- .../LabDefaultTemplate.11.xaml | 10 +- .../1_PBM_CustomPolicies.sql | 6 +- .../2_PBM_Fix_ImportedPolicies.sql | 14 +- .../policy-customizations/4_PBM_Jobs.sql | 750 +- .../sample-deployment-script/README.md | 6 +- .../sample-deployment-script/deploy-ag.py | 2 +- .../templates/ag-service.yaml | 4 +- .../templates/failover.yaml | 8 +- .../templates/operator.yaml | 2 +- .../templates/pv.yaml | 4 +- .../templates/pvc.yaml | 2 +- .../templates/sql-secrets.yaml | 2 +- .../templates/sqlserver.yaml | 2 +- .../sample-manifest-files/rotate-creds.yaml | 4 +- .../Tutorial for vmware fencing agent.md | 2 +- .../Cluster Configuration/STONITH/readme.md | 2 +- samples/features/high availability/readme.md | 2 +- .../benchmark-order-processing/README.md | 4 +- .../Disk-Based/Create_Database_DiskBased.sql | 2 +- .../Disk-Based/Create_Indexes_DiskBased.sql | 6 +- .../In-Memory/Create_Database_InMem.sql | 2 +- .../In-Memory/Create_Tables_InMem.sql | 2 +- .../DiskBased_StoredProcedures.sql | 18 +- .../InMem_StoredProcedures.sql | 20 +- .../in-memory-oltp/t-sql-scripts/README.md | 2 +- .../clustered_columnstore_sample_queries.sql | 26 +- .../t-sql-scripts/enable-in-memory-oltp.sql | 28 +- .../sql_in-memory_analytics_sample.sql | 40 +- .../sql_in-memory_oltp_sample.sql | 98 +- .../DemoWorkload/DemoWorkload.csproj | 2 +- .../DemoWorkload/FrmConfig.Designer.cs | 72 +- .../DemoWorkload/FrmConfig.resx | 54 +- .../DemoWorkload/FrmMain.Designer.cs | 104 +- .../DemoWorkload/FrmMain.cs | 104 +- .../DemoWorkload/FrmMain.resx | 54 +- .../DemoWorkload/Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.Designer.cs | 20 +- .../DemoWorkload/Properties/Resources.resx | 54 +- .../Properties/Settings.Designer.cs | 8 +- .../DemoWorkload/UIControls.cs | 26 +- .../BatchInsertReservations.sql | 2 +- .../InsertReservationDetails.sql | 4 +- .../ReadMultipleReservations.sql | 2 +- .../wwi-sales-orders/App.config | 4 +- .../DataGenerator/DataGenerator.csproj | 2 +- .../DataGenerator/Properties/AssemblyInfo.cs | 10 +- .../DataGenerator/SqlDataGenerator.cs | 52 +- .../in-memory-oltp/wwi-sales-orders/README.md | 2 +- .../WinFormsClient/FrmMain.Designer.cs | 68 +- .../WinFormsClient/FrmMain.cs | 42 +- .../WinFormsClient/FrmMain.resx | 54 +- .../WinFormsClient/Properties/AssemblyInfo.cs | 10 +- .../Properties/Resources.Designer.cs | 14 +- .../WinFormsClient/Properties/Resources.resx | 54 +- .../WinFormsClient/WinFormsClient.csproj | 2 +- .../scripts/CustomerOrders.sql | Bin 24694 -> 24366 bytes .../00a-AdventureWorks_Setup.sql | 6 +- .../01b-Create_EmployeeBirthdayList.sql | 2 +- ...bject info from page resource sql 2019.sql | 20 +- .../IQP Demo - APPROX_COUNT_DISTINCT.sql | 2 +- .../IQP Demo - Batch Mode Adaptive Join.sql | 22 +- .../IQP Demo - Batch Mode MGF.sql | 10 +- .../IQP Demo - Batch Mode on Rowstore.sql | 2 +- .../IQP Demo - Interleaved Execution.sql | 20 +- .../IQP Demo - Row Mode MGF.sql | 10 +- .../IQP Demo - Scalar UDF Inlining.sql | 10 +- .../IQP Demo - TVDC.sql | 6 +- ...Setup - Enlarging WideWorldImportersDW.sql | 10 +- .../intelligent-query-processing/readme.md | 12 +- .../Controllers/ProductController.cs | 10 +- samples/features/json/Dapper-Orm/README.md | 8 +- .../json/Dapper-Orm/sql-scripts/setup.sql | 6 +- .../json/Dapper-Orm/wwwroot/index.html | 20 +- .../wwwroot/media/js/jquery.view-engine.js | 22 +- .../Dapper-Orm/wwwroot/media/js/products.js | 6 +- .../json/Dapper-Orm/wwwroot/report.html | 2 +- .../Controllers/BlogsController.cs | 2 +- .../features/json/Entity-Framework/README.md | 8 +- .../Entity-Framework/Views/Blogs/Index.cshtml | 2 +- .../Entity-Framework/sql-scripts/setup.sql | 6 +- .../Controllers/HeroController.cs | 2 +- .../angularjs/dotnet-tour-of-heroes/README.md | 12 +- .../dotnet-tour-of-heroes/Startup.cs | 4 +- .../sql-scripts/setup.sql | 4 +- .../json/azure-function-odata/README.md | 8 +- .../azure-function/run.csx | 2 +- .../json/azure-function-rest-api/README.md | 8 +- .../azure-function/run.csx | 4 +- .../features/json/code-generator/README.md | 28 +- .../code-generator/generate-json-crud.sql | 56 +- .../dotnet-states-openlayers2/README.md | 12 +- .../sql-scripts/setup.sql | 4 +- .../wwwroot/index.html | 24 +- .../wwwroot/media/style.css | 2 +- .../wwwroot/media/theme/default/google.css | 4 +- .../Controllers/ProductController.cs | 6 +- .../dotnet-jquery-bootstrap-app/README.md | 6 +- .../dotnet-jquery-bootstrap-app/project.json | 2 +- .../sql-scripts/demo.sql | 8 +- .../sql-scripts/setup.sql | 6 +- .../wwwroot/dashboard.html | 2 +- .../wwwroot/index.html | 20 +- .../wwwroot/media/js/jquery.html-template.js | 14 +- .../wwwroot/media/js/products.js | 6 +- .../Controllers/ProductController.cs | 6 +- .../product-catalog/dotnet-rest-api/README.md | 6 +- .../dotnet-rest-api/project.json | 2 +- .../dotnet-rest-api/sql-scripts/demo.sql | 6 +- .../dotnet-rest-api/sql-scripts/setup.sql | 6 +- .../nodejs-jquery-bootstrap-app/README.md | 6 +- .../routes/products.js | 2 +- .../sql-scripts/demo.sql | 8 +- .../sql-scripts/setup.sql | 6 +- .../wwwroot/index.html | 20 +- .../wwwroot/media/js/d3/calendar.js | 2 +- .../wwwroot/media/js/d3/calendar2.js | 28 +- .../wwwroot/media/js/jquery.html-template.js | 14 +- .../wwwroot/media/js/products.js | 6 +- .../wwwroot/media/js/qunit.js | 1832 +-- .../wwwroot/test.html | 8 +- .../Controllers/commentsController.cs | 2 +- .../reactjs/dotnet-comments-app/README.md | 6 +- .../reactjs/dotnet-comments-app/Startup.cs | 2 +- .../sql-scripts/setup.login.sql | 2 +- .../json/reactjs/nodejs-comments-app/db.js | 20 +- .../nodejs-comments-app/routes/comments.js | 10 +- .../nodejs-comments-app/setup/setup.login.sql | 2 +- .../json/scripts/channel9-json-intro.sql | 10 +- .../Controllers/TodoController.cs | 2 +- .../dotnet-rest-api/Project_Readme.html | 4 +- .../json/todo-app/dotnet-rest-api/README.md | 2 +- .../nodejs-express4-rest-api/README.md | 2 +- .../todo-app/nodejs-express4-rest-api/app.js | 2 +- .../nodejs-express4-rest-api/routes/todo.js | 8 +- .../nodejs-express4-rest-api/setup/setup.sql | 2 +- .../bike-sharing prediction/README.md | 8 +- .../bike-sharing prediction/datasource.py | 12 +- .../bike-sharing prediction/pipeline.py | 74 +- .../bike-sharing prediction/runner.py | 24 +- .../customer_clustering.py | 2 +- .../customer_clustering.sql | 8 +- .../rental-prediction/README.md | 12 +- .../pretrainedmodel_sentiment_analysis.sql | 12 +- ...ew-pretrained-model-sentiment-analysis.sql | 6 +- .../product-review-text-classification.sql | 34 +- .../r/iris/2-R-iris-score.sql | 2 +- .../ML Services - Configuration.rdl | 2 +- .../ML Services - Extended Events.rdl | 10 +- .../ssms-custom-reports/README.md | 10 +- .../features/master-data-services/README.md | 2 +- .../business-rules/Program.cs | 28 +- .../business-rules/Properties/AssemblyInfo.cs | 10 +- .../business-rules/README.md | 10 +- .../entity-based-staging/Program.cs | 24 +- .../Properties/AssemblyInfo.cs | 10 +- .../entity-based-staging/README.md | 20 +- .../master-data/Program.cs | 32 +- .../master-data/Properties/AssemblyInfo.cs | 10 +- .../master-data/README.md | 12 +- .../master-data-services/metadata/Program.cs | 16 +- .../metadata/Properties/AssemblyInfo.cs | 10 +- .../master-data-services/metadata/README.md | 12 +- .../metadata/Reference.cs | 11065 ++-------------- .../model-deployment/ModelDUtil.csproj | 2 +- .../model-deployment/Program.cs | 20 +- .../Properties/AssemblyInfo.cs | 6 +- .../master-data-services/security/Program.cs | 38 +- .../security/Properties/AssemblyInfo.cs | 10 +- .../master-data-services/security/README.md | 20 +- .../workflow/Properties/AssemblyInfo.cs | 10 +- .../master-data-services/workflow/README.md | 10 +- .../workflow/SharePointWorkflowExtender.cs | 6 +- .../optimize-for-sequential-key/README.md | 2 +- .../optimize-for-sequential-key/Setup.sql | 8 +- .../query-store/Auto-Param Analysis.sql | 26 +- .../query-store/NewDatabaseSettings.sql | Bin 670 -> 658 bytes samples/features/query-store/README.md | 8 +- samples/features/query-store/ShowBasics.sql | 16 +- .../query-store/query_store_hints_demo.sql | 10 +- .../sp_GetCompilAndExecutionTotalTime.sql | 10 +- .../query-store/vw_QueryStoreCompileInfo.sql | 4 +- .../query-store/vw_QueryStoreRuntimeInfo.sql | 4 +- .../Retail Precision Marketing/Data/README.md | 2 +- .../R/CRMonCDNOWInMemory.R | 26 +- .../R/CRMonCDNOWInSql.R | 28 +- .../R/RFM_Analysis_R_Source_Codes_V1.3.R | 4 +- .../Retail Precision Marketing/README.md | 14 +- .../SQL/crm_demo.sql | 98 +- .../customer-clustering/Customer Clustering.R | 10 +- .../Customer Clustering.sql | 10 +- .../customer-clustering/README.md | 4 +- .../predictive-modeling/README.md | 2 +- .../rental-prediction/Predictive Model.R | 2 +- .../rental-prediction/Predictive Model.sql | 20 +- .../rental-prediction/README.md | 12 +- .../nodejs-get predictions app/db.js | 16 +- .../routes/predictions.js | 4 +- .../wwwroot/client.html | 20 +- ...query.dataTables.incremental_pagination.js | 12 +- .../1 - Create Database.sql | 118 +- .../loan-classification/2 - ImportCSVData.ps1 | 8 +- .../3 - Create Columnstore Index.sql | 2 +- .../loan-classification/4 - Create Model.sql | 8 +- .../5 - Resource Governor Config.sql | 6 +- .../loan-classification/6 - Score Loans.ps1 | 4 +- .../loan-classification/7 - WhatIf.ps1 | 6 +- .../r-services/loan-classification/README.md | 2 +- .../r-services/predictive-analytics/Readme.md | 24 +- .../scripts/Create Procedure PredictTip.sql | Bin 2512 -> 2502 bytes ...eate Procedure TrainTipPredictionModel.sql | 40 +- .../scripts/EndToEndRScript.r | 4 +- .../predictive-analytics/scripts/Lab.md | 148 +- .../scripts/TipPredictor.js | 2 +- .../R Services - Configuration.rdl | 6 +- .../R Services - Extended Events.rdl | 10 +- .../r-services/ssms-custom-reports/README.md | 10 +- .../telco-customer-churn-v1/R/README.md | 4 +- .../R/telcoChurn-dataExploration.R | 10 +- .../R/telcoChurn-dataPreparation.R | 16 +- .../R/telcoChurn-evaluate.R | 6 +- .../R/telcoChurn-main.R | 8 +- .../R/telcoChurn-modelComparison.R | 8 +- .../telco-customer-churn-v1/README.md | 18 +- .../telco-customer-churn-v1/SQL/README.md | 2 +- .../SQL/telcoChurn-operationalize.sql | 18 +- .../telco-customer-churn/R/README.md | 4 +- .../R/TelcoChurn-DataExploration.r | 6 +- .../R/TelcoChurn-DataPreparation.r | 4 +- .../R/TelcoChurn-ModelBuilding.r | 6 +- .../r-services/telco-customer-churn/README.md | 12 +- ...run and Installing required R Packages.sql | 32 +- .../telco-customer-churn/SQL Server/README.md | 2 +- .../SQL Server/TelcoChurn-Operationalize.sql | 42 +- .../ssrs-migration-rss/readme.md | 6 +- .../ssrs-migration-rss/ssrs_migration.rss | 18 +- samples/features/security/README.md | 4 +- .../azure-sql-database-sgx/README.md | 8 +- .../setup/AttestationPolicy.txt | 4 +- .../setup/CreateXESession.sql | 4 +- .../setup/PopulateDatabase.sql | 6 +- .../setup/azuredeploy.bicep | 18 +- .../azure-sql-database-sgx/setup/setup.ps1 | 8 +- .../tsql-scripts/EncryptColumns.sql | 2 +- .../tsql-scripts/QueryColumns.sql | 2 +- .../tsql-scripts/QueryXevents.sql | 14 +- .../azure-sql-database-vbs/README.md | 6 +- .../setup/CreateXESession.sql | 4 +- .../setup/PopulateDatabase.sql | 6 +- .../setup/azuredeploy.bicep | 18 +- .../azure-sql-database-vbs/setup/setup.ps1 | 6 +- .../tsql-scripts/EncryptColumns.sql | 2 +- .../tsql-scripts/QueryColumns.sql | 2 +- .../tsql-scripts/QueryXevents.sql | 14 +- .../ContosoHR/Pages/Employees/Delete.cshtml | 2 +- .../source/ContosoHR/Startup.cs | 4 +- .../lib/datatables/js/dataTables.bootstrap.js | 2 +- .../datatables/js/dataTables.bootstrap4.js | 2 +- .../lib/datatables/js/dataTables.material.js | 2 +- .../datatables/js/dataTables.semanticui.js | 2 +- .../lib/datatables/js/dataTables.uikit.js | 2 +- .../lib/datatables/js/jquery.dataTables.js | 6119 +-------- .../jquery.validate.unobtrusive.js | 2 +- .../sql-server-with-hgs/README.md | 12 +- .../tsql-scripts/CreateXESession.sql | 8 +- .../tsql-scripts/EncryptColumns.sql | 2 +- .../tsql-scripts/QueryColumns.sql | 2 +- .../sql-server-without-attestation/README.md | 14 +- .../tsql-scripts/CreateXESession.sql | 8 +- .../tsql-scripts/EncryptColumns.sql | 2 +- .../tsql-scripts/QueryColumns.sql | 2 +- .../ContosoClinic/App_Start/IdentityConfig.cs | 4 +- .../ContosoClinic/App_Start/Startup.Auth.cs | 4 +- .../src/ContosoClinic/Content/Site.css | 4 +- .../Controllers/AccountController.cs | 14 +- .../Controllers/ManageController.cs | 6 +- .../Controllers/PatientsController.cs | 8 +- .../Controllers/VisitsController.cs | 4 +- .../201602170540262_Initial.Designer.cs | 8 +- .../Migrations/201602170540262_Initial.cs | 16 +- .../Migrations/201602170540262_Initial.resx | 54 +- .../201602170605457_Visits.Designer.cs | 8 +- .../Migrations/201602170605457_Visits.cs | 6 +- .../Migrations/201602170605457_Visits.resx | 54 +- .../201602170720063_Nullability.Designer.cs | 8 +- .../Migrations/201602170720063_Nullability.cs | 4 +- .../201602170720063_Nullability.resx | 54 +- .../201602170857179_Assignments.Designer.cs | 8 +- .../Migrations/201602170857179_Assignments.cs | 6 +- .../201602170857179_Assignments.resx | 54 +- .../ContosoClinic/Migrations/Configuration.cs | 8 +- .../Scripts/jquery.validate-vsdoc.js | 22 +- .../src/ContosoClinic/Scripts/respond.js | 30 +- .../ContosoClinic/Views/Manage/Index.cshtml | 6 +- .../Views/Patients/Create.cshtml | 4 +- .../ContosoClinic/Views/Patients/Edit.cshtml | 2 +- .../ContosoClinic/Views/Visits/Create.cshtml | 4 +- .../ContosoClinic/Views/Visits/Edit.cshtml | 2 +- .../src/ContosoClinic/Web.config | 2 +- .../tsql-scripts/CreateXESession.sql | 8 +- .../tsql-scripts/QueryColumns.sql | 2 +- .../integrated/App.config | 2 +- .../integrated/Integrated.csproj | 2 +- .../integrated/Properties/AssemblyInfo.cs | 10 +- .../integrated/README.md | 2 +- .../password/App.config | 2 +- .../password/Password.csproj | 2 +- .../password/Properties/AssemblyInfo.cs | 10 +- .../password/README.md | 2 +- .../azure-active-directory-auth/readme.md | 26 +- .../token/Properties/AssemblyInfo.cs | 10 +- .../token/README.md | 46 +- .../token/Token.csproj | 2 +- .../security/contoso-clinic/.gitignore | 2 +- .../security/contoso-clinic/README.md | 122 +- .../setup/Create-Application-Login.sql | 8 +- .../ContosoClinic/App_Start/IdentityConfig.cs | 4 +- .../ContosoClinic/App_Start/Startup.Auth.cs | 4 +- .../src/ContosoClinic/Content/Site.css | 4 +- .../Controllers/AccountController.cs | 14 +- .../Controllers/ManageController.cs | 6 +- .../Controllers/PatientsController.cs | 4 +- .../Controllers/VisitsController.cs | 4 +- .../201602170540262_Initial.Designer.cs | 8 +- .../Migrations/201602170540262_Initial.cs | 16 +- .../Migrations/201602170540262_Initial.resx | 54 +- .../201602170605457_Visits.Designer.cs | 8 +- .../Migrations/201602170605457_Visits.cs | 6 +- .../Migrations/201602170605457_Visits.resx | 54 +- .../201602170720063_Nullability.Designer.cs | 8 +- .../Migrations/201602170720063_Nullability.cs | 4 +- .../201602170720063_Nullability.resx | 54 +- .../201602170857179_Assignments.Designer.cs | 8 +- .../Migrations/201602170857179_Assignments.cs | 6 +- .../201602170857179_Assignments.resx | 54 +- .../ContosoClinic/Migrations/Configuration.cs | 8 +- .../Scripts/jquery.validate-vsdoc.js | 22 +- .../src/ContosoClinic/Scripts/respond.js | 30 +- .../ContosoClinic/Views/Manage/Index.cshtml | 6 +- .../Views/Patients/Create.cshtml | 4 +- .../ContosoClinic/Views/Patients/Edit.cshtml | 2 +- .../ContosoClinic/Views/Visits/Create.cshtml | 4 +- .../ContosoClinic/Views/Visits/Edit.cshtml | 2 +- .../tsql-scripts/Enable-RLS.sql | 6 +- .../ledger/azure-sql-database/README.md | 8 +- .../setup/CreateDatabaseSchema.sql | 26 +- .../setup/PopulateDatabase.sql | 6 +- .../setup/azuredeploy.bicep | 20 +- .../ledger/azure-sql-database/setup/setup.ps1 | 2 +- .../tsql-scripts/GetEmployeeLedgerEntries.sql | 2 +- .../ContosoHR/Pages/Employees/Delete.cshtml | 2 +- .../ContosoHR/Pages/Employees/Edit.cshtml.cs | 2 +- .../Pages/LedgerVerifications/Index.cshtml | 2 +- .../ledger/source/ContosoHR/Startup.cs | 4 +- .../lib/datatables/js/dataTables.bootstrap.js | 2 +- .../datatables/js/dataTables.bootstrap4.js | 2 +- .../lib/datatables/js/dataTables.material.js | 2 +- .../datatables/js/dataTables.semanticui.js | 2 +- .../lib/datatables/js/dataTables.uikit.js | 2 +- .../lib/datatables/js/jquery.dataTables.js | 6119 +-------- .../jquery.validate.unobtrusive.js | 2 +- .../ledger/source/WorldCup/Program.cs | 22 +- .../Scripts/Create Database Schema.sql | 34 +- .../ledger/source/WorldCup/indexStart.html | 10 +- .../security/ledger/sql-server/README.md | 2 +- ...reateDatabaseSchemaAndPopulateDatabase.sql | 12 +- .../features/sql-big-data-cluster/README.md | 2 +- .../sql-big-data-cluster/app-deploy/README.md | 12 +- .../app-deploy/RollDice/roll-dice.R | 4 +- .../app-deploy/RollDice/spec.yaml | 2 +- .../app-deploy/SSIS/README.md | 4 +- .../app-deploy/addpy/README.md | 2 +- .../app-deploy/mleap/README.md | 4 +- .../app-deploy/mleap/spec.yaml | 2 +- .../sentiment-analysis/model-training.R | 32 +- .../bootstrap-sample-db.sh | 2 +- .../bootstrap-sample-db.sql | 6 +- .../sql-big-data-cluster/data-pool/README.md | 12 +- .../data-pool/data-ingestion-spark.sql | 2 +- .../data-pool/data-ingestion-sql.sql | 2 +- .../hadoop/product-reviews-hdfs-orc.sql | 4 +- .../hadoop/web-clickstreams-hdfs-orc.sql | 4 +- .../oracle/customer-oracle.sql | 4 +- .../oracle/setup/customer.ctl | 2 +- .../oracle/setup/customer.sql | 34 +- .../oracle/setup/inventory.ctl | 2 +- .../oracle/setup/sales-user.sql | 2 +- .../storage-pool/product-reviews-hdfs-csv.sql | 4 +- .../product-reviews-hdfs-parquet.sql | 4 +- .../storage-pool/product-reviews-hdfs-tsv.sql | 4 +- .../web-clickstreams-hdfs-csv.sql | 4 +- .../web-clickstreams-hdfs-parquet.sql | 8 +- .../deployment/aks/README.md | 2 +- .../deployment/aks/deploy-sql-big-data-aks.py | 10 +- .../ubuntu-single-node-vm-ad/cleanup-bdc.sh | 2 +- .../ubuntu-single-node-vm-ad/setup-bdc-ad.sh | 16 +- .../ubuntu-single-node-vm/cleanup-bdc.sh | 2 +- .../ubuntu-single-node-vm/setup-bdc.sh | 16 +- .../deployment/kubeadm/ubuntu/README.md | 8 +- .../ubuntu/local-storage-provisioner.yaml | 18 +- .../kubeadm/ubuntu/setup-volumes-agent.sh | 2 +- .../deployment/offline/Readme.md | 2 +- .../push-bdc-images-to-custom-private-repo.py | 2 +- .../deployment/platform-ops/Readme.md | 10 +- .../platform-ops/azure-cni/deploy-cni-aks.sh | 6 +- .../bdc-aks-ops/azure-cni/deploy-cni-aks.sh | 6 +- .../kubenet/deploy-kubenet-aks.sh | 4 +- .../deployment/private-aks/README.md | 8 +- .../scripts/deploy-bdc-private-aks.sh | 2 +- .../private-aks/scripts/deploy-bdc.sh | 2 +- .../scripts/deploy-private-aks-udr.sh | 16 +- .../private-aks/scripts/deploy-private-aks.sh | 6 +- .../machine-learning/README.md | 2 +- .../kms_plugin_app/app.py | 2 +- .../kms_plugin_app/constants.py | 4 +- .../kms_plugin_app/custom_akv.py | 2 +- .../kms_plugin_app/model/json_objects.py | 2 +- .../sql-big-data-cluster/spark/README.md | 2 +- .../spark/sparkml/README.md | 2 +- .../sparkml/mleap_sql_test/mleap_pyspark.py | 16 +- .../sparkml/mleap_sql_test/mleap_sql_tests.py | 12 +- .../azure-dw-dotnet-sql-bulk-load/Program.cs | 6 +- .../sql-scripts/demo.sql | 6 +- .../sql-scripts/setup.sql | 6 +- .../LoadFromAzureBlobStorage.sql | 16 +- samples/features/sql-clr/Curl/README.md | 6 +- samples/features/sql-clr/Curl/SqlClrCurl.sql | 2 +- samples/features/sql-clr/Curl/SqlClrCurl.tt | 2 +- samples/features/sql-clr/RegEx/README.md | 4 +- .../sql-clr/TransitiveClosure/README.md | 14 +- .../TransitiveClosure/TransitiveClosure.tt | 4 +- .../TransitiveClosureAggregate.cs | 24 +- .../DataSyncLogPowerShellRunbook.ps1 | 28 +- .../sql-data-sync/UpdateSyncSchema.ps1 | 4 +- .../clean_up_data_sync_objects.sql | 6 +- .../DerivedTablesAndViewsInGraphMatch.sql | 42 +- .../README.md | 26 +- .../setup-wwi-graph.sql | 46 +- samples/features/sql-graph/README.md | Bin 14264 -> 14262 bytes .../features/sql-graph/ShortestPath/README.md | 22 +- .../sql-graph/ShortestPath/ShortestPath.sql | 26 +- .../sql-graph/ShortestPath/setup-BOMGraph.sql | 20 +- samples/features/sql-graph/csv_as_node.py | 16 +- .../sql-graph/openrowset_bulk_insert.sql | 4 +- .../sql-graph/populate_graph_tables.sql | 4 +- samples/features/sql-graph/top_10_buyers.sql | 2 +- .../features/sql-management-objects/README.md | 2 +- .../sql-management-objects/prep/dockerfile | 2 +- .../sql-management-objects/prep/restore.sh | 2 +- .../sql-management-objects/prep/restore.sql | 8 +- .../src/CollectionSamples.cs | 2 +- .../src/GenericSqlProxy.cs | 6 +- .../src/SmoSamples.csproj | 2 +- samples/features/sql2019notebooks/README.md | 8 +- samples/features/sqlvdi-linux/README.md | 8 +- .../features/sqlvdi-linux/vdipipesample.cpp | 2 +- samples/features/sqlvdi/README.md | 12 +- samples/features/sqlvdi/vdi.h | 664 +- samples/features/sqlvdi/vdiguid.h | 8 +- samples/features/sqlvss/README.md | 4 +- ...generate_backup_filename_ranges_sample.sql | 14 +- .../Continuous Column Values.dmx | 8 +- .../Model Content/Discrete Column Values.dmx | 8 +- .../DMX/Model Content/Drillthrough Query.dmx | 2 +- .../DMX/Model Content/Model Attributes.dmx | 2 +- .../DMX/Model Management/Clear Model.dmx | 2 +- .../DMX/Model Management/Clear Structure.dmx | 2 +- .../Create Structure Nested.dmx | 6 +- .../DMX/Model Management/Create Structure.dmx | 6 +- .../DMX/Model Management/Create from PMML.dmx | 2 +- .../DMX/Model Management/Export Model.dmx | 2 +- .../DMX/Model Management/Export Structure.dmx | 2 +- .../DMX/Model Management/Import.dmx | 2 +- .../DMX/Model Management/Train Model.dmx | 2 +- .../Train Nested Structure.dmx | 2 +- .../Prediction Queries/Base Prediction.dmx | 4 +- .../Prediction Queries/Nested Prediction.dmx | 6 +- .../Nested Singleton Prediction.dmx | 6 +- .../Singleton Prediction.dmx | 4 +- .../Stored Procedure Call.dmx | 2 +- .../DMX/Structure Content/Test Cases.dmx | 2 +- .../MDX/Expressions/Moving Average-Fixed.mdx | 10 +- .../Expressions/Moving Average-Variable.mdx | 12 +- .../MDX/Expressions/Periods to Date.mdx | 6 +- .../MDX/Expressions/Ratio to Parent.mdx | 4 +- .../MDX/Expressions/Ratio to Total.mdx | 4 +- .../MDX/Queries/With Calculated Member.mdx | 4 +- .../MDX/Queries/With Named Set.mdx | 4 +- samples/features/ssms-templates/README.md | 4 +- .../Sql/Aggregate/Create Aggregate.sql | 6 +- .../Sql/Aggregate/Drop Aggregate.sql | 6 +- .../Sql/Audit/Alter server audit.sql | 6 +- .../Sql/Audit/Create server audit.sql | 6 +- .../Sql/Certificate/Create Certificate.sql | 6 +- .../Sql/Certificate/Drop Certificate.sql | 4 +- .../Backup CDC Enabled Database.sql | 12 +- ...hange CDC Capture Job Polling Interval.sql | 2 +- .../Change CDC Cleanup Job Retention.sql | 2 +- ...mpute CPS for Recent Log Scan Sessions.sql | 4 +- .../Restore CDC Enabled Database.sql | 10 +- .../Return Capture Job Parameters.sql | 2 +- .../Return Cleanup Job Parameters.sql | 2 +- .../Administration/Start CDC Capture Job.sql | 2 +- .../Administration/Start CDC Cleanup Job.sql | 2 +- .../Administration/Stop CDC Capture Job.sql | 2 +- .../Administration/Stop CDC Cleanup Job.sql | 2 +- ...sable All Capture Instances for Schema.sql | 14 +- .../Enable All Tables of Database Schema.sql | 4 +- ... Table for All and Net Changes Queries.sql | 2 +- ...nstantiate CDC Wrapper TVFs for Schema.sql | 16 +- ...stantiate Wrapper TVF With Update Flag.sql | 4 +- ... Commit Time to All Changes Result Set.sql | 2 +- .../Enumerate Net Changes Using TRY CATCH.sql | 14 +- ... All Changes With Given tran_begin_lsn.sql | 2 +- ... Accessible Database Capture Instances.sql | 10 +- ...turn DDL Changes to All Enabled Tables.sql | 12 +- .../Alter Change Tracking on Database.sql | 2 +- .../Enable Change Tracking on Table.sql | 4 +- .../Sql/Credential/Create Credential.sql | 6 +- .../Sql/Credential/Drop Credential.sql | 4 +- .../Database Role/Create Database Role.sql | 22 +- .../Sql/Database Role/Drop Role Member.sql | 22 +- .../Alter Database Trigger.sql | 10 +- .../Create Database Trigger.sql | 10 +- .../Drop Database Trigger.sql | 4 +- .../Sql/Database/Create Database Snapshot.sql | 6 +- ...Create Database on Multiple Filegroups.sql | 4 +- ...te Database with Filestream Filegroups.sql | 4 +- ...e with Memory Optimized Data Filegroup.sql | 4 +- .../Sql/Database/create database.sql | 4 +- .../Sql/Database/drop database.sql | 4 +- .../Sql/Default/Create Default.sql | 4 +- .../Sql/Default/Default Constraint.sql | 4 +- .../Attach Database Template.sql | 2 +- .../Attach Single File Database.sql | 4 +- .../Detach Database Template.sql | 2 +- .../Create Database Basic Template.sql | 4 +- .../Create Database Multiple Filegroups.sql | 4 +- .../Create Database Specifying Collation.sql | 6 +- .../Create Database for Attach.sql | 6 +- .../Create Database on Multiple Files.sql | 8 +- .../Create Inline Function.sql | 18 +- .../Create Scalar Function.sql | 12 +- .../Create Function/Create Table Function.sql | 16 +- .../Create Index/Create Index Basic.sql | 4 +- .../Create Index/Create Index Full Syntax.sql | 4 +- .../Create Procedure Basic Template.sql | 10 +- ...Procedure with CURSOR OUTPUT Parameter.sql | 12 +- ...Create Procedure with OUTPUT Parameter.sql | 10 +- .../Create Statistics Template.sql | 4 +- .../Create Table Basic Template.sql | 8 +- .../Create Table Specifying Constraints.sql | 8 +- .../Create Table Specifying Filegroups.sql | 8 +- .../Create Table with Computed Column.sql | 8 +- .../Create Table with IDENTITY Column.sql | 8 +- .../Create Table with ROWGUIDCOL Column.sql | 10 +- .../Create Table/Create Temp Table.sql | 2 +- ...eate INSTEAD OF Trigger Basic Template.sql | 6 +- .../Create Trigger Basic Template.sql | 10 +- ...e Trigger Contained IF COLUMNS_UPDATED.sql | 10 +- .../Create Trigger Contained IF UPDATE.sql | 10 +- .../Create View Basic Template.sql | 6 +- .../Create View with CHECK OPTION.sql | 8 +- .../Create View with SCHEMABINDING.sql | 10 +- .../Add Extended Property.sql | 8 +- .../Drop Extended Property.sql | 8 +- .../List Extended Property.sql | 8 +- .../Update Extended Property.sql | 8 +- .../Add non-Sql Server as Linked Server.sql | 6 +- .../Configure Linked Server.sql | 4 +- .../Drop Linked Server Login.sql | 2 +- .../Drop Linked Server.sql | 2 +- .../Add Login to Server Role.sql | 2 +- .../Add User to Database Role.sql | 2 +- .../Drop Login from Server Role.sql | 2 +- .../Drop User from Database Role.sql | 2 +- .../Grant Database Access.sql | 2 +- .../Declare and Use KEYSET Cursor.sql | 4 +- .../Declare and Use UPDATE Cursor.sql | 4 +- .../Sql/Endpoint/Create Endpoint.sql | 18 +- .../CREATE DATABASE EVENT NOTIFICATION.sql | 2 +- .../CREATE SERVER EVENT NOTIFICATION.sql | 2 +- .../DROP DATABASE EVENT NOTIFICATION.sql | 2 +- .../DROP SERVER EVENT NOTIFICATION.sql | 2 +- .../Add Extended Properties to Table.sql | 26 +- .../Extended Properties on Database.sql | 14 +- .../Drop External Data Source.sql | 2 +- .../Create External File Format.sql | 4 +- .../Drop External File Format.sql | 2 +- .../Full-text/Create Full-text Catalog.sql | 8 +- .../Sql/Full-text/Create Full-text Index.sql | 6 +- .../Full-text/Create Full-text Stoplist.sql | 8 +- .../Sql/Full-text/Start Full Population.sql | 2 +- .../Sql/Full-text/Stop Population.sql | 2 +- .../Sql/Function/CLR Function.sql | 8 +- .../Create Inline Function (New Menu).sql | 12 +- ...te Multi-statement Function (New Menu).sql | 16 +- ... Multi-statement Table-valued Function.sql | 10 +- ...eate Natively Compiled Scalar Function.sql | 6 +- .../Create Scalar Function (New Menu).sql | 6 +- .../Create Clustered Columnstore Index.sql | 2 +- .../Sql/Index/Create Index Basic.sql | 2 +- .../Create Nonclustered Columnstore Index.sql | 2 +- .../Sql/Index/Create Primary XML Index.sql | 6 +- .../Create Unique Nonclustered Index.sql | 24 +- .../Sql/Index/Create XML Index Type Path.sql | 8 +- .../Index/Create XML Index Type Property.sql | 8 +- .../Sql/Index/Create XML Index Type Value.sql | 8 +- .../Add Linked Server Access MDB.sql | 12 +- .../Login/Create Login For SysAdmin User.sql | 2 +- .../Create SQL Login Must Change Password.sql | 4 +- .../Alter Partition Function Merge.sql | 2 +- .../Alter Partition Function Split.sql | 2 +- .../Create Partitioned Table.sql | 20 +- .../Drop Partition Function.sql | 2 +- .../Alter Partition Scheme Mark Next Used.sql | 6 +- .../Create Partition Scheme.sql | 4 +- .../Create Partitioned Nonclustered Index.sql | 20 +- .../Drop Partition Scheme.sql | 2 +- .../Common Table Expression With Averages.sql | 8 +- .../Direct Reports Recursion Example.sql | 10 +- .../Product Assemblies Recursion Example.sql | 8 +- .../Configure Resource Governor.sql | 16 +- .../Sql/Restore/Restore Database.sql | 8 +- .../Restore/Restore Files and Filegroups.sql | 86 +- .../Sql/Rule/Create Bound Rule.sql | 2 +- .../Create Database Trigger.sql | 10 +- .../Drop Database Trigger.sql | 2 +- .../Database/Create Database.sql | 24 +- .../Alter External Data Source DW.sql | 2 +- .../Create External Data Source DW.sql | 4 +- .../Drop External Data Source.sql | 2 +- .../Create External File Format.sql | 6 +- .../Drop External File Format.sql | 2 +- .../Create Inline Function (New Menu).sql | 8 +- ...te Multi-statement Function (New Menu).sql | 12 +- ... Multi-statement Table-valued Function.sql | 10 +- ...eate Natively Compiled Scalar Function.sql | 6 +- .../SQL Azure Database/Index/Create Index.sql | 4 +- .../Index/Create Unique Clustered Index.Sql | 8 +- .../SQL Azure Database/Login/Create Login.sql | 4 +- .../SQL Azure Database/Role/Create Role.sql | 24 +- .../Create Security Policy.sql | 6 +- .../Statistics/Create Statistics.sql | 6 +- ...ate Natively Compiled Stored Procedure.sql | 2 +- .../Drop Stored Procedure.sql | 6 +- .../Table/Create Append-Only Ledger Table.sql | 4 +- .../Table/Create Memory Optimized Table.sql | 4 +- .../Table/Create System-Versioned Table.sql | 12 +- .../SQL Azure Database/Table/Create Table.sql | 8 +- .../Table/Create Updatable Ledger Table.sql | 6 +- .../SQL Azure Database/Table/Drop Table.sql | 2 +- .../Create T-SQL Trigger (New Menu).sql | 8 +- .../Trigger/Drop Trigger.sql | 2 +- .../Create User-defined Data Type.sql | 2 +- ...er-defined Memory Optimized Table Type.sql | 4 +- .../Create User-defined Table Type.sql | 8 +- .../Simple Database Mail Configuration.sql | 2 +- .../Sql/SQL Trace/Default Profiler Trace.sql | 8 +- .../Sql/SQLiMail/Simple Configuration.sql | 2 +- .../Create Security Policy.sql | 6 +- .../Server Role/Add Server Role Member.sql | 2 +- .../Sql/Server Role/Create Server Role.sql | 4 +- .../Server Role/Drop Server Role Member.sql | 2 +- .../Sql/Server Role/Drop Server Role.sql | 6 +- .../Sql/Server Role/Rename Server Role.sql | 2 +- .../Server Trigger/Alter Server Trigger.sql | 8 +- .../Server Trigger/Create Server Trigger.sql | 8 +- .../Server Trigger/Drop Server Trigger.sql | 2 +- .../Create Request Response Contract.sql | 16 +- ...reate Request Response with Activation.sql | 20 +- .../Create Request Response Contract.sql | 4 +- .../EndPoint/Create Broker Endpoint.sql | 2 +- .../Add Message Type Validation.sql | 2 +- .../MessageType/Create Message Type.sql | 6 +- .../Queue/Create Queue with Activation.sql | 6 +- .../Queue/Turn Off Activation.sql | 4 +- .../Service Broker/Queue/Turn Off Queue.sql | 2 +- .../Queue/Turn On Activation.sql | 4 +- .../Service Broker/Queue/Turn On Queue.sql | 2 +- .../Change Database Mirror Route Address.sql | 2 +- .../Route/Change Route Address.sql | 2 +- .../Route/Create Database Mirror Route.sql | 10 +- .../Sql/Service Broker/Route/Create Route.sql | 8 +- ...reate Anonymous Remote Service Binding.sql | 4 +- .../Create Private Key Certificate.sql | 2 +- .../Create Public Key Certificate.sql | 2 +- .../Create Remote Service Binding.sql | 4 +- .../Security/Drop Remote Service Binding.sql | 2 +- .../Service Broker/Security/Grant Receive.sql | 2 +- .../Service/Add Contract To Service.sql | 2 +- .../Service/Create Initiator Service.sql | 4 +- .../Service/Create Target Service.sql | 2 +- .../Service Broker/Service/Drop Service.sql | 2 +- .../Statistics/Create Filtered Statistics.sql | 6 +- ...Create Fullscan Norecompute Statistics.sql | 6 +- .../Statistics/Create Fullscan Statistics.sql | 6 +- .../Statistics/Create Sampled Statistics.sql | 6 +- .../Update All Statistics For Table.sql | 2 +- .../Update Statistics One Index.sql | 2 +- ...ter Natively Compiled Stored Procedure.sql | 2 +- ...ate Natively Compiled Stored Procedure.sql | 2 +- .../Create Procedure Basic Template.sql | 8 +- ...Procedure with CURSOR OUTPUT Parameter.sql | 8 +- ...Create Procedure with OUTPUT Parameter.sql | 8 +- .../Create Stored Procedure (New Menu).sql | 8 +- .../alter stored procedure.sql | 2 +- .../drop stored procedure.sql | 8 +- ...nd Create Memory Optimized Table Linux.sql | 4 +- ...roup and Create Memory Optimized Table.sql | 4 +- .../Sql/Table/Add Unique Constraint.sql | 6 +- .../Table/Create Append-Only Ledger Table.sql | 4 +- ...emory Optimized System-Versioned Table.sql | 12 +- .../Table/Create Memory Optimized Table.sql | 4 +- .../Table/Create System-Versioned Table.sql | 12 +- .../Create Table with filestream column.sql | 10 +- .../ssms-templates/Sql/Table/Create Table.sql | 6 +- .../Table/Create Updatable Ledger Table.sql | 6 +- .../ssms-templates/Sql/Table/add column.sql | 2 +- .../Sql/Table/add constraint.sql | 4 +- .../Sql/Table/add filestream column.sql | 2 +- .../ssms-templates/Sql/Table/add key.sql | 4 +- .../ssms-templates/Sql/Table/drop column.sql | 6 +- .../Sql/Table/drop constraint.sql | 4 +- .../ssms-templates/Sql/Table/drop key.sql | 8 +- .../Sql/Trigger/Alter T-SQL Trigger.sql | 4 +- .../Create T-SQL Trigger (New Menu).sql | 10 +- .../Sql/Trigger/Create T-SQL Trigger.sql | 6 +- .../Sql/Trigger/Drop Trigger.sql | 2 +- .../Create User-defined Data Type.sql | 2 +- ...er-defined Memory Optimized Table Type.sql | 4 +- .../Create User-defined Table Type.sql | 8 +- .../Sql/User-defined Type/Create Type.sql | 4 +- .../Sql/User/Create Schema User.sql | 16 +- .../Sql/User/Create User as DBO.sql | 2 +- .../Sql/View/Create Indexed View.sql | 2 +- .../Alter XML Schema Collection.sql | 4 +- .../Create XML Schema Collection.sql | 6 +- .../Drop XML Schema Collection.sql | 4 +- .../features/t-sql-snapshot-backup/README.md | 2 +- ...pshot-backup-restore-azurevm-single-db.ps1 | 24 +- .../temporal/product-catalog/README.md | 6 +- .../product-catalog/sql-scripts/demo.sql | 6 +- .../product-catalog/sql-scripts/setup.sql | 6 +- .../product-catalog/wwwroot/index.html | 2 +- .../wwwroot/media/js/jquery.dataTables.js | 3806 +----- .../wwwroot/media/js/jquery.html-template.js | 14 +- .../wwwroot/media/js/products.js | 6 +- .../unicode/CheckStorageReq_CurrDB.sql | 16 +- .../features/unicode/DataType_WesternMyth.sql | 116 +- samples/features/unicode/Functional.sql | 30 +- samples/features/unicode/Perf_Latin.sql | 34 +- samples/features/unicode/Perf_NonLatin.sql | 42 +- samples/features/unicode/Storage.sql | 4 +- samples/manage/DiscoverSql.ps1 | 8 +- samples/manage/README.md | 12 +- .../azure-arc-enabled-sql-server/README.md | 2 +- .../migrate-to-azure-arc-data.ps1 | 2 +- .../modify-license-type/README.md | 26 +- .../modify-license-type.ps1 | 66 +- .../AutoExport.ps1 | 4 +- .../README.md | 2 +- .../azure-hybrid-benefit/DiscoverSql.ps1 | 8 +- .../azure-hybrid-benefit/DiscoverSql.sh | 10 +- samples/manage/azure-hybrid-benefit/README.md | 24 +- .../get-sqlvm-inventory.ps1 | 90 +- .../sql-license-usage.ps1 | 216 +- .../LoadGeneratorConsole/App.config | 2 +- .../LoadGeneratorConsole.csproj | 2 +- .../LoadGeneratorConsole/Program.cs | 10 +- .../Properties/AssemblyInfo.cs | 10 +- .../Properties/Settings.Designer.cs | 14 +- .../App_Start/IdentityConfig.cs | 4 +- .../App_Start/Startup.Auth.cs | 4 +- .../ApplicationInsights.config | 22 +- .../MonitoringWebApp/Content/Site.css | 4 +- .../Controllers/AccountController.cs | 14 +- .../Controllers/ManageController.cs | 6 +- .../MonitoringWebApp/MyWebSocket.cs | 34 +- .../Properties/Settings.Designer.cs | 8 +- .../Scripts/jquery.validate-vsdoc.js | 22 +- .../MonitoringWebApp/Scripts/respond.js | 30 +- .../MonitoringWebApp/Views/Home/Index.cshtml | 6 +- .../Views/Manage/Index.cshtml | 6 +- .../Views/Shared/_Layout.cshtml | 2 +- .../MonitoringWebApp/Web.config | 2 +- .../Queries/sys.dm_db_resource_stats.sql | 14 +- .../sys.elastic_pool_resource_stats.sql | 16 +- .../Queries/sys.resource_stats.sql | 42 +- .../readme.md | 54 +- .../PoolTelemetry.ps1 | 96 +- .../PoolTelemetryJobRunner.ps1 | 102 +- .../azure-sql-db-elastic-pools/readme.md | 66 +- .../attach-jumpbox/README.md | 2 +- .../attach-jumpbox/attachJumpbox.ps1 | 6 +- .../attach-jumpbox/azuredeploy.json | 4 +- .../attach-vpn-gateway/README.md | 4 +- .../attach-vpn-gateway/attachVPNGateway.ps1 | 16 +- .../attach-vpn-gateway/azuredeploy.json | 2 +- .../automation-functions/README.md | 6 +- .../AssignDirectoryReadersRoleFunction.cs | 2 +- .../compare-properties.sql | 2 +- .../get-properties.sql | 24 +- .../delegate-subnet/delegateSubnet.ps1 | 58 +- .../prepare-subnet/prepareSubnet.ps1 | 78 +- .../uploadTDECertificate.ps1 | 8 +- .../get-tds-certificate/getTDSCertificate.ps1 | 6 +- samples/manage/hdfs-kerberos-tester/jaas.conf | 6 +- samples/manage/hdfs-kerberos-tester/readme.md | 6 +- .../DisablingBuiltInChecks_sample.json | 22 +- .../MakingCustomChecks_sample.json | 2 +- .../manage/sql-assessment-api/QuickStart.md | 2 +- .../AssessmentClient.SMO/Program.cs | 2 +- .../AutomaticVariables/AttrService.md | 2 +- .../docs/Customization/MessageTemplate.md | 2 +- .../docs/Customization/RulesandProbes.md | 6 +- .../Customization/RulesetFileStructure.md | 2 +- .../docs/Customization/TargetPattern.md | 2 +- .../Customization/img/RulesetStructure.svg | 20 +- .../img/TargetPatternStructure.svg | 20 +- .../img/src/RulesetStructure.plantuml | 2 +- .../img/src/TargetPatternStructure.plantuml | 2 +- .../docs/How-To/QuickStart.md | 18 +- .../docs/How-To/UsingAzureRules.md | 14 +- .../docs/How-To/UsingNonSQLProbes.md | 2 +- .../Reference/DataTransformation/aggregate.md | 2 +- .../DataTransformation/performance.md | 2 +- .../docs/Reference/JSONConfiguration.md | 2 +- .../docs/Reference/Probes/Performance.md | 2 +- .../docs/Tutorials/CreatingCustomRules.md | 32 +- .../docs/Tutorials/DisablingBuiltInRules.md | 24 +- .../Tutorials/OverridingDefaultThresholds.md | 2 +- .../CustomRuleTSQLProbe.json | 4 +- .../CustomRuleThresholdChange.json | 2 +- .../sql-assessment-api/release-notes.md | 10 +- .../scripts.md | 6 +- .../scripts/EOS_DataGenerator_InputList.ps1 | 64 +- .../EOS_DataGenerator_LocalDiscovery.ps1 | 72 +- .../EOS_DataGenerator_SingleInstance.sql | 4 +- .../csharp/Readme.md | 2 +- .../Unix-based/AzureSqlSample/Program.cs | 2 +- .../AzureSqlSample/Program_KeyVault.cs | 2 +- .../Windows/AzureSqlEFSample/Program.cs | 4 +- .../csharp/Windows/AzureSqlSample/Program.cs | 2 +- .../AzureSqlSample/Program_KeyVault.cs | 2 +- .../go/Readme.md | 2 +- .../go/connect.go | 2 +- .../AzureSqlGettingStartedSamples/go/crud.go | 2 +- .../AzureSqlGettingStartedSamples/go/orm.go | 4 +- .../java/Readme.md | 2 +- .../AzureSqlHibernateSample/App.java | 4 +- .../Windows/AzureSqlHibernateSample/App.java | 4 +- .../nodejs/Readme.md | 2 +- .../AzureSqlColumnstoreSample/columnstore.js | 4 +- .../nodejs/Unix-based/AzureSqlSample/crud.js | 4 +- .../Unix-based/AzureSqlSequelizeSample/orm.js | 4 +- .../AzureSqlColumnstoreSample/columnstore.js | 4 +- .../nodejs/Windows/AzureSqlSample/crud.js | 2 +- .../Windows/AzureSqlSequelizeSample/orm.js | 4 +- .../php/Readme.md | 2 +- .../python/Readme.md | 2 +- .../ruby/AzureSqlSample/activerecordcrud.rb | 4 +- .../ruby/AzureSqlSample/crud.rb | 2 +- .../ruby/Readme.md | 2 +- samples/tutorials/c#/README.md | 2 +- samples/tutorials/c#/RHEL/README.md | 18 +- samples/tutorials/c#/SLES/README.md | 18 +- samples/tutorials/c#/Ubuntu/README.md | 18 +- samples/tutorials/c#/Windows/README.md | 16 +- .../Windows/SqlMIResilientCloudApp/App.config | 2 +- .../SqlMIResilientCloudApp/ResilientDBApp.cs | 16 +- samples/tutorials/c#/macOS/README.md | 18 +- samples/tutorials/c/linux/README.md | 2 +- samples/tutorials/f#/README.md | 12 +- .../f#/SqlServerColumnstoreSample/Program.fs | 2 +- samples/tutorials/go/README.md | 2 +- samples/tutorials/java/README.md | 2 +- samples/tutorials/java/RHEL/README.md | 18 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- samples/tutorials/java/Ubuntu/README.md | 18 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- samples/tutorials/java/Windows/README.md | 18 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- samples/tutorials/java/macOS/README.md | 18 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- .../src/main/java/com/sqlsamples/App.java | 4 +- .../src/test/java/com/sqlsamples/AppTest.java | 2 +- samples/tutorials/node.js/README.md | 2 +- samples/tutorials/node.js/RHEL/README.md | 24 +- samples/tutorials/node.js/Ubuntu/README.md | 24 +- samples/tutorials/node.js/Windows/README.md | 24 +- samples/tutorials/node.js/macOS/README.md | 24 +- samples/tutorials/php/README.md | 2 +- samples/tutorials/python/README.md | 2 +- .../tutorials/python/pymssql/linux/README.md | 18 +- .../pymssql/linux/sample_python_linux.py | 22 +- .../tutorials/python/pymssql/mac/README.md | 10 +- .../python/pymssql/mac/sample_python_mac.py | 22 +- .../tutorials/python/pyodbc/linux/README.md | 12 +- .../tutorials/python/pyodbc/windows/README.md | 10 +- samples/tutorials/ruby/README.md | 2 +- samples/tutorials/ruby/linux/README.md | 20 +- samples/tutorials/ruby/mac/README.md | 12 +- samples/tutorials/ruby/windows/README.md | 16 +- 1461 files changed, 13333 insertions(+), 76271 deletions(-) diff --git a/.gitignore b/.gitignore index 1ace7a70..200d52c0 100644 --- a/.gitignore +++ b/.gitignore @@ -162,7 +162,7 @@ DocProject/Help/html # Publish Web Output *.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings +# 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 diff --git a/README.md b/README.md index a33290fd..58288b6c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -![](./media/solutions-microsoft-logo-small.png) +![](./media/solutions-microsoft-logo-small.png) # 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. +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. ## Releases in this repository @@ -21,7 +21,7 @@ To work in GitHub, go to https://github.com/microsoft/sql-server-samples and for Each sample should be in its own folder with a README.md file that follows the [template](README_samples_template.md). Generated files (e.g., .exe or .bacpac) and user configuration settings (e.g., .user) should not be committed to GitHub. ## Cloning only a subset of the repo (with sparse checkout) -You can follow the steps below to clone individual files from the sql-server-samples git repo. Note: The following script clones only the files under the **features** and **demos** folders. +You can follow the steps below to clone individual files from the sql-server-samples git repo. Note: The following script clones only the files under the **features** and **demos** folders. ``` git clone -n https://github.com/Microsoft/sql-server-samples cd sql-server-samples diff --git a/README_samples_template.md b/README_samples_template.md index 751f50c7..dbd10505 100644 --- a/README_samples_template.md +++ b/README_samples_template.md @@ -59,7 +59,7 @@ To run this sample, you need the following prerequisites. 2. In Visual Studio Build menu, select **Build Solution** (or Press F6). -3. Step 3 ... +3. Step 3 ... diff --git a/SECURITY.md b/SECURITY.md index 869fdfe2..f0c2dc14 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,7 +14,7 @@ Instead, please report them to the Microsoft Security Response Center (MSRC) at If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). -You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: diff --git a/media/demos/sql-sampledb/sampledb1/sampleDB1.sql b/media/demos/sql-sampledb/sampledb1/sampleDB1.sql index adb245be..88190064 100644 --- a/media/demos/sql-sampledb/sampledb1/sampleDB1.sql +++ b/media/demos/sql-sampledb/sampledb1/sampleDB1.sql @@ -1,4 +1,4 @@ -/* +/* This is sourced from progress.com, variation by lightofodin. Basic database housing a sales scenario, that features employees and departments. */ diff --git a/samples/applications/aspnet-session-state/aspstate_sql2016_no_retry.sql b/samples/applications/aspnet-session-state/aspstate_sql2016_no_retry.sql index 7da5055c..34b3eecc 100644 --- a/samples/applications/aspnet-session-state/aspstate_sql2016_no_retry.sql +++ b/samples/applications/aspnet-session-state/aspstate_sql2016_no_retry.sql @@ -1,14 +1,14 @@ /*====================================================================================== Script: aspstate_sql2016_no_retry.sql -Description: +Description: This script is based on the InstallSqlState.sql script but works with SQL 2016 In-Memory OLTP by replacing the following objects to in-memory and natively compiled stored procedures. ** Tables: Converted the following table to In-Memory table: - [dbo].[ASPStateTempSessions] (SessionId: NONCLUSTERED HASH PK (Bucket Count=33554432)) - + ** Stored Procedures: Converted the following SPs to Native Compiled SPs: - dbo.TempGetStateItemExclusive3 @@ -35,11 +35,11 @@ DECLARE @SQL nvarchar(max) = N''; SET @SQL = N' CREATE DATABASE [ASPState] CONTAINMENT = NONE - ON PRIMARY - (NAME = N''ASPState'', FILENAME = N''' + @SQLDataFolder + 'ASPState.mdf'' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), + ON PRIMARY + (NAME = N''ASPState'', FILENAME = N''' + @SQLDataFolder + 'ASPState.mdf'' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), FILEGROUP [ASPState_mod] CONTAINS MEMORY_OPTIMIZED_DATA DEFAULT (NAME = N''ASPState_mod'', FILENAME = N''' + @SQLLogFolder + 'ASPState_mod'' , MAXSIZE = UNLIMITED) - LOG ON + LOG ON (NAME = N''ASPState_log'', FILENAME = N''' + @SQLLogFolder + 'ASPState_log.ldf'' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB ); ALTER DATABASE [ASPState] SET COMPATIBILITY_LEVEL = 130; ALTER DATABASE [ASPState] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;' @@ -74,11 +74,11 @@ CREATE TABLE [dbo].[ASPStateTempSessions] [SessionItemLong] [varbinary](max) NULL, [Flags] [int] NOT NULL DEFAULT ((0)), -INDEX [Index_Expires] NONCLUSTERED +INDEX [Index_Expires] NONCLUSTERED ( [Expires] ASC ), -PRIMARY KEY NONCLUSTERED HASH +PRIMARY KEY NONCLUSTERED HASH ( [SessionId] )WITH ( BUCKET_COUNT = 33554432) @@ -88,7 +88,7 @@ GO CREATE TABLE [dbo].[ASPStateTempApplications]( [AppId] [int] NOT NULL, [AppName] [char](280) NOT NULL, -PRIMARY KEY CLUSTERED +PRIMARY KEY CLUSTERED ( [AppId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] @@ -131,7 +131,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e IF @LockedCheck=1 BEGIN UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @lockAge = DATEDIFF(second, LockDate, @now), @lockCookie = LockCookie, @itemShort = NULL, @@ -143,7 +143,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e ELSE BEGIN UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), LockDate = @now, LockDateLocal = @nowlocal, @lockAge = 0, @@ -154,7 +154,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e @locked = 0, Locked = 1 WHERE SessionId = @id - + IF @TextPtr IS NOT NULL SELECT @TextPtr @@ -169,31 +169,31 @@ CREATE PROCEDURE [dbo].[TempInsertStateItemShort] @timeout int WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') - + DECLARE @now AS datetime DECLARE @nowLocal AS datetime - + SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - INSERT dbo.ASPStateTempSessions - (SessionId, - SessionItemShort, - Timeout, - Expires, - Locked, + INSERT dbo.ASPStateTempSessions + (SessionId, + SessionItemShort, + Timeout, + Expires, + Locked, LockDate, LockDateLocal, LockCookie, Created, Flags, - SessionItemLong) - VALUES - (@id, - @itemShort, - @timeout, - DATEADD(n, @timeout, @now), - 0, + SessionItemLong) + VALUES + (@id, + @itemShort, + @timeout, + DATEADD(n, @timeout, @now), + 0, @now, @nowLocal, 1, @@ -201,7 +201,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e 0, NULL) - RETURN 0 + RETURN 0 END GO @@ -212,17 +212,17 @@ CREATE PROCEDURE [dbo].[TempUpdateStateItemLong] @timeout int, @lockCookie int WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER -AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') +AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), SessionItemLong = @itemLong, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 -END + RETURN 0 +END GO -- Stored Procedure: dbo.TempUpdateStateItemLongNullShort converted natively compiled SP @@ -235,15 +235,15 @@ WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), - SessionItemLong = @itemLong, + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SessionItemLong = @itemLong, SessionItemShort = NULL, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 -END + RETURN 0 +END GO -- Stored Procedure: dbo.TempUpdateStateItemShort converted natively compiled SP @@ -256,13 +256,13 @@ WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' ) UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), - SessionItemShort = @itemShort, + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SessionItemShort = @itemShort, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 + RETURN 0 END GO @@ -280,8 +280,8 @@ AS SessionItemShort VARBINARY(7000) NULL, SessionItemLong VARBINARY(max) NULL, Flags int NOT NULL DEFAULT 0, - - PRIMARY KEY NONCLUSTERED HASH + + PRIMARY KEY NONCLUSTERED HASH ( [SessionId] )WITH ( BUCKET_COUNT = 33554432), @@ -292,22 +292,22 @@ AS CREATE TABLE dbo.ASPStateTempApplications ( AppId int NOT NULL PRIMARY KEY, AppName char(280) NOT NULL, - ) + ) CREATE NONCLUSTERED INDEX Index_AppName ON ASPStateTempApplications(AppName) -RETURN 0 +RETURN 0 GO CREATE PROCEDURE [dbo].[DeleteExpiredSessions] AS SET NOCOUNT ON - SET DEADLOCK_PRIORITY LOW + SET DEADLOCK_PRIORITY LOW DECLARE @now datetime - SET @now = GETUTCDATE() + SET @now = GETUTCDATE() - CREATE TABLE #tblExpiredSessions - ( + CREATE TABLE #tblExpiredSessions + ( SessionId nvarchar(88) NOT NULL PRIMARY KEY ) @@ -316,10 +316,10 @@ AS FROM ASPStateTempSessions WITH (SNAPSHOT) WHERE Expires < @now - IF @@ROWCOUNT <> 0 - BEGIN + IF @@ROWCOUNT <> 0 + BEGIN DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY - FOR SELECT SessionId FROM #tblExpiredSessions + FOR SELECT SessionId FROM #tblExpiredSessions DECLARE @SessionId nvarchar(88) @@ -327,7 +327,7 @@ AS FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId - WHILE @@FETCH_STATUS = 0 + WHILE @@FETCH_STATUS = 0 BEGIN DELETE FROM ASPStateTempSessions WHERE SessionId = @SessionId AND Expires < @now FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId @@ -337,18 +337,18 @@ AS DEALLOCATE ExpiredSessionCursor - END + END DROP TABLE #tblExpiredSessions -RETURN 0 +RETURN 0 GO CREATE PROCEDURE [dbo].[GetHashCode] @input tAppName, @hash int OUTPUT AS - /* + /* This sproc is based on this C# hash function: int GetHashCode(string s) @@ -369,7 +369,7 @@ AS divide our 32bit integer into the upper and lower 16 bits to do our calculation. */ - + DECLARE @hi_16bit int DECLARE @lo_16bit int DECLARE @hi_t int @@ -381,23 +381,23 @@ AS SET @hi_16bit = 0 SET @lo_16bit = 5381 - + SET @len = DATALENGTH(@input) SET @i = 1 - + WHILE (@i <= @len) BEGIN SET @c = ASCII(SUBSTRING(@input, @i, 1)) - /* Formula: + /* Formula: hash = ((hash << 5) + hash) ^ c */ /* hash << 5 */ SET @hi_t = @hi_16bit * 32 /* high 16bits << 5 */ SET @hi_t = @hi_t & 0xFFFF /* zero out overflow */ - + SET @lo_t = @lo_16bit * 32 /* low 16bits << 5 */ - + SET @carry = @lo_16bit & 0x1F0000 /* move low 16bits carryover to hi 16bits */ SET @carry = @carry / 0x10000 /* >> 16 */ SET @hi_t = @hi_t + @carry @@ -438,7 +438,7 @@ BEGIN DECLARE @dot int DECLARE @hyphen int DECLARE @SqlToExec nchar(4000) - + SELECT @@ver = 7 SELECT @version = @@Version SELECT @hyphen = CHARINDEX(N' - ', @version) @@ -467,36 +467,36 @@ AS WHERE AppName = @appName IF @appId IS NULL BEGIN - BEGIN TRAN + BEGIN TRAN SELECT @appId = AppId FROM ASPStateTempApplications WITH (TABLOCKX) WHERE AppName = @appName - + IF @appId IS NULL BEGIN EXEC GetHashCode @appName, @appId OUTPUT - + INSERT ASPStateTempApplications VALUES (@appId, @appName) - - IF @@ERROR = 2627 + + IF @@ERROR = 2627 BEGIN DECLARE @dupApp tAppName - + SELECT @dupApp = RTRIM(AppName) - FROM ASPStateTempApplications + FROM ASPStateTempApplications WHERE AppId = @appId - - RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', + + RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', 18, 1, @appName, @dupApp) END END COMMIT END -RETURN 0 +RETURN 0 GO @@ -513,7 +513,7 @@ AS SET @now = GETUTCDATE() UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @locked = Locked, @lockDate = LockDateLocal, @lockCookie = LockCookie, @@ -534,7 +534,7 @@ AS SELECT @textptr END - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItem2] @@ -550,7 +550,7 @@ AS SET @now = GETUTCDATE() UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @locked = Locked, @lockAge = DATEDIFF(second, LockDate, @now), @lockCookie = LockCookie, @@ -571,7 +571,7 @@ AS SELECT @textptr END - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItem3] @@ -588,7 +588,7 @@ AS SET @now = GETUTCDATE() UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @locked = Locked, @lockAge = DATEDIFF(second, LockDate, @now), @lockCookie = LockCookie, @@ -620,7 +620,7 @@ AS SELECT @textptr END - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItemExclusive] @@ -637,9 +637,9 @@ AS SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - + UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), LockDate = CASE Locked WHEN 0 THEN @now ELSE LockDate @@ -671,7 +671,7 @@ AS SELECT @textptr END - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItemExclusive2] @@ -688,9 +688,9 @@ AS SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - + UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), LockDate = CASE Locked WHEN 0 THEN @now ELSE LockDate @@ -726,7 +726,7 @@ AS SELECT @textptr END - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetVersion] @@ -735,74 +735,74 @@ AS SELECT @ver = '2' RETURN 0 GO - + CREATE PROCEDURE [dbo].[TempInsertStateItemLong] @id nvarchar(88), -- [dbo].[tSessionId] @itemLong image, -- [dbo].[tSessionItemLong] @timeout int -AS +AS DECLARE @now AS datetime DECLARE @nowLocal AS datetime - + SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - INSERT ASPStateTempSessions - (SessionId, - SessionItemLong, - Timeout, - Expires, - Locked, + INSERT ASPStateTempSessions + (SessionId, + SessionItemLong, + Timeout, + Expires, + Locked, LockDate, LockDateLocal, - LockCookie) - VALUES - (@id, - @itemLong, - @timeout, - DATEADD(n, @timeout, @now), - 0, + LockCookie) + VALUES + (@id, + @itemLong, + @timeout, + DATEADD(n, @timeout, @now), + 0, @now, @nowLocal, 1) - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempInsertUninitializedItem] @id nvarchar(88), -- @id tSessionId, @itemShort varbinary(7000), -- @itemShort tSessionItemShort, @timeout int -AS +AS DECLARE @now AS datetime DECLARE @nowLocal AS datetime - + SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - INSERT ASPStateTempSessions - (SessionId, - SessionItemShort, - Timeout, - Expires, - Locked, + INSERT ASPStateTempSessions + (SessionId, + SessionItemShort, + Timeout, + Expires, + Locked, LockDate, LockDateLocal, LockCookie, - Flags) - VALUES - (@id, - @itemShort, - @timeout, - DATEADD(n, @timeout, @now), - 0, + Flags) + VALUES + (@id, + @itemShort, + @timeout, + DATEADD(n, @timeout, @now), + 0, @now, @nowLocal, 1, 1) - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempReleaseStateItemExclusive] @@ -810,11 +810,11 @@ CREATE PROCEDURE [dbo].[TempReleaseStateItemExclusive] @lockCookie int AS UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, GETUTCDATE()), + SET Expires = DATEADD(n, Timeout, GETUTCDATE()), Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempRemoveStateItem] @@ -823,18 +823,18 @@ CREATE PROCEDURE [dbo].[TempRemoveStateItem] AS DELETE ASPStateTempSessions WHERE SessionId = @id AND LockCookie = @lockCookie - - RETURN 0 + + RETURN 0 GO CREATE PROCEDURE [dbo].[TempResetTimeout] - @id nvarchar(88) + @id nvarchar(88) AS UPDATE ASPStateTempSessions SET Expires = DATEADD(n, Timeout, GETUTCDATE()) WHERE SessionId = @id - - RETURN 0 + + RETURN 0 GO CREATE PROCEDURE [dbo].[TempUpdateStateItemShortNullLong] @@ -842,14 +842,14 @@ CREATE PROCEDURE [dbo].[TempUpdateStateItemShortNullLong] @itemShort varbinary(7000), -- @itemShort tSessionItemShort, @timeout int, @lockCookie int -AS +AS UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), - SessionItemShort = @itemShort, - SessionItemLong = NULL, + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SessionItemShort = @itemShort, + SessionItemLong = NULL, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 + RETURN 0 GO diff --git a/samples/applications/aspnet-session-state/aspstate_sql2016_with_retry.sql b/samples/applications/aspnet-session-state/aspstate_sql2016_with_retry.sql index a3e82606..765775d5 100644 --- a/samples/applications/aspnet-session-state/aspstate_sql2016_with_retry.sql +++ b/samples/applications/aspnet-session-state/aspstate_sql2016_with_retry.sql @@ -1,14 +1,14 @@ /*====================================================================================== Script: aspstate_sql2016_with_retry.sql -Description: +Description: This script is based on the InstallSqlState.sql script but works with SQL 2016 In-Memory OLTP by replacing the following objects to in-memory and natively compiled stored procedures. ** Tables: Converted the following table to In-Memory table: - [dbo].[ASPStateTempSessions] (SessionId: NONCLUSTERED HASH PK (Bucket Count=33554432)) - + ** Stored Procedures: Converted the following SPs to Native Compiled SPs: - dbo.TempGetStateItemExclusive3 @@ -35,11 +35,11 @@ DECLARE @SQL nvarchar(max) = N''; SET @SQL = N' CREATE DATABASE [ASPState] CONTAINMENT = NONE - ON PRIMARY - (NAME = N''ASPState'', FILENAME = N''' + @SQLDataFolder + 'ASPState.mdf'' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), + ON PRIMARY + (NAME = N''ASPState'', FILENAME = N''' + @SQLDataFolder + 'ASPState.mdf'' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), FILEGROUP [ASPState_mod] CONTAINS MEMORY_OPTIMIZED_DATA DEFAULT (NAME = N''ASPState_mod'', FILENAME = N''' + @SQLLogFolder + 'ASPState_mod'' , MAXSIZE = UNLIMITED) - LOG ON + LOG ON (NAME = N''ASPState_log'', FILENAME = N''' + @SQLLogFolder + 'ASPState_log.ldf'' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB ); ALTER DATABASE [ASPState] SET COMPATIBILITY_LEVEL = 130; ALTER DATABASE [ASPState] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON;' @@ -75,11 +75,11 @@ CREATE TABLE [dbo].[ASPStateTempSessions] [SessionItemLong] [varbinary](max) NULL, [Flags] [int] NOT NULL DEFAULT ((0)), -INDEX [Index_Expires] NONCLUSTERED +INDEX [Index_Expires] NONCLUSTERED ( [Expires] ASC ), -PRIMARY KEY NONCLUSTERED HASH +PRIMARY KEY NONCLUSTERED HASH ( [SessionId] )WITH ( BUCKET_COUNT = 33554432) @@ -89,7 +89,7 @@ GO CREATE TABLE [dbo].[ASPStateTempApplications]( [AppId] [int] NOT NULL, [AppName] [char](280) NOT NULL, -PRIMARY KEY CLUSTERED +PRIMARY KEY CLUSTERED ( [AppId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] @@ -131,7 +131,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e IF @LockedCheck=1 BEGIN UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @lockAge = DATEDIFF(second, LockDate, @now), @lockCookie = LockCookie, @itemShort = NULL, @@ -143,7 +143,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e ELSE BEGIN UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), LockDate = @now, LockDateLocal = @nowlocal, @lockAge = 0, @@ -154,7 +154,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e @locked = 0, Locked = 1 WHERE SessionId = @id - + IF @TextPtr IS NOT NULL SELECT @TextPtr @@ -169,48 +169,48 @@ CREATE PROCEDURE [dbo].[TempGetStateItemExclusive3] @lockAge int OUTPUT, @lockCookie int OUTPUT, @actionFlags int OUTPUT -AS -BEGIN - DECLARE @retry INT = 10; +AS +BEGIN + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; EXEC dbo.TempGetStateItemExclusive3_HK - @id, - @itemShort = @itemShort OUTPUT, + @id, + @itemShort = @itemShort OUTPUT, @locked = @locked OUTPUT, @lockAge = @lockAge OUTPUT, @lockCookie = @lockCookie OUTPUT, @actionFlags = @actionFlags OUTPUT - - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH - END -- //While loop -END; -GO + END -- //While loop +END; +GO CREATE PROCEDURE [dbo].[TempInsertStateItemShort_HK] @id nvarchar(88), @@ -218,31 +218,31 @@ CREATE PROCEDURE [dbo].[TempInsertStateItemShort_HK] @timeout int WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') - + DECLARE @now AS datetime DECLARE @nowLocal AS datetime - + SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - INSERT dbo.ASPStateTempSessions - (SessionId, - SessionItemShort, - Timeout, - Expires, - Locked, + INSERT dbo.ASPStateTempSessions + (SessionId, + SessionItemShort, + Timeout, + Expires, + Locked, LockDate, LockDateLocal, LockCookie, Created, Flags, - SessionItemLong) - VALUES - (@id, - @itemShort, - @timeout, - DATEADD(n, @timeout, @now), - 0, + SessionItemLong) + VALUES + (@id, + @itemShort, + @timeout, + DATEADD(n, @timeout, @now), + 0, @now, @nowLocal, 1, @@ -250,7 +250,7 @@ AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_e 0, NULL) - RETURN 0 + RETURN 0 END GO @@ -258,42 +258,42 @@ CREATE PROCEDURE [dbo].[TempInsertStateItemShort] @id nvarchar(88), @itemShort varbinary(7000), @timeout int -AS -BEGIN - DECLARE @retry INT = 10; +AS +BEGIN + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; EXEC dbo.TempInsertStateItemShort_HK @id, @itemShort, @timeout - - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH - END -- //While loop -END; -GO + END -- //While loop +END; +GO CREATE PROCEDURE [dbo].[TempUpdateStateItemLong_HK] @id nvarchar(88), @@ -301,17 +301,17 @@ CREATE PROCEDURE [dbo].[TempUpdateStateItemLong_HK] @timeout int, @lockCookie int WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER -AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') +AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), SessionItemLong = @itemLong, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 -END + RETURN 0 +END GO CREATE PROCEDURE [dbo].[TempUpdateStateItemLong] @@ -319,42 +319,42 @@ CREATE PROCEDURE [dbo].[TempUpdateStateItemLong] @itemLong varbinary(max), @timeout int, @lockCookie int -AS -BEGIN - DECLARE @retry INT = 10; +AS +BEGIN + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; EXEC dbo.TempUpdateStateItemLong_HK @id, @itemLong, @timeout, @lockCookie - - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH - END -- //While loop -END; -GO + END -- //While loop +END; +GO CREATE PROCEDURE [dbo].[TempUpdateStateItemLongNullShort_HK] @id nvarchar(88), @@ -365,15 +365,15 @@ WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english') UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), - SessionItemLong = @itemLong, + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SessionItemLong = @itemLong, SessionItemShort = NULL, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 -END + RETURN 0 +END GO CREATE PROCEDURE [dbo].[TempUpdateStateItemLongNullShort] @@ -381,42 +381,42 @@ CREATE PROCEDURE [dbo].[TempUpdateStateItemLongNullShort] @itemLong varbinary(max), @timeout int, @lockCookie int -AS -BEGIN - DECLARE @retry INT = 10; +AS +BEGIN + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; EXEC dbo.TempUpdateStateItemLongNullShort_HK @id, @itemLong, @timeout, @lockCookie - - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH - END -- //While loop -END; -GO + END -- //While loop +END; +GO CREATE PROCEDURE [dbo].[TempUpdateStateItemShort_HK] @id nvarchar(88), @@ -427,13 +427,13 @@ WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER AS BEGIN ATOMIC WITH ( TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' ) UPDATE dbo.ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), - SessionItemShort = @itemShort, + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SessionItemShort = @itemShort, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - RETURN 0 + RETURN 0 END GO @@ -442,42 +442,42 @@ CREATE PROCEDURE [dbo].[TempUpdateStateItemShort] @itemShort varbinary(max), @timeout int, @lockCookie int -AS -BEGIN - DECLARE @retry INT = 10; +AS +BEGIN + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; EXEC dbo.TempUpdateStateItemShort_HK @id, @itemShort, @timeout, @lockCookie - - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH - END -- //While loop -END; -GO + END -- //While loop +END; +GO CREATE PROCEDURE [dbo].[CreateTempTables] AS @@ -493,8 +493,8 @@ AS SessionItemShort VARBINARY(7000) NULL, SessionItemLong VARBINARY(max) NULL, Flags int NOT NULL DEFAULT 0, - - PRIMARY KEY NONCLUSTERED HASH + + PRIMARY KEY NONCLUSTERED HASH ( [SessionId] )WITH ( BUCKET_COUNT = 33554432), @@ -505,22 +505,22 @@ AS CREATE TABLE dbo.ASPStateTempApplications ( AppId int NOT NULL PRIMARY KEY, AppName char(280) NOT NULL, - ) + ) CREATE NONCLUSTERED INDEX Index_AppName ON ASPStateTempApplications(AppName) -RETURN 0 +RETURN 0 GO CREATE PROCEDURE [dbo].[DeleteExpiredSessions] AS SET NOCOUNT ON - SET DEADLOCK_PRIORITY LOW + SET DEADLOCK_PRIORITY LOW DECLARE @now datetime - SET @now = GETUTCDATE() + SET @now = GETUTCDATE() - CREATE TABLE #tblExpiredSessions - ( + CREATE TABLE #tblExpiredSessions + ( SessionId nvarchar(88) NOT NULL PRIMARY KEY ) @@ -529,10 +529,10 @@ AS FROM ASPStateTempSessions WITH (SNAPSHOT) WHERE Expires < @now - IF @@ROWCOUNT <> 0 - BEGIN + IF @@ROWCOUNT <> 0 + BEGIN DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY - FOR SELECT SessionId FROM #tblExpiredSessions + FOR SELECT SessionId FROM #tblExpiredSessions DECLARE @SessionId nvarchar(88) @@ -540,7 +540,7 @@ AS FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId - WHILE @@FETCH_STATUS = 0 + WHILE @@FETCH_STATUS = 0 BEGIN DELETE FROM ASPStateTempSessions WHERE SessionId = @SessionId AND Expires < @now FETCH NEXT FROM ExpiredSessionCursor INTO @SessionId @@ -550,18 +550,18 @@ AS DEALLOCATE ExpiredSessionCursor - END + END DROP TABLE #tblExpiredSessions -RETURN 0 +RETURN 0 GO CREATE PROCEDURE [dbo].[GetHashCode] @input tAppName, @hash int OUTPUT AS - /* + /* This sproc is based on this C# hash function: int GetHashCode(string s) @@ -582,7 +582,7 @@ AS divide our 32bit integer into the upper and lower 16 bits to do our calculation. */ - + DECLARE @hi_16bit int DECLARE @lo_16bit int DECLARE @hi_t int @@ -594,23 +594,23 @@ AS SET @hi_16bit = 0 SET @lo_16bit = 5381 - + SET @len = DATALENGTH(@input) SET @i = 1 - + WHILE (@i <= @len) BEGIN SET @c = ASCII(SUBSTRING(@input, @i, 1)) - /* Formula: + /* Formula: hash = ((hash << 5) + hash) ^ c */ /* hash << 5 */ SET @hi_t = @hi_16bit * 32 /* high 16bits << 5 */ SET @hi_t = @hi_t & 0xFFFF /* zero out overflow */ - + SET @lo_t = @lo_16bit * 32 /* low 16bits << 5 */ - + SET @carry = @lo_16bit & 0x1F0000 /* move low 16bits carryover to hi 16bits */ SET @carry = @carry / 0x10000 /* >> 16 */ SET @hi_t = @hi_t + @carry @@ -651,7 +651,7 @@ BEGIN DECLARE @dot int DECLARE @hyphen int DECLARE @SqlToExec nchar(4000) - + SELECT @@ver = 7 SELECT @version = @@Version SELECT @hyphen = CHARINDEX(N' - ', @version) @@ -680,36 +680,36 @@ AS WHERE AppName = @appName IF @appId IS NULL BEGIN - BEGIN TRAN + BEGIN TRAN SELECT @appId = AppId FROM ASPStateTempApplications WITH (TABLOCKX) WHERE AppName = @appName - + IF @appId IS NULL BEGIN EXEC GetHashCode @appName, @appId OUTPUT - + INSERT ASPStateTempApplications VALUES (@appId, @appName) - - IF @@ERROR = 2627 + + IF @@ERROR = 2627 BEGIN DECLARE @dupApp tAppName - + SELECT @dupApp = RTRIM(AppName) - FROM ASPStateTempApplications + FROM ASPStateTempApplications WHERE AppId = @appId - - RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', + + RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', 18, 1, @appName, @dupApp) END END COMMIT END -RETURN 0 +RETURN 0 GO @@ -725,15 +725,15 @@ AS DECLARE @now AS datetime SET @now = GETUTCDATE() - DECLARE @retry INT = 10; + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @locked = Locked, @lockDate = LockDateLocal, @lockCookie = LockCookie, @@ -753,31 +753,31 @@ AS IF @length IS NOT NULL BEGIN SELECT @textptr END - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH - END -- //While loop - RETURN 0 + END -- //While loop + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItem2] @@ -792,14 +792,14 @@ AS DECLARE @now AS datetime SET @now = GETUTCDATE() - DECLARE @retry INT = 10; + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @locked = Locked, @lockAge = DATEDIFF(second, LockDate, @now), @lockCookie = LockCookie, @@ -819,31 +819,31 @@ AS IF @length IS NOT NULL BEGIN SELECT @textptr END - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItem3] @@ -859,14 +859,14 @@ AS DECLARE @now AS datetime SET @now = GETUTCDATE() - DECLARE @retry INT = 10; + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), @locked = Locked, @lockAge = DATEDIFF(second, LockDate, @now), @lockCookie = LockCookie, @@ -897,31 +897,31 @@ AS IF @length IS NOT NULL BEGIN SELECT @textptr END - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItemExclusive] @@ -938,15 +938,15 @@ AS SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - - DECLARE @retry INT = 10; + + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), LockDate = CASE Locked WHEN 0 THEN @now ELSE LockDate @@ -977,31 +977,31 @@ AS IF @length IS NOT NULL BEGIN SELECT @textptr END - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetStateItemExclusive2] @@ -1019,14 +1019,14 @@ AS SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - DECLARE @retry INT = 10; + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, @now), + SET Expires = DATEADD(n, Timeout, @now), LockDate = CASE Locked WHEN 0 THEN @now ELSE LockDate @@ -1061,31 +1061,31 @@ AS IF @length IS NOT NULL BEGIN SELECT @textptr END - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempGetVersion] @@ -1094,174 +1094,174 @@ AS SELECT @ver = '2' RETURN 0 GO - + CREATE PROCEDURE [dbo].[TempInsertStateItemLong] @id nvarchar(88), @itemLong image, @timeout int -AS +AS DECLARE @now AS datetime DECLARE @nowLocal AS datetime - + SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - DECLARE @retry INT = 10; + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; - INSERT ASPStateTempSessions - (SessionId, - SessionItemLong, - Timeout, - Expires, - Locked, + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; + INSERT ASPStateTempSessions + (SessionId, + SessionItemLong, + Timeout, + Expires, + Locked, LockDate, LockDateLocal, - LockCookie) - VALUES - (@id, - @itemLong, - @timeout, - DATEADD(n, @timeout, @now), - 0, + LockCookie) + VALUES + (@id, + @itemLong, + @timeout, + DATEADD(n, @timeout, @now), + 0, @now, @nowLocal, 1) - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempInsertUninitializedItem] @id nvarchar(88), @itemShort varbinary(7000), @timeout int -AS +AS DECLARE @now AS datetime DECLARE @nowLocal AS datetime - + SET @now = GETUTCDATE() SET @nowLocal = GETDATE() - DECLARE @retry INT = 10; + DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; - INSERT ASPStateTempSessions - (SessionId, - SessionItemShort, - Timeout, - Expires, - Locked, + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; + INSERT ASPStateTempSessions + (SessionId, + SessionItemShort, + Timeout, + Expires, + Locked, LockDate, LockDateLocal, LockCookie, - Flags) - VALUES - (@id, - @itemShort, - @timeout, - DATEADD(n, @timeout, @now), - 0, + Flags) + VALUES + (@id, + @itemShort, + @timeout, + DATEADD(n, @timeout, @now), + 0, @now, @nowLocal, 1, 1) - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempReleaseStateItemExclusive] @id nvarchar(88), @lockCookie int AS -DECLARE @retry INT = 10; +DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY + WHILE (@retry > 0) + BEGIN + BEGIN TRY BEGIN TRANSACTION; UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, Timeout, GETUTCDATE()), + SET Expires = DATEADD(n, Timeout, GETUTCDATE()), Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempRemoveStateItem] @@ -1269,79 +1269,79 @@ CREATE PROCEDURE [dbo].[TempRemoveStateItem] @lockCookie int AS -DECLARE @retry INT = 10; +DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; DELETE ASPStateTempSessions WHERE SessionId = @id AND LockCookie = @lockCookie - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO CREATE PROCEDURE [dbo].[TempResetTimeout] - @id nvarchar(88) + @id nvarchar(88) AS -DECLARE @retry INT = 10; +DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; UPDATE ASPStateTempSessions SET Expires = DATEADD(n, Timeout, GETUTCDATE()) WHERE SessionId = @id - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - - RETURN 0 + + RETURN 0 GO CREATE PROCEDURE [dbo].[TempUpdateStateItemShortNullLong] @@ -1349,44 +1349,44 @@ CREATE PROCEDURE [dbo].[TempUpdateStateItemShortNullLong] @itemShort varbinary(7000), @timeout int, @lockCookie int -AS -DECLARE @retry INT = 10; +AS +DECLARE @retry INT = 10; - WHILE (@retry > 0) - BEGIN - BEGIN TRY - BEGIN TRANSACTION; + WHILE (@retry > 0) + BEGIN + BEGIN TRY + BEGIN TRANSACTION; UPDATE ASPStateTempSessions - SET Expires = DATEADD(n, @timeout, GETUTCDATE()), - SessionItemShort = @itemShort, - SessionItemLong = NULL, + SET Expires = DATEADD(n, @timeout, GETUTCDATE()), + SessionItemShort = @itemShort, + SessionItemLong = NULL, Timeout = @timeout, Locked = 0 WHERE SessionId = @id AND LockCookie = @lockCookie - COMMIT TRANSACTION; - SET @retry = 0; -- //Stops the loop. - END TRY + COMMIT TRANSACTION; + SET @retry = 0; -- //Stops the loop. + END TRY - BEGIN CATCH - SET @retry -= 1; + BEGIN CATCH + SET @retry -= 1; - IF (@retry > 0 AND - ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) - ) - BEGIN - IF XACT_STATE() = -1 - ROLLBACK TRANSACTION; + IF (@retry > 0 AND + ERROR_NUMBER() in (41302, 41305, 41325, 41301, 41839, 1205) + ) + BEGIN + IF XACT_STATE() = -1 + ROLLBACK TRANSACTION; - WAITFOR DELAY '00:00:00.001'; - END - ELSE - BEGIN - PRINT 'Suffered an error for which Retry is inappropriate.'; - THROW; - END - END CATCH + WAITFOR DELAY '00:00:00.001'; + END + ELSE + BEGIN + PRINT 'Suffered an error for which Retry is inappropriate.'; + THROW; + END + END CATCH END -- //While loop - RETURN 0 + RETURN 0 GO diff --git a/samples/applications/azure-data-studio/README.md b/samples/applications/azure-data-studio/README.md index f3482555..e00f06e1 100644 --- a/samples/applications/azure-data-studio/README.md +++ b/samples/applications/azure-data-studio/README.md @@ -49,7 +49,7 @@ For Parameterization.ipynb Sample: ## Sample details -This Notebook allows users to follow along the docs as well as use a already parameterized notebook. +This Notebook allows users to follow along the docs as well as use a already parameterized notebook. ## Related Links diff --git a/samples/applications/iot-connected-car/DataGenerator/DataGenerator.csproj b/samples/applications/iot-connected-car/DataGenerator/DataGenerator.csproj index 198a7392..56057d7a 100644 --- a/samples/applications/iot-connected-car/DataGenerator/DataGenerator.csproj +++ b/samples/applications/iot-connected-car/DataGenerator/DataGenerator.csproj @@ -48,7 +48,7 @@ - diff --git a/samples/applications/iot-connected-car/WinFormsClient/Properties/AssemblyInfo.cs b/samples/applications/iot-connected-car/WinFormsClient/Properties/AssemblyInfo.cs index ed0ca63d..0775d690 100644 --- a/samples/applications/iot-connected-car/WinFormsClient/Properties/AssemblyInfo.cs +++ b/samples/applications/iot-connected-car/WinFormsClient/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Client")] @@ -14,8 +14,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -25,11 +25,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.Designer.cs b/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.Designer.cs index fe34baac..6d43c482 100644 --- a/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.Designer.cs +++ b/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace Client.Properties { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -23,15 +23,15 @@ namespace Client.Properties { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// @@ -45,7 +45,7 @@ namespace Client.Properties { return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. diff --git a/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.resx b/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.resx index af7dbebb..9c90483a 100644 --- a/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.resx +++ b/samples/applications/iot-connected-car/WinFormsClient/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/applications/iot-connected-car/WinFormsClient/WinFormsClient.csproj b/samples/applications/iot-connected-car/WinFormsClient/WinFormsClient.csproj index b084d4d8..a69b7312 100644 --- a/samples/applications/iot-connected-car/WinFormsClient/WinFormsClient.csproj +++ b/samples/applications/iot-connected-car/WinFormsClient/WinFormsClient.csproj @@ -98,7 +98,7 @@ - - + diff --git a/samples/applications/iot-smart-grid/ConsoleClient/ConsoleClient.csproj b/samples/applications/iot-smart-grid/ConsoleClient/ConsoleClient.csproj index 8730b662..d54a4bb1 100644 --- a/samples/applications/iot-smart-grid/ConsoleClient/ConsoleClient.csproj +++ b/samples/applications/iot-smart-grid/ConsoleClient/ConsoleClient.csproj @@ -63,7 +63,7 @@ - diff --git a/samples/applications/iot-smart-grid/WinFormsClient/Properties/AssemblyInfo.cs b/samples/applications/iot-smart-grid/WinFormsClient/Properties/AssemblyInfo.cs index ed0ca63d..0775d690 100644 --- a/samples/applications/iot-smart-grid/WinFormsClient/Properties/AssemblyInfo.cs +++ b/samples/applications/iot-smart-grid/WinFormsClient/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Client")] @@ -14,8 +14,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -25,11 +25,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.Designer.cs b/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.Designer.cs index fe34baac..6d43c482 100644 --- a/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.Designer.cs +++ b/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace Client.Properties { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -23,15 +23,15 @@ namespace Client.Properties { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// @@ -45,7 +45,7 @@ namespace Client.Properties { return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. diff --git a/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.resx b/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.resx index af7dbebb..9c90483a 100644 --- a/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.resx +++ b/samples/applications/iot-smart-grid/WinFormsClient/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/applications/iot-smart-grid/WinFormsClient/WinFormsClient.csproj b/samples/applications/iot-smart-grid/WinFormsClient/WinFormsClient.csproj index 047e63ae..1f375989 100644 --- a/samples/applications/iot-smart-grid/WinFormsClient/WinFormsClient.csproj +++ b/samples/applications/iot-smart-grid/WinFormsClient/WinFormsClient.csproj @@ -97,7 +97,7 @@ - StVf`Ff3`{2dp6q@I3l%(ERNHW%LD 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%0AVf#OHlM!2H zjI@^0z!Nw@pTHmchQM>+%ruL?$X{MhsOo$_JA5a z*6b{pl4hlQQ<(jlF`%zF7g=xBWa($@@zT>dTUy!_UA?Sa2JCCoWL?AB#`PrqeJo@; zOj1ebJxmJa7U=IJmE*gZF-|VT%OTQlvZ5iDhVRA)yWNsdJ9&Cs#gR-_2{I>W$+gVX zcX=vP%%d0|P61%%fJkNqUd9?Al^BD7$n5-ko>>R%clPZu`&gl%2W4!cUe<^ijxd%& zpXc4*V?#vRLgLP2(}13_+VExYnG7emg0ZDq(z;g^iW0N{Hsqx$Lo4sG6s8hb++f5_+rgA=>Q>Mr1 z_G#Kn=LPMg^R#xui96vml0OXJd?S?dPC3u0o}=N*uPS4tksQ?*&!`Qz^i0@M$2;<{ z8xO6X3D3T!dY{sl>E1owujhrZpU+XX`HV`iUk@e8S)s0@;ktU9d4J`D!CQGud+$6T zyXuLMeR5p>%ER(s9@abM`_@h?Gll(mBGmq?=KU$XKPgY=Nxh@wzf-AW+Tn-m&+Gs3 zu(!|Wb@!mWpr@O4=gU2!au4adN7d$&`u)7V;X3a*Wv3u|HC^kQ(^y;j z<>oFd3*<$eFE8pm`Ams5{!Muxx)qPi_1LhlMPJj;3bx=`U>6N`ZW$N;cPnDqQOUjX zSoDP0=xiMml_@Y;PstaU8*1tfWzw3acHJJH5NSO}bzZ031EQbjDngo(>GmYdR8T-1v}zC{Ut+{Z_Wx|4k{i44s}*Mh*6ol?9g+lFd046 zi@t;=wj-3lhW!&!fPKl2RLch>HTZiZAj&}5U(?&O!f~i;o>#rDTDR$)IR`Z3Rh7Fh z`3HST51{Qt1JM^+@)|`-V(kaqbelyAvRv3~*&dz=C2^YMFE@&>w9GNE4pXjNBze0Pbx zvJ)32Gt}w~mGK)&>{gjPJ}nPWV2k_$wE!N$A&E7##(-3c<%vE6pTIc(nI*%I@4yc- zgvr3Np5j#j9$9H*w)Mi1-Jx#tWIPaL#K2q0-g-@6ZWL}X?_i*7Mjqk{nA{r5{m&;RucE0{rqN+|t?@@;DTLIWP|ehEpvW ziOvx1K9~k%rB!<7IWx}&yPyeK{n%8;^AqDDm^o$!E!lP)V~=?^6w3G(`)m3^OUxU1 znC0wwh#gc3&oo^|1IjveB)w}!`jpVSh=;+6>`selc z--eiu;~}o&QPmskBDe0_D)~j#^(B@2lHMIxTjdc#$+rte*bQriW(7;js&m%Dxw5@{ zPPUfcS5{rOEIEUEgBOoT;9F%M!lp?XY>QYXvCELLezR&B)Hm6$t8G8jNqzJ5-uN{x48oU%w&^$auXr!|^BTi;3Z$99iC88F(^Zd)_)#LzEfv z-@^aNae{jn=N}!|*6TR`E57w#PWl=e{^F@aXKw$qM$-1@ z-#gv*(!I(M^gFHA4Rrpdh+{E=388$)!rw} zirBnd6x6f;%r$NiA!B{XmVc7JmLC(Kv<4A7jrG}543ywS4G7EBa6AB6p#5#*o%}Tu~$12$#9j&<7e{T~$+v;pfa*QwT4;JL;HR0WD zD((BS?~|hJ^MJI)Gv4ur64<=? z@As}@rEnFi7qvhYDC0NO0TpT6``BR`jZIa9YUWbjgsy-HVVY`hx`W3)y*UbSDQ(V)#v33aXr`M%z5 z!W@Qt-ftSoxKQI{aa!i+%CN^|1H0M(%}1TiZgb^R7|!3Y;xkq|vQSBW=Nko*H9qajU}TXpe?-P77<3%BrTh zz?;7(|2?n26e9`W+$iX6b_`(KTRVob{cp8Km&P*^sc0Euk}RT2WC>j=o2TubpU@q- z(T7y#{$LNCtvjr-_cyc39t-wS@(LXD_$l4b)XtvbBEbfW4Rwm@z$Qzaho)t$vXMA+DDYdevPii>dD0LHv8pOwPm%js+Ijs2WwY0zh0>PcXmDP z))!>Fdq31)*8e`0ygHQXt4-7WM14g&y|qbt+NmqrnXd2R4yo3UKA`!s1c-)$IQHG4EHle$0E^^Dk|k;14Dd*ny?2}UEXTT$cU*sjV&2DSy@==W z`*ek9pDbcHI#xk?QH<1CBS`f7s4+nKfNOjQ_NF6IL$P-z?QOt6(Bzn*`;y6LxH$_;^VIScOz`igp?> zjuGI;2CHnniZ}>dQDd~*FxzR_a&!Z097mnCMlt4WT=V$k*PADwu=7uhwa-8;P ziAbv&?FvDZwGAZJRk~X*tONf>azt8;GDp`tq*0v>ql&Q>9^C;^LG8w`y$O*LvVM0w zHM~tDLyTny!n|w`{vD(PsFt;rUE!HAJ<>OOWuQAmdVtaRJgDhxpe3A&LjTZ}&KDVy zmyhD;&}viqyh!~qMd5E;Lp)AcJ+P6>iW8`C8c_o-AweL8LR-KAJVewK`v#@T+LK*7 zV~rzqq=4gD8BaM%0{fBWd%QWtc%C9oqC+vVNRi>Le9au1F4Gn?*&Z)nQwGY67o2yI z7E_NYF|$wa;dvYM9^O-=&adfRrOAhNf_oqVUMRre< z?00-~Si5gO9r7_=8S|*hlaKLbeZ`(9FNGbrspqKL=J_L`M(>AmyxGd5Vb|`*!?*06 z($HStC&xUY+9=0f--mTi59v>Fw7?-a&d$_c!^^||-81S7>(lG=v@6Oy?U{0!d>Yq= zJyZttl-<31lnXL0?CpKI_Ej0slX2nw3YEQDSJM*q`tH`7v8v%RmF25^9aq(t>g`Ik z(XTeI)Xw3wCYy=&Yhh28ak}f%`-$p{qH}cDtvh;kS^WzAWyhB3`j)-MC+f|N`hxI( zqRL3>R*4=x=`HwM@;kW@Qw}DhwV>-ELz`Md!FU1&f< zfJo}5jTnO+F$%oIHkMi+p(fBQp7{&s_CaS%Yj_(qPWQo7Xs9~#*a(%N*Z#tkCEbO_ z`bbr7&G_U>NnMVfUm>Z;d-Gw(ohxY$3ou@%nUbZrx>ZtNzdTsPEpt8(*YJuSJ-Jzu z*R4T*BThLRdyg!b-(TJGAhMhHW9KS*xY+%My|7lO4xSgK!CQk=M;q+qOz9r=4!;>0 zKT)ouSM;cn+^XLw3#OR@_N;MY-F)@>gDT@W%k!LDw3fsjAOo?V4l!wt1v@31MT|;Y zD9Z&q$W4{y!u4R)$l6gf&QKZ)iLE8q>3*8-PKEkjmUU#7YJaw~u4hN}Zc^t&*-JjD zyUF28tS9UzpVo6QV^NtJYOy6{Zs;cwa*yfDxEIi$Xb1ZI*s3#|RtSpLCllJy%DfM~ zZ3JzKV}jFe(>t#IE@^9rpOc65m(6RqUROKVh5or;PYuhIroO$}(Y{MxGo#);$efbB z?ZMKWDmNk2x=~kt#^0^l|DIN<^>0)w?bAo#9q%gEd%oY$+$Y~9+uPdOH|i-pJQi%x zX-S^_o!X15p5?*WtSx*+aCP>QwMWN$yPEgHhtbO|7u=yM;$fi}yA@H6tU=HGmcE-_ z5HAFeh4-=#I?~>rKu3^Npbrf__xJfy_@JOF$Ut00Sj*G?Z0;Dej?zdyNDj<^WfY=O zOk83DPs^qv{GOaJMm?es{l`!x>Qz(QfF$!@`^RN-?uXajl$ zSE3YG*;4L_`Ba{+LC=s+(lPc38%JsuoBMt#i*1Eqz?#y~S!~SLLP0=!M#BQZPS%F{ zi;>0VeqtetniqLpMT>#6yX>2FR?f)GVyhl)YBBIQS83hWk8qoTM~Y4{nzGnDDr}@gW|^Ri zm<31f*+MZAv)DWqTgt%glu|DU_Eu`wqjDT~eh9i3Thacm z9F{+Repzg^xI%4>ge*4qb#!L2d2AO)78_$-DVV$1ve@Fd;gq8_i!F{3D>@n!_Ab2l z=v4TDFP<#6I1^Y^MqU;hy}y*jHcNYBFb_a8(GZS|!T0dy^1rbD5~uP{nZ@Rj_|z?S z!@w%_=0;H*0}{*6GmDK8jI=B^_n8k3~5s_9k zTH7+vHW=q7Ul7Z(sI59xprudyMoj-va;Aby3w7*<}s4X zLYx_LE+;dMgetCrrHEH>9Z z+Oya^%F&m_#<(udEH;mPbY-zIrb}6DHJ#~VZZguc*jT@jc@`TzA1PUE?(68!V)Hmh zOBNfW87*0C9?PXHw(Jh!%*jZ~Vsn2-XBJx=+epb`bAK;ov3VXY#w<2QKDx8m;s{4? z7Mn--i<-q2d-qS5#YT%GC5z2{9i3Th9^1u{#l~1K#w@lt?$MmZ7RPugi!IK?$joA+ z_m{HRY~dRnS!`a>k(|ZG2u4~KoBMq6WwFI^kJcY#!rC%wmf@ z|3%GWqkk7q7Mn+Vab>Z2%$Ks*TA#(n3|-1%yO1n4&)De9Vqw`+2csu~m;YwHS<^EH;mHv}Lh*RF|^YW+lwT z#d8*$NBd8a#n!5&weqr7Mru!n2V8?#pXVb z#IxAw`AErPb6-b)7MsU8TC&&}&1lJD^H?rrv1PN^n3Iu|#peEw&MdY#wvm#>=KfyF zV)Hy)j9F}qd~|2A#SxC)EH;nu7d4A5_U@l9i;WgXN*0^@Iy$r1JhqD?i;b~fj9F}P z+@m>*EspV07F(Q&k(tFt?=NMs*+$BRPwW5sb7fHuw4B%VLY;9<5ny9^dH8 zVq;vRD~pX0T^w0#9_huE#TLhWDT|GnxOlSIT8%c1NgFL$Y#!-o&0@=rZuDibd32*Y zi_K#kiCJv1=f9{~Z1nHq$ztV&s+W`hSZ#ZrW0P zwI|t_{4n(3hq~UXZ|~MUbu_~7_Rt0=?(S9XoAr0ATH&4OKGs(s)_G_QMqR(6OcaMJXCVLFK zR5LTbPc1TkX^Hh=<{2wdv#f#FXRpe#>jr(lPk$M&YuT?FINz5$zN4M{!kST*@78N( zHmUEl#9D6;rOW*vUWVC(j(HvZ9rHVSJ7#zEb@b@Ek<8P5Uq^Sxhr@4g2eW;fN-XYJ zsOLB8_cr}Dk~#XjRA1bn>wZ1!?ikQ7?;A-^DAlXGZk1^yvpN>3TyMwu`-);^%?hMq7lKkw9}pe<}a=HooNDfl!LM zU#~K(4>qvPC0Jh=X8S&s=EP{ewjX*&SR=1rL(f?gLoq8FvGA{x{~UVlUI2@GlCuFm zcc_e^6bRX?J7X}gv|hb`wxbC_u@B>uf3EqTsr6#r7HFn>wVvt$3usU&Vx=U+Q%yt?toq`c=)X%o$b@etoqV?)KI19A!e1opB z;REHHl1X9I;A@0kiUaWNaH1+LU*g7J3_Xhyc)il+uZ@e z-`-{@jxby`lWBg?TCEIc*aP=atsT1hsp?|2wrUL;itO1O-oK|!{b+klPwrBwv%21w zyr-=Z){NEOsr3Vo4vI=aQST4^_^F9i zw7N~Bk36TyLuqwSv+W}ER%N>^Q*T%|s5@K|ECQSm*4{Mlz{$W@k_5q|T+fo}z2fgwB^c zm*}^VEbg4#IS~F&>YUX%Mb947-DH)f)ODTH^nX%kudW``Gu|yxJ(Qi?nWtdo6Ob&w z0ClV;@w}`$7~vU#3*Mz`csldI+(QL{4AyyPcbeUu^$Y`#0LZ z+D=QndsZdBuHWav^~);x4V5^h`y=h&)HB{Sl4sk$(*89)e^Ga*+l%l%pjo;zKqc}G z?VqTfs-37kQ2T7{aIKL%QhTL#toE(iL;C+mwMT2T{h8Y5YA@*BL$#AC_qfVEs&5|9 zljF7LYe!YSksMKpFNQK_R2$_!TZ2mFc||_|qOWUuSAW;!u10cI*UGN$u7R$x`aefc zXmzaKHj?RGbGt6<8rL;n*S#t|L**LDRNY^#|6}z{U)Q`)g4W9IRpm&m)ZA|o^Unqj%8MEM0qDJ^N``H_AXqUeg_PXqU<&YnEqwd7wOC0lkfwg3Q1j zeA#%3eV6tQhT3?#Q8hyM?$R~=iES7g_>y*`{AMC6WKNak;Pj}R6L2uO zSEt4;(Yr;-JxQOmkq;=B8!2(O{sRm5YJ7Y2W?M2xrRIbuvvsvYZ@Am5|1(tcY+WBz zsoCMnBJ3|$9Z(!|lyw>dwOaD`j58~69Awcb1#SzJgI+K~<^~8ktD1J`4k$w7*`W2< zrC<62BzS%)&r>9Q-mKRZrOVt7?Zq@L(lbjoNVHzTGNm%C&@(hgxHD7;I=4lA14`~v z>zg$%yaC^#mr<&NYC-#;!2B)CBZGRjOFv-6deMqc)eqNS(eLB+M)K+UQ}q{h-AMkY z`my?{`f*)7Q-8kx+4^Z+Jyic<{iMphsOuy8`=ox4>iT&7C6#`qUT^UH1(ovkL-jND z6Z+x-eb19D%+QN8W_^5ewe*$ucMNtckhDA~x%!6YeIr?@tND7mNb>Xb9Y-ZS-x@R{ zG@kB`&vZPYw|t2E(i$mhHr)YTllo2jcC^_!<*gJC_4d8VMyv58%S zT|J^m?-X5{AnL@bbm?lPC|19oPY>_=yRHz$x=i=bvPN=^s9F9Q^bLA8IZ(WDT?=&m zUOnkiO+De+6xB3QS4HTiUqF`OXYup@*VFS~+;`^bZ#9zS-|stf_;e%rgEO~%_x2OI zKl0cS{e5cj^Nr-#i|;;t`=4nwj@*0Zy(bo*X(U&^^!G=${n<-Te*ek5Y*36OA1{l? zzJT%AAAq6tZ9q9(eTN|HosvtDo!{Apjl=l!PRXWi;l821V)p>c_zLQaRIo#I$M^71 z>UAk_FO~zEf$!oBtkAQ4!ruLQpWQQab-0%-Cp|M_B2;Lbdhhz(Kjauw_Fc(1@dQQ! z6$h8OH-DgRC|( z?;0V#8j4)SVOFZvje4^wKxw4;U`=X8m>INB^wFN6i4N%g!%bauLC{kvo9d&Kyk1y! zyEN8i!js;BDLlo#z}L1YTqi67(~2`gpNetOXsV2#ku#%N?gQ_H8d`2fJuHjyAF6J`jU~n(X-taTZBh8mNGJOMYjLC!gZyBF@`GVf@mf5yWzzS>+P;8p& z+V_X=pw#YA)yDAGL9s~%nRTa>Nx zG;o#r1vY>i$dD7&UXSYO7iC)6_4dYewNCv!={?tnv-c= zi&|y35Sm7YAK$v970e_61!L4RWF0Owv7? zBO2yX>4YzL)}>9(?0lv0G^;C8D>~;Cm06}5s8`lI)$p+N$oy)pR$rKfC~e)W*+gr+ zN6(;6rq94Xki1WjyWjtqm=*8FtHt1{1oNxf1Lz$Q*I3RQz&EYk{T@`I#tr~4l zMa~X*S6fi)sZFl+OY@ph8?24f|0`=_Yq#rvub%ekmpOfR?e5xDdN#c_w>GbKm&)?cNUfq1lGfKQmb@tRYb>-JKA49rAa{|n>ZqS5=%&ny;uM&I}!}C2Nm9NJlDLmiyP}8*{UWDY2hO z{`Av*iTX&C?QP37#@HrKEx;vzqukFGSV&*7PMIfe(-mu0#2@;SkF~s7asaXbvUa!Z z(|wYTkqlZ{vXP{*ZBt^l{w~vRk0faB@mcf-|Hb?De;`QKJde_MS#DUX`9iZYwYO!t zYTy1h<00u$--;d(q#e8^cuDZ8k0$%24!$ST?dR1^)^( zGWDWl{VV1EW@8V>D+2@il(jqex7qHzSst0Kfj$E{8w37ecZQl9^6wMu+0u5GWZZqC z*3|Q=zCzA1jevr;>I36S`TAaGAaU`FJ%LlWh|A zEYU;0hFc>$7%R{R@H3VB0~Mn$#>fGE6>*E2pgxh_f%~*?o?vQW{G;ED`@*b_d`s;q zhuImd4fGi5f&Pv?F{>Z14RRv%F-l{%XteO2^&kJAo)|ct)l`1o}K3`9{8e1Qz_v!s*^>Ml{ z_aqyaHa_fpz&h+x|19I!>j}JD>cZ~1H9!NLKEeYK0fa;y&79J3Wo;~KF_yQfk6)}! ztRege{6R-Uo3Z9o?CmY;0}x<|fYuHrSBXN;mwl&4)ca=rLc`%oed0e{T^IDy=xL=4 z+AdtEzhj*|>6GWITSM6_x9aa$rDwAPw_2#uc-(mcPq;B~!uisLua_tHR@KBC>bzd% z(T=az-#mWaqQ2u3Va2mjITCb_Wbadwq4Dv|mITh#68&AGr%OAJ2Kjo5{^IYMEZO^$ zp~TDb-0=2KJM(hct(qaQ0c?jZp+~a=z~3cp?cmJ4y0>J~CO?6-D6Uw8F8$w{d{NXM zI=MADrYlzEK=PMKdwY~CFJ>e}nfxHssBa;zC`u%5d^WRAU$;1_o3{QS7>Hx?(f zGpvVs33SbK0^~7cwn_g`S3EH%WGqA)v0D2=-&jXdm2N=2;0_jYR;+b= zk5>RHVLryZnOb4Lfws^OtQJrn^EdaBK2*i&Fgpu1i+fd1ltL%VOL0);&418g-WU3J zb%?LIO*8__SXG1$5jK{jt0Ow9TU!x&&ZykZT4WvlB6UPw$9nUWzj5~A%8Z(ou#QoL zxvH2MMw{1A&6PcC)aF@b4be6H)_PP!S~`5$(vqRn+I311J;tgynJdH0%?h(OTYra+ znYmu{dy!~7lo-12cqXiuykY*|-*J<)7FL5fFOGeY`p)bCf0oRn-W4NfHj7>&UG7M} zs$WA=q)SLw_a;9HvoR^u;+an8#_(2d)q1RHbE{aH2mjS|AN}|N$Hmltw*Jm9{0}dF zn2W}#q)Vl2NrN%M2#6b1a(5n+?xDYrLyo1y?~DuTV?g*s0LI9xt54Odk?@j zsDtf|&|q8bdCylV9ftF!bi3Hjl7PR^|8#xUs=Q?;bS%bcI|iI-xREN`lfT!ONXl5H z89Q@~T>t|X3+87+=*K+oXV*_e`n<{U?!o5qc# z94^wt$XVh&ew&m=mRkc>(-@GGirIKYQq{AH0Qp+`f=o9tNQ;1+5M`bKt5G_ zSZ^P$O-ufb;y(^6@`LD)r<#!<$7)9u2QpnVoX3`BVHJRVc=#N72kQyQX&CF7Ic#CG=dN7zi*`$DeaR8uX433kgj|w|9&O zawk^gpJ*CP^d^#e_D)ipmh7p4WdENsx1@f5@+dNX= zSmb6_ag*XR@(_`a!dRdlPE$`ARn+mIP2iWQqi2l2 z#Jq3PZ2v^#Lc1?Q01~2c*sDKYkZu}jK46I?ji^X**b)nnQH{m>lJAw)XE4k=FjJ0> zAd2Cb;u*f&jBiLIBeF3RCloL7K>bUh?BQmF#IgDj-5=4{Z*ROJy}glqAqR1^nvI4S zFKLGeh-E?QX&nKvp!t4KaS(%wd}t)|W!bz=+A5lGeuV}_VRs3FnMLF6bYbCK`SOU> z%0@U`5qx&WQ#^SC!dpCz;AnR)LIG@{UZ|c|#}Nnn6mbw^5WaULdG4D}HIo1Ls~>+Z zi)EI8@y5q>U7>61SNPs6IUtW$MIBt*2F_!tL}%TRT-#58t? z6X>>~j_H#%^nfYb)ME$wFu-HmY3;!Y9S8A(r^6Q5-*YkZPEku zelQ#=V&4`%9_SLkaC+!vJ`x2;XJ+{Z7;>vqghAcHj>`hZyenYJoDlCwEDupZv{~eR z;1j<1YJ6Iy9?~nM7WmHPP4D}Ru1WIc7d`NO!r!@}7t2)RRNWD6X+M0c`k6JPTic4F z$NfNvR0QJCo;PWfNbcAc;C9i|Zpe=in#$PlS4-BGgv)SQVTD5Hs85X(qvCeBHsV)dU@T~V-ek^&_KU0uli(c@>fo`DP z096Zv_GGS<^?*m3fj0yDY1E0Jd1xqGl3$f%LO(y!hO}B93F`)qP*cCdII=s z+oF86T5W5Y#&Uah=s(_R#uC4*@-x%c8qFB8Lsmz_vOwK2uEX5V&zHCLL#k}|U*JXD}`3Qd0>inmyB!V4>*iLv!f5+UWC8s}Q$-%y!mshI1 zu0}cEA8(G7(^komL_&+!8}kNJDJWIBMK~9&89pP{*js!)YJvrx7A)PT&}`e? zF141GAJ6Y0-KqJ-vH})3V}+Wbz03&Ke!QIE3S+TPt0CIOH|3G>6}TBOZ>4I$qY3}1 z@@8gnFK?0hk;cgA@TVh>lzHVk^)vNq;(2^x%%k!>9&X{sd@%SmAJW?g<*~$fc{u#y z`Ls{-Skp7gyW-f^sSjBX=D7Mz^(pc%PHE}Gyu3b1UdXX}-zWd(W%X-Rx?3L1arGWO z>#k4L{Zu_!kn>SOTi0p+>{}%Ee7tBaoWgQd^erO6S&Ga1Ew^jl@FV$qTg2^^K`KWE z0QOi(%Yu|M#IkP0dKE`r<%1lb{4@CgXG{OORg&_JAyTC5cVu-_d3j#=f=HU>A@ZcZ zRU?`?iN9M^dZg-k$l+AQm^48S=Sba_`Xy=Au|k_WMksxA$8AeBOvNv9#Etd|Cg7Ckklcu+Z82R)0~s4!qZ zyUN&6pnO0Z-x0lRPhPo);18<y}Gvb;{3iu;x}eX<|K9`<}%<>5f~`W6Vwz**}Nv5qv%6OXK8ctUxjPT5A&3rnW%wfXT;b@ zY4kfNLb>I#XK-1-Z4`d{z=%5Pow z(RZy)eU8liBGG_|qpadI{d(n7pCjJO`p<@2U)cwVRpWplnUNV{^Kc$v-0BO;vV z-Zui+PGR3r{l;KD@4=*J`_;Giw0%g{L}*k#E1%UX=h-7SBS%9&ElJ}6-LJbH!jJ93 zohYj^!;3YFR4OK31^J)3Kx5l4oFU^dT3qs8P1@iM9!KlA5sQpza1e4#Er}MPX0d8d z{hC!AjjVfC9l1ODH;cT9_Mr>#>wN(};c~vq_o>)^mA`X|T7nkAW!M3S8K(tg0ap3K z{GQCBeX)C!e^6~eGJG1!M@*0{CP1HkqQxF&eW2r8WY**5L=q#Gi~M@B?U#i(FPeop;Fry-k_DL$5q)K~gY`}6W} zKBK(%<00$)*_PhYi$}jq5{T^-MIekW6QhcTALGAPMojzLoj;ou$`VXAsw~FJ$|Ap>dve95>f7m>xjcR3Vf{#@kiPM;lJoPb?)ZOJH8>6$to?xOovkzL8Gp4W_CKio zJ@OaQ8^;D`X&3a6NUrVrZ}}UK?T)5z79EJMkyGF;{D)o?VPd(S+Jlny)2>!|<_O7{ zIbbfbJP1C|isikx@ebVe41$r+K)xsX&0o;ptamrHcX%$Uyto@Q*52edgrC2W+$4|f zu5%gl_l7%i>B+Z8x4!pWHvZlEhEdE8vI!KJ``w`gF`Ie+u3Kkhsm_Ni#|S)Hdd_UY z5tv)7m~c|?6WO2A%oh|2C}BPL8!5)?VJ2Qx31=G+sZxZ`<)MbMbc)Q1MniqXCE@#u z&!BPcMQn+Zly?uTu|b{U%9*D^*^2fpW?@jzv$^x*&*j0B9sh`YypJd=o_zT)$qw?2 z{-2W1_qd*L|B(KZCx4{=sQxyRyg!+_`a%IGX)o&+9xL4g>6Hwe)|v5h^!E2)$}OqNrno| z6}4I@>eJhGrRYwY7oVj@iX0MUny6Cm?z$>aD(?DozGlxqGDGw=k5|t7bI(2fqOj(> zKYp%}{Pw9MXAV8nNN)f0$6jPM#~yj_iPl;0`O&QiE1va6BNyVE0j_t-uL!l+DGabh zwAw4p_s}Htd@vhq<{k(m&ec*JFu7f2z^5YJS)r%kNYO`4Z=kqjK|n!)PPb9zt48;C z>&}{R9-mo3GAc21Q2SzU@Yhy(!hcQhO@5#RfAK*gtgI7sEt$gm0+Bmuld5B$w@-omgdEn=Dy-ieU zW!JSqMp`MkiZafYCu6=ij}Z@nP0M64OWx90HanhH$=D|+K2Pn4y6I8dzZ~9{+hC!wpJ;iuz%*M83D`MV54|Q=Anl(n|zpODLe^qOYWj}rEmh*o43u(D*$6Kv_B40ph z4kc0JiuUk)R=e_|rCZJFygz7S?0;r0%X#a>v0fLv{8JRCx=ec8fJ)B}SI89?{*%?^ zi{AfLf&{1~+`*afUuLSNdixd$(K3fE5m!rjS%FJku^t(SfHspkD% z)quYr`V2SB=Be9WPapOtA8ms&aLw!@a=rePjPmsNnxpber4*?=JH>bdasn5M zSKlno+bv5l9=6s|2XWshVhrH%3xX9tYqfXoA2ndfzd`n4XRu@MW$)HvkJf55&`+;c z>wNX$`4@`*ghi6HKcrS^o5(zT45>GvY=5rm%?i!FWjHv}@I47d>nc=&tZd+k_y8zP z)^kvXwNz37Dl+BQ~DIScR+~;I)7u)_8#9Mo07eyt)%^R8Yw)`nc!r0 zA8kfKklkIK|NUu2OO&&}pH%tdA#?l{y>~`AdEk$POz`KMx#8rH7vW-^#*~eun5

  • w4o_Ws38zFTA;; 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 DQXDYx delta 33013 zcmeI*dyJ;_bsz9~-?=h(?z;=@E(D6>3c6Qzx2^Hs-6X_bs#Kv>Lx51Hp%%rK5>=|j zK!h8F?9Ik&_yNIOEH@YI*h}0pO5#{c8eyB-WQ|oPvMju`xe&+TrLHZ4Z#|#q%fl`U zQtR~JYBV$N`#itPIp6a=-*bM?%hqNPoL)ZvikZ(|J6PN5{%4o>-!yt?vR(c2V-s!r{j;-e-I39;cIc={`%vZJlPesIpg!^73> z#t+sSmwtC))#R3uopozxd*r>tmF?2s9Zt0U-(Hw*m#>^#oZLOKwVU?7rJ0qZJ4V*G zXa3pvdF|OBEG)L)AD>t}eyLmT#_uh>u|56OsngmG-(FbT9{$$C>NfSQg`3)g=hwAs zo*S%~+cdIeWW&g1BkSvPTYKkIGpAp&Ze(*^ysUP*tX}1FS6$gyJMXS5ubt8kOb^FS zea)Qq`R@(RY5QIp%(mO_7@a?O{rRW0+iw`3z3bk&_wU%;ZM(PDxAmrax4U*&U!R-1 zoi@~N8_EXzmTC2UM`w%c8*BW=w*HF~XaC#oWewXD`es3^6y0L=0bY$Y9 zcJ$K|W9{Z|3?@$5R;vMNPkZP)gR{@~c8^8sJH$8CCmeRwCj-{E9XF4k*`D~@snu=! z4dYYo?)l+jTlcQy`ep1&Q0^fv3AQh24g4LcIsO-Svybkj^8qK|mM(x%Eqvy4!ADBC%-SN=qRqg8MrdGAFm!`Jvf*jPaabt&AkK|?b zKKD=ogZmIlx!v`-zWctZz3=lAE8FbfOwCVjs%wRM`}pT3F23{Fa8>(zUz|Cs?fb>? zvG(0NM`zoi*-FEg-Z%P&_SB8zXPxrO=IzSA9jt6O?jK!!3Rt@|Y0tbkwZ8q+4~?Gn zclU9yr@ipasdHwsXh-aJ@n>eXEX3hgXKaVt%2(mm+k#H*lF!U+M4s8U{pRtr5Nf)8 z_m3H4g*eoXzujo`)(Qkz)V|v=iFcZ&|ePSwPJj_J^Acl;=Iij zfPC!g^7i=qokja!dt`3q^5sv@JU;oa4BGU{VDUcj{gy70$M0|L7CZ6%j#rJ}Sz?R|HHYuW$(mnRhSFh{MRQ1t*&2q@TSqRyDk|{wGTWu^M*Ec$#8AE>G0f&w%x14hv%l- zzc@U1R*A>2{pskMw)j{H%!7B2O&xscYt!w}|6EvHzWlMdqYLe(^QXo}*N^Nv__p8s zg@wIcLhkI+uu9qTJHJ13>)_}27NYArlzL2fuh8tM%vsls&K$^XDHSL6iUMwKt5Lh_ z`|d7IC1G{9_N$M*-AG9yjd!*k*H=z%KV@>=+uS{I$N$Hj?tEeP%G0-W`}ZEm#EtFz zqk}Wsk-r)pn_&Y>x0W66ym)YWTih{x@A%H*&F(h1cK%0}cGiTwrTd%8G}Uc)eP3sI zT~h&=hxTO96$F^SxxTNjD^v|+0c~qHepg*n_BM4NM(wIGAOykgdS$iEOLc(^ zRspTsT@O-AZ>S+^oWUyThPsdKduvguu(MlibA63~_Qvn2ZD1}2W|x?lWwKHLTy@nD*&CJ{~ zbE$i?v!?B+k4-hiu)Q^CTQ^yFwsfYk9ej{s6l}KCC&q4kc|`8Sf3mZq)-^&X%~s5D zSX(1>n@5(kDWaF2N4%LJF#tyrgk^I#1}}UPecpO)vjjmrB?@k+_JYVj_+< z@fBdPXE2<~4g6Q9`9Vo6xv{&=LvcHCLOQ>+W`YyGFp1H!K#Un_`83BHIzwU1U}5~B}Sx@GM_;0Nd;RjrM1U4N}Wg{OHU->QQQ6U9~8imcC0>;^&(E?a^}Nu zBdKAeSVgl5P;Hq&Fol)~=EiO_;gVUn#u0()nu(>lEW=Y2kV-Talt?MqwV7xaKHJ9q z-L;GyPxh3Q)^+iwpx8rKZHRgysvyD%I#L}!mP9?xjhKe-d`l_W(RoVylqE~0g8OQ5 z=>%Qg*D8eEYg^g?(J5ghZzIsT}x$AwA(a3ini^rfq>$>G^79MgFu9Y=lrle zGm*?nn`(2#IBs25_d-&6;0PETxeTB3Ki0be)@>a`qA8_#V3M{135f<40H2qVGqe>9 z##+>hA`eY#2r4B=6=itVE60}VW)FWB@L&OxqvQw&bcR^evIr}oL=#&0z`Ueb*snF= zu|~sOcPWCjW`^P40;#0lY)bOK2oxSDb= zE7plWn9#>S(N68dUxd9Ks@D^vqzx$darT zMM0qWzM@NN0DqJx@~NegaPj~KSmT=5OTDBYeM3lTW@|YksDPJSR*#@}YpDNHY;S$n zq4Z4%>v|f|gybv0rH?KKm_#M9*F8WiWrvYbOzY)9A^?z)uEYx0*6|;cr5wBDLZZcg z!N7*x6-!&Bu!giDCJH9@(4?Y5nXnlzc%m-i-pPu{TInBELKZOEkhrAHKr#`RYyx9) zBFHSu2~_yt6%XYE-NX)rmbf{F@En05Eh(k%o{>8LAWQTt#g)apP902nrU=R<`rx(_ z63R(9*Ax_2$WsU{e32R}A*|2^W&Fa6;(s8sIHK{?a_QTWNH(YZn44k(Jh6A=NQb~@ z35I4gPZ*%dXT~y1^rH^m*=@J_A4#w+9}{uhWl-WRb~F%G0S!88&~Ji@w$BkI2M}AQ zUh*FGWEZ2H9j%BTb^gJ7l9<@5TGg(S|jHU}O_HBq4S31Nj5_zy#p&9{^v0_};A zA|%XV2K3+t)g>NALK0zBOQVH4P)MH!sy*Gd5|db`2EZtoSw$Y$D3y=*Dn<%3f+IHM zv9Bk<$!GsLy5-uU76snENQ1J&= zU*(kxjEEwNn)FMzCWz?WC)F!Emg=JX1RoDX z7Jp65q7fDZOzqd<#Kd@&d7xIR!Jo9Vf^3&H?qW&0N<|DA1**=!tmkPMY&mI?#sidT zGSod(R9IAlP)Ie8KFa2Fw!L;h5kgjAKG~JtAt)3|HPnBEVno_2$A@fA*^)F0bZkd9 z@EQ*%G4wh;10P{0m#{~u7%XM2g#|{Zjg>*w|Mm7b0a%EJ0Wnl`mAXa2*sKIwinOG2 z$~(!1j6K*4RR0)7Q6Wt!dQHTp>VF~#m}!BWbg5h?kF~K-c%4RFL?a&pg%MOjB*S`r zQIAnyRq&kwy*yJx*};H1|B4exK?UUS7KrGiYlj7|AeGIa;wr_nFwYQ>anJyGG9zT< zSn3~y(rMAfou2=Qh8Rgc<;23GD(1GMb+%6k(n_bDW=;%`V2L>+!gO+jpVrEJt<{4wxBT%q~O9wtD*UndUgjii$WRv^o95srWC86R zY77jJk1=r)mhvECR_8z7vmZfhc)WkJxSR$d|3nUu*lv;NA7fmLc5)++o(MKfHKanE zI+H9)4^hNa{{V#j;%EaAlnF!>xZ)NeAsy}mJhbe+LPGR%m=T!XEku-<5jQDoFI6?w zqv9_@soXFCA$H?(7FDs_N54EPv32_Rq*fTuPkA2)ger;2V>1QHJo*sU73K5%*F}kg zG`;GJoQ=}aOCtmm99ovHLCHzM1vWJLBL^G6RDWW+64I6fylj&Erc_MixXWj|))9 zr*F&TG!+(v1>oP~z;f(%p^r*a`$ zzYxGNgcxImiV0%K!IX)~FJn>@VAW;OQVq}M?6V|c@tVhyQ9w+>VbJq6{ErEMN*BUAgJ_!%6E*wYi9A`uShq9^n99i@3<@ z{}UQrFUYe%kO8k(Bo|J6c3;N#vyhIC*a|m7Us=Fl{3v(*{D(K71B`H>kZJ%6F|!R? zT1?y_(Tgx2#n$X(ft8pe2-(t{p3-P%AJ^cqBw{&YC3X-nL`#WWVX{+=fTRr33(-cj z&{P;8A_=j?IP;N=Sz!dm&ulK4}pzWl2k}UR9uZAT?$XA8N-7TSA%M; z%ztrbwUW!`C_-cc*l8TohzbwG@)#kd1Q%?FW=T5Aq2{T7P)qfc-f26s3f$}YhZyPa zKng+zL^v=bVNv~UjO{3duzZFBfW60$pn?xZ16gufTL==C^hx1TJ^wjQ2Y~=PgIJ0K zF{uA;8N4N{;ASkw%as(d9Acyx&#fgCIiR{GiOr^y+PjLsw369mB@F|3b1KaF&1TVj zfP*yvgF7*{aKE_vkj1T?lW*2`9F3?a45g3!k7)Q#L_w&usP$;)3af3PRHZ%P9aUgv z$fYGESm~BP9vVxzh_iJNHqXt~iXHj+fAX_$w@ehB{+ULa2l0=A*e}s6+dm%>eZCQ9 z+{qK-$gglk87Ltaav+0F`JcAYnOE$UT^YfIBqsK=Sy1|Vn5u_b@+FM0F?o`%6cgBK zy&ONnePxH51Y=i=|Dp&Opi43l;y+{fDhRyi7cWijdiQRug(1Vs)Qy-c0A|T~ZHW{W zJV6QG=(j=rOG>3x#(8naX`f=H7E%X!ka_$av6eH`v&voHa zORN4z{|uL%SZ)DeM>c_!9vJ8hk}bSNH;nL=IZ4F`laZ*&N0kJf1=TC-2vldD`X|mg zFtL|{Gr=eE^a>(UNJYy5GkuI8AtM~DAx&jDHYMf+8yczwEf5k)={{HM*K9#VfWec* z^Hq$}<@emiUPTqbM3m=r&$d8zTnBw34e-7p(cq_Yq)I|A3R3z9N^c{Ok^=rN^rHLy&yWsWwzQFm^_zpcPd8KoEb#?%&PSF)MBSe1 z&v-2v|CuAW{FV8rDHrgeOrw8*V4=hido3fqOH;us3!|8+Au2(YmMW$BqMDPFb<9bz zk!DeRq6`Ir|C*82%|hX(rlz6Ko8fL zU?qlB{b!Y^VRJeGwuuhfM6W|pVKANFJQZ7_$`d(}hfEPID^W^`tuNpTMBoWq48f`T z`3G2urU9u;mQqY}XjFb|#Gqi3;B@j?GbjSRV1x~&qU;yeU@L!&Vhkg!Bdv|C^B+h- zLolhH54z63=s+GTz(XNQV!1}&c&{R2h1R2sYK;+PDJ@Brr8K#G4iPzBF68I`mS$mi zn@3DcaZMeN?`azp6OrbFh>9(4ST3AThFDLtL6FdmGGu-EpE`*@_53SogR3bjHUg#X zlak@DOp#O;Mj#@qx0Ug5Qq@u$0I&B+{3WdtYzK)>Gt3aMs{bsLjaaPdvLG$bVTtz$ zij)B_MVAN46OeHQje)F<(UcOcWJoe5zY$>l^h9`Lg?j#r5=;nS;Ng9goETvP0%5Ez z?A}l`usAVm#r>0p#T$bcjE2LaP2Dtau|yx*{8aUen~$)r6ye#1gHSk|LZW4u_tNb8HGDMp8Y=9m<$PP>@ z{zp`KCn3TE-~}=pVmf2^4o1r%sp`OMe$zs^kx)uAD=1j}Mx`0=*O$7bf7u{Ohuu_*&5SZF z@G2xkmk-G49ZG_bRv<1%?|)d(MBvHbSf193$Bg5P_K|d0+BJ!%1xG-isK&d#F^7p_#LR@lOtlt<1ibqH z^nc2NgfJjr;(>cM1fe+E4zVnnw6vj__>5XfQYJ<#8HdaWN&!MwYLSvu{f{Y@Av}pJ zZ!Dov&~ieC{{+T6nLzpY#UKL32=mC8>&Dm`8n)vWy|{yL0a+G#_^mFYCYa$8UEm$c!b#1refWg~>6ts{{QD;ZS)F4P3C35TVJqk)4;fVj za>$DJSR)hQ;*ezyGtd^MX~TuAZ$!+)o;;#0{=30ifLNOSbW2!tD`bOkNTgoRp#<=B zGk76e1jQ9GwgG*hl|l!FJS$<6Y*81B>heD^=B4dfn4-zIbbhkgbm`WMulF%3tPuo@ zGeRC=6p2>tH10BmBi2l1#FKjdAGnY#PcHBv4TG=IahNEqfCjTFXr@Gh3oOhFRRt

    5D_xk<YM$x~dQ<4UB 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

    6$8)JfbSWED!kJ)# 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 TxQP|cn>LM+YrEYX#yD;Oe=SxG delta 372 zcmaEIj&06)whbJtj0&6CSx>qGsqC^69e@8Tqz5MKO8- zt=Qfj&p4A2BC#DP;m69Vz`)DEHJvwrQF=OCI^!~g+$P59vkDlkw)15%zTp8G`m2ob z5hKWIpy^`MvuYVFfCg$-GHQbbL#h}jFe@;CTvWV0teP-^E7(e~H_`3b4z$Az;)m&V6B(yXHjvcYzF;2X5e@)^Nqn{d diff --git a/samples/databases/adventure-works/oltp-install-script/JobCandidate_TOREMOVE.csv b/samples/databases/adventure-works/oltp-install-script/JobCandidate_TOREMOVE.csv index d2bd92e064aee93a897d42efa695add23c334796..d63f5470fe74573a6d91c738c7bc1bb45ccfde77 100644 GIT binary patch delta 278 zcmZoT$9Cc@+Xgn)%^a-zTsNQa>M+?HRR2PGv(4f=_M4?1f6Ha!Vwj!~z$mg^Bara} z<8-ND#(>EVb2d!A;3~G=D1z>% delta 312 zcmX?cmaX9&+XgmPMup9+tovPo)M2kq6CmYX|56!9885zT52W}Xf6rx7VA#$U$jHV7 zWK8D?W(;6dn10`sF?IWaV8#O=!R-xUjAxjDqK4^=&D+mKGJ3HxD==_P&yQym-L4nU z*ucoBupKC;&NO{nE~CYEo@B-pW{_b8X^e*;Qr`R^b85;MA25O>fCh?8FQ{O&0Lm_} zVAKQ)UZ`a31DXr5d~(4_p6%zV81tCGRvnzeSi3!EHc-R#fLzA3>2d{(R@3v^82z?C zsAqKI1(~VT%eVtX-|A(o1M3M4V3gcm)W>)Q;@Xol85O5zOaXguVjpAccAKe;t3Xl; M)4|-V*^F`A0MxNw!~g&Q diff --git a/samples/databases/adventure-works/oltp-install-script/ProductModel.csv b/samples/databases/adventure-works/oltp-install-script/ProductModel.csv index 4a881a764de43809951f47218c5898d6c56dd58b..98303e8bdd231892c5089cc95f42edcc74aa0f13 100644 GIT binary patch delta 169 zcmca`l&$S3+lGCqlMkeJZT3lPVVW!^r8c?lyu)UT%x5f<74m8}&&%7#vpKH1fNAoj zjI_!7&cE5LRDXkS@}J%roV*NN44fc1d1IdR=3RYd2<;DI}QqMK6X@zee*3Db4$eaTJ DE^SP+ delta 196 zcmZoW%68!>+lGCqj0%(Yrgk$bY<5p;Wdd>z)}~Jush5~MXX3TZ3RypxfkNVWwLtmF zdHZ>QRA6->P}$~#wb}wesn@+TxfK|A8MqiYL2$C;bm`42`pTdNZEl(Pi4~~0bb2T^ zkUF{OG(>AK-h6N2F}N9%{c7KAt~k%axcS$zU4omp x?RbMOHH&fbg5^A$XYFfXoxJIq&*Xy1Jey}6QDNV_?{o&bS`L=YO_$5g008%FSh4^B delta 196 zcmZ3tpY6wfwhf##X4;~5K(=bT#&l-irSnFmPa zSLH%gY^wdk50w4gGaV>Av3EL>#-0fuSb>7o)4aKX)X{~

    mryEO{ji6q&i>EkeYA zY4feUN^FzQ6{<~kTIV-eVU@t E00uHo-T(jq diff --git a/samples/databases/adventure-works/oltp-install-script/ProductReview.csv b/samples/databases/adventure-works/oltp-install-script/ProductReview.csv index 0e01d507..516bbe0f 100644 --- a/samples/databases/adventure-works/oltp-install-script/ProductReview.csv +++ b/samples/databases/adventure-works/oltp-install-script/ProductReview.csv @@ -1,34 +1,34 @@ 1 709 John Smith 2013-09-18 00:00:00 john@fourthcoffee.com 5 I can't believe I'm singing the praises of a pair of socks, but I just came back from a grueling -3-day ride and these socks really helped make the trip a blast. They're lightweight yet really cushioned my feet all day. +3-day ride and these socks really helped make the trip a blast. They're lightweight yet really cushioned my feet all day. The reinforced toe is nearly bullet-proof and I didn't experience any problems with rubbing or blisters like I have with other brands. I know it sounds silly, but it's always the little stuff (like comfortable feet) that makes or breaks a long trip. I won't go on another trip without them! 2013-09-18 00:00:00 -2 937 David 2013-11-13 00:00:00 david@graphicdesigninstitute.com 4 A little on the heavy side, but overall the entry/exit is easy in all conditions. I've used these pedals for -more than 3 years and I've never had a problem. Cleanup is easy. Mud and sand don't get trapped. I would like +2 937 David 2013-11-13 00:00:00 david@graphicdesigninstitute.com 4 A little on the heavy side, but overall the entry/exit is easy in all conditions. I've used these pedals for +more than 3 years and I've never had a problem. Cleanup is easy. Mud and sand don't get trapped. I would like them even better if there was a weight reduction. Maybe in the next design. Still, I would recommend them to a friend. 2013-11-13 00:00:00 3 937 Jill 2013-11-15 00:00:00 jill@margiestravel.com 2 Maybe it's just because I'm new to mountain biking, but I had a terrible time getting use to these pedals. In my first outing, I wiped out trying to release my foot. Any suggestions on ways I can adjust the pedals, or is it just a learning curve thing? 2013-11-15 00:00:00 4 798 Laura Norman 2013-11-15 00:00:00 laura@treyresearch.net 5 The Road-550-W from Adventure Works Cycles is everything it's advertised to be. Finally, a quality bike that is actually built for a woman and provides control and comfort in one neat package. The top tube is shorter, the suspension is weight-tuned and there's a much shorter reach to the brake -levers. All this adds up to a great mountain bike that is sure to accommodate any woman's anatomy. In addition to getting the size right, the saddle is incredibly comfortable. -Attention to detail is apparent in every aspect from the frame finish to the careful design of each component. Each component is a solid performer without any fluff. +levers. All this adds up to a great mountain bike that is sure to accommodate any woman's anatomy. In addition to getting the size right, the saddle is incredibly comfortable. +Attention to detail is apparent in every aspect from the frame finish to the careful design of each component. Each component is a solid performer without any fluff. The designers clearly did their homework and thought about size, weight, and funtionality throughout. And at less than 19 pounds, the bike is manageable for even the most petite cyclist. -We had 5 riders take the bike out for a spin and really put it to the test. The results were consistent and very positive. Our testers loved the manuverability +We had 5 riders take the bike out for a spin and really put it to the test. The results were consistent and very positive. Our testers loved the manuverability and control they had with the redesigned frame on the 550-W. A definite improvement over the 2002 design. Four out of five testers listed quick handling -and responsivness were the key elements they noticed. Technical climbing and on the flats, the bike just cruises through the rough. Tight corners and obstacles were handled effortlessly. The fifth tester was more impressed with the smooth ride. The heavy-duty shocks absorbed even the worst bumps and provided a soft ride on all but the +and responsivness were the key elements they noticed. Technical climbing and on the flats, the bike just cruises through the rough. Tight corners and obstacles were handled effortlessly. The fifth tester was more impressed with the smooth ride. The heavy-duty shocks absorbed even the worst bumps and provided a soft ride on all but the nastiest trails and biggest drops. The shifting was rated superb and typical of what we've come to expect from Adventure Works Cycles. On descents, the bike handled flawlessly and tracked very well. The bike is well balanced front-to-rear and frame flex was minimal. In particular, the testers noted that the brake system had a unique combination of power and modulation. While some brake setups can be overly touchy, these brakes had a good amount of power, but also a good feel that allows you to apply as little or as much braking power as is needed. Second is their short break-in period. We found that they tend to break-in well before -the end of the first ride; while others take two to three rides (or more) to come to full power. +the end of the first ride; while others take two to three rides (or more) to come to full power. -On the negative side, the pedals were not quite up to our tester's standards. +On the negative side, the pedals were not quite up to our tester's standards. Just for fun, we experimented with routine maintenance tasks. Overall we found most operations to be straight forward and easy to complete. The only exception was replacing the front wheel. The maintenance manual that comes with the bike say to install the front wheel with the axle quick release or bolt, then compress the fork a few times before fastening and tightening the two quick-release mechanisms on the bottom of the dropouts. This is to seat the axle in the dropouts, and if you do not do this, the axle will become seated after you tightened the two bottom quick releases, which will then become loose. It's better to test the tightness carefully or you may notice that the two bottom quick releases have come loose enough to fall completely open. And that's something you don't want to experience -while out on the road! +while out on the road! The Road-550-W frame is available in a variety of sizes and colors and has the same durable, high-quality aluminum that AWC is known for. At a MSRP of just under $1125.00, it's comparable in price to its closest competitors and -we think that after a test drive you'l find the quality and performance above and beyond . You'll have a grin on your face and be itching to get out on the road for more. While designed for serious road racing, the Road-550-W would be an excellent choice for just about any terrain and +we think that after a test drive you'l find the quality and performance above and beyond . You'll have a grin on your face and be itching to get out on the road for more. While designed for serious road racing, the Road-550-W would be an excellent choice for just about any terrain and any level of experience. It's a huge step in the right direction for female cyclists and well worth your consideration and hard-earned money. 2013-11-15 00:00:00 diff --git a/samples/databases/adventure-works/oltp-install-script/instawdb.sql b/samples/databases/adventure-works/oltp-install-script/instawdb.sql index 5a6d1f5fd208ba28bf1238527b419d8104bebee4..666d045f34cee81ebd54fbe3d1047f2105006534 100644 GIT binary patch delta 19549 zcmb_^e|(eG**E9@MG0xhYAv;^HP%{dtuGF-y`9UFg(p8HIX9MzOv)qp*8>Mzcb_ z*Rl+~^pXN{&S7?aF+SKe$*ym@!m97T#6iAKm`#_m^34yftWw^=rmxJ}t=C;zu5X=G zNj0;yr0&y~9+8AR>^bH9?o&CEL`OF($-3o=JX+Q+r|30Tq|?@NIc3bvqvnsgcU0S` zdBmp67h)irc&~@9u$v#gxWa0FNYBfmhF3J}*t$_Sj;bDY=ct=U-9b0LppMtAS0wAp z^OE)K%47<@ttoo(EyesnPq;FLYUjwYw;6ifl}Yhr8G6usp?mTzdhulix{_bP3A#P` z9kQtedqH9JLxS!p$TjC~E3oKiZ?@`P1*x$YH0#f!ll9XDdDLGBt#Fc(YckE|wrf73 zwKgS-LN~|>wEZnhw!UUU9=R`*v-DtvMelN2S54fl@0qxKH0(I)%28L+tut*;#~#>y zwg>fwNp5>nYOF- zl9FlqnvxaKm->y9?j*-Ql%(!8*B@p2sYyxQ{u`PkTD?(A)_tW~x21MLo#%eL|b4}@o@HL8?7xfTZCR{DYrYPE4juJ zdmzV&(RO`%MTRgfh2BsS^!^H~zPKVfT0*=@bGkcjagU)T_d-bJ_GIcx)pBU=i&|#j zWz1yZ?e+xS|GS1~!|Zk4*Juk|rdssX4{YH7)9Vte)cvikdc%waDjCl#dS1ge{q@U} z^^?=r>z-M5ee?8O{@i_Xx<%6GwPiurgh->6w!E#RcZWUer1$~Q&DOoG`IMx8F=Jog zdey40ZM1azTMn`~sx&<~)2as_*uej%9*LE7`&)fXjBs*#Qg>zB(j@vUiB;(Bk2}e8 z9xK9!gHZ<5_oj=$dZp{>5sy|92$}ja}q^TTP8pr0QpW@7A~6o8H}W5Y48R zRtrYm?T1n%z2N06a(tpF-93k=BTdq?en!Q8Fc5!p^3yc^g$Gmg z(4Xx3$uDbGeb1^d=t$K=C;Z*pPe@X%r{|CMZrfj%oEMqfNik#pZy-^SX_*F$SF7sv zGqUyY!VIH2fmKWTfrqWS^Wjpwu^XRRSj(75-y~yiGD~NIL+E^#s#h$jq%#t$FmlJU z9p5IGSF+Q(0+vjD(^ZA+*RWh_t7UeozJ?W3=whjXj$XqmsrO!%U=&VZCshG*R8Y*y z%umj#tjRc5%&KK_J%x@HKhW%CThEH9^EOSR&CicbGd7p9oigouLrEsDqFTvc#-@qK zz)frsEqDNfhHqpJO1}YrHXi|(FK%K^I|cQdW)8SCUM=2PFLP(;@Y z7;D>Ytcj3S?37U`1JCLq9S3&8Oq;213QHyTYD*GXZ-)w^V>VFN?aW7^r=hDTT|=z3 z%4Fa3Ln(zeKcLu*-aFW87RPnZovbcKT}|FP))i~r5^IRCaik~?0tY2dKryhpfz2h$ z?W}xw5BF-!#{S`03pwT}wpd>qc}Gj>WG`VZ@{E>J$@!9Op$;bHQkR!$H0^+9rKRJ6 z(}POz+>IFuui1V#TWSi4aeIaj>DVME8;hqik7C+k?M#+r%xYrWqtk9?+hcvij8n<; zikw7!E=ZWWomF$6+h{u8+*vFm(l2-)TV-13qjjTU9Ys^E2u45SWBX#h*TfY9*SW~*q)?VrYx48vC@FL@)0$@3o?vB+$7u_B zHc4sJSq9^ssf2$vTqMY@0dlvn!yy#sX^+6_-d!6ueSO zpx0MGTcJ%*Em~)jb1PKgzfu9+YtX{MXV?bBKZMy>Vzn8;mCRydjgjtWRgx(QoKK4v4w${t4Vue9C%(ePCt}%ZpIY!0RwV)r(O0;pbU;;MRn6 zqw__U8UbeCPoZn?ebzM7vHCv6q(e&;gk_u6VI1Gc7O2$m3M(->I@va}PvAA^r1ays zNmr9^E6b)(V*)^#J9F>@wDy&-60+Yfx%nrJI@Yrag6h1~`v$<VO<-y3+pbx=wh1>dx$lI>^1$IT&cy=*rD%l{s1nYW!)#SG=8zLoGl0YT9$5fRt- zJvhqt*Vz;TfaLSw&7y@nkZ*YcHFob{yCP{0IszhE_T9Bmdv=Bn2%qX z3Gw&F%3UlNMVdWBqR3RE+zpSx)vcZ@Eh3gY^9Pxi>68WTzLzrYlfUg{W&n0 zNSOXtk$C;TVa^B^f+ieuuWIt&BNx!3DS!jPweMcw@0qQv+UVWKngF&uYC`*wuiWng zYzGyDemUgZ&r%HEdn{dwYZ1aa4k6CV_puDa^#SuqwC2xX(YKRX$@M$vQ(&I3Ego%j zkiRQ?73n>6osumi;ciF+ufk>BC7|$~w4@Nc5}3)swCf&T_57ZFWCF9$zxQKnfta!p z`j|OPBLx1ycE$!vH!OXuR^!-WrM?f~aT`v+z?(`rM3;cI{Uo4$?=iNKnSFxCfjDg*s1g{N~8z{y!)YTpxjZ{)bFkjXG^*nB_d%E>)OL zpCJK%`784L6@Pp(^tR@&tkCqK!+(WrSj?tSXfX`aKMAe9C5Wz$F90r%?<88Ny&u`c z$I#&DX9;weNhP#lv^2$JdiHN%AV9Y?4B!->62?SZd&dEEeSe2SMFVOEg?h$FZR9uw zSwtcfQ05OKh3Wn9%zrLn=OwfQP%4lJj3Mhe+9u3nU8#9b;3e_o76U8-D=|VbEL} z(vU?f2Y8jZ6+Q?VkXZM~3V9k8D|s(Q_6v>~gIw}Cg5LjcwoTEuUTq`KQK%3F4+W zsYTzY`XVzC?_gsnATkL|=OUzkA$qS}0@Ct=+4U{yP%MB&@tQ{AXOwgb`=J2)y9gIY zwv-jvfXVq~q-e*yM4M4{p0qnMncnjtcr-CiAm{ywsg#!r7msQc1>p2VD=qs6%=AI3 zB33d4W_Edp9p4_@$7!>saSPWTG zsOv(hkz0KN1s5t#E=xJDeqcz>s&sxLRtXnLCu7rZrT&Kjf%XN75!3`-I=L3%ohW?V zD)*R0=(b{^9AEv2#Fg>1oMsGMEagQUFMK)N!_%IaW1to*i_`=s?qL=q?=tC&h|WNi zLG8;iAc#EV%mXwCU3jiUL*Hc>urCj;5PjEdehObH%{R5u`+cQkurdtvL$xbrVD(pX zm2@DY3yhIYeNNC&idw zBH3jV!-B=qEINAwTpQNQqZKZE5_L5Ul4Q7Vl)SQ8wS~&10TcXP6{fB8sODGjyQ3A6 z_z6@>X@MPh6SxJ@&((-Gb#(G&@gd#lsFVsLf`SFs?6qUlowNgr?NLVl(z{rhZ*z2YG z$f7;=lJIgVxuyYWbN-%~E-ElXn;`{QYz5myRWqe&abs}{8MY=VMKY6#&ja*1I2H@x zj$66H?*X$N|4KwQZ3b_V-$mgr8ruJ0qGc`>NwyrLYL>K4j$0Vi&xWsv+}-$qluY5- zQkjXUcx)D$HToZrRw+ZfB#~W5{WakM)t_2@0LgQY`KEm*UDB3e-CkUuujg1>*l&tMsdc+IB=;P*{S_h^;CLmC91qEL z*pz}3iA|oZg~JAHHswNxe3Le~2I1l;8b+p2TT#@p{B7_bp+I;@Sxhkr02SF}hhqzD zExcs0(wfUKyx3JZTr5wBqjg;;Pm8GJI(d7nq0xMY1xuA8H*}z@RbY&rd<3$vH19wL)13F}FzW-t0WpPv6b*AzJzanzh zVUuc2nT)NQ=y5~}xxa0#BUkwl!oB74?wI%*_1qlM0j>1#89D)l+g;eraQp&u7^sMj z?z%;uZO%1xi`)~(V9~pl9NO{ys3qG1rn0NzHY92%My=!h4oU-il`Pa2i>+pI%utoU zBhj%y)fA@@;S#=T*=3H3)+BS&z;>(L5>qL5rQoZG)Rl2$0|h8W+YVb$=|lh{qAuS= zY&z_}O+FeUPM|fPTFPQ{*eIN+6mYje{+fs&$e0op&ohO)D2J2aQ!+BwJ-{Ak9hRED zJEHRhNium(S_;Wl8`X@bHX7=p)%Cd5MI8;%)^G!~8g7D#L%UUl4%NkthOL-4tz~ga z1}hsU23Sp%JIyHwrdX%D=*(4dO!N3sUifBL935YXQ|B~u9tgU-(7$Au{vj1M_1S@MxKpmSw;d`-i4_*onFp0S$>{Ap+;10QsT<@du z>b*yHn2gbLRctPKB$O7Twcm%Sh)5BN^S^7&j~(2Zq*#?FQPDkeJNXZz_8By8xW$a* ztU!r^Li~PtT^u9lR4fYI{T7Y(9=2wZ#TC^U^qEJlB={8Iw31he1>}DNDR29OQQe8? zXls=_OsO08V|(2-N47>nI@+8{j(=P8skbf4niG=aL3x`gM`%6(7Hcd8M(ZVl9r!D{KI==3r68b0%E0|<$|7!$|DK=TuG zhqAYjXC4xbZxN6JYY;naD;zR~zDZ;Asr{BXfg+2OvkT>oah$`86Z7I?)PEszzep8W zI+VtPFBb#E*wp811t4%Cbv`DS3wb%BXBs8#vSU!_1X})m6Xt-|tD_}~&j-K|^Kval zu`=L8J`#@H_K>1c@G>QpkKTl`6i$Ek@u+4%EC4Z!K!NChJfdm)6W+1E?Qpo-!5Nr_SU<@S4rScL}KJ>`o{)08Z zQ&IRABrBGg*$d9001^h72A{@aG-|>Gsy_%tN24L)1EQ|rHGkl-Xv}(lAkQ;L%$o|K z94q8KCKEK|nq~fpQ&_N|L5stcDDiyq+yxyDEmNrC^TeXKV#9xzDQFY*{1B=VGTQy7 zZcNE^`$SZiJQbetV|s!@6rcmE5ELE%#fwdj{~sa{r^jZ=#h zfI)Bx0NtC7SYB-doD7VHX;!WpJAqcHV84Ep6rJRpgLBY#`teAjB)X@4fi;u+?34NVOJVO zTM~<_Z!s|^b)2UxF~vW8I|Fd>k~Nryad19~ia1$0z*}?3QHY`{_#pq3qKGV)OP*AC zxc5V#lK*^Dlq_S}c%_)ps%JobB2_tS>ec;ixcz~T$2!P9&eUEuLA<@FouC6KJjdw$ zwvxqY@p5!=mdN>rJwsU}0v*HT06lkHq%;~wE>JzBlFFMs zgMA|BSixRPGCBW*qu+ilDx^J2nZ;;lu5yAxqcI1;M^t?!J1rL4n+@HUJr3Z36;jE0 z1we2G1C%sQ#G=)Ineswx__+qSAdBK`s+4<*lcwb=v-nG#a|xev<|)&-WD+CCk5CXe zz5|PQT?r&Io3BRk6ut^($CAipR3s`k9I#ZQEcRa&N0Uj5s&S^qr%7P;5xMGNqlRiE z{+@TnCI_woMCB%;+!CJXy#}x#j1@gXb_u`3@l|@@PAe`t6etPi`0fc<4_L2(83bFX zBY{3BK+1LBiE2o=822XXzm0qRI4G-eoR&c?6BU8*xX@FDycll6HhiHEAt7{^ z%};!?QLc+{5Wc^LlU0}$JTMG*ky0<5wSe5WDH({7GAz*(tdx5j;sY}*MnS;WEWfvA zi+%X^J7ML5>y(8N-HNeMSZs07`t$-HdkksGb*;AGbU1fu875%)Jo=SAM(8x@z?LsaJWfP$@X zu9s*Dh=YSc0mG+p7SmN8wSYxlpQNqpvYd5)Z%q1c1bD^EBnC*(-Fn(j4oM zPbW{oh27JYMggJJxF5lZnlF=kej4wV8rZ7j1nz|p(R$D!A`6wKi+b;i3JkVs$}VV+vO4F;&cF$-$mQ!D-AK#Sg=Qpdl}OnRjT74 z96Cb--|+8S5F5pRN!oVGShs`tRbAV<_Y)}peM|8@L)lR6ANB@ zY+8!kYP%kwF$hs2IiUdpb41PiCqou{3M9c<(AU^JJh5Eldd8E1xVeZN^?1Yjh>ZClPPaMJ{ePf80BTG z@heLrq1Y2ZpH|g|g5gPMSD>w!ifHgYAX%wBh{ZDkeuR~5S{A-l8jPlkhwRCI~Y&`1} z>{9xivQ(zV^RV?&QGoqu$7k@(STimkDBJ1C%Ye?VAkxsmFL4Xa-3_-`yG=^h?Xxv1 z`myqbzV-*ndhd5Fr82R2pZ9F-;lr+6{GA_w&fs2*=MDbDA8t06q@(tzR}PX`bVzxm>~I7wGj%Mw?j+kw>HW1DGD4uB!4ni zzQkdoZx3p)rt{Q{I7O8vt9vPYkc;*vs$2KRO4-&|054Io%BlAgCB^9KL_~9K2f$8;h8Fi`jq=x(xn}>gUn^@Vd=^u7)uBiDk5Ud7B0aEJ!!@+G z0OG;FpgwZ$RAy22TQC+>J>RI=svN|@3>Q}W3=n)|6Do0Tbb_$+06;2^e|`^O<(vEb zrY@!LP^yfEgGxv2S|%>@bz*0wuNOAJr!;c^9rrTq56M=;(W~T`Qwe)e6Y!}V_@m?! zf{EE-I`jF4Ljm=k8lzGBYq++}RqA4DGVR@|EH<^w2gX!4h&EXK1AZmcz?A(AMT?rH zbM}3^l>zZYUCD3}m!>8eX?v6d8cCl)w85$Mj8*4~5e)zTD7b~>+=cQZ=X2bA5bjm%33~~5Zs4*ItioNd1 zINmS*r;;EGCYaoAp==Q$VVIx7^RU$LU5;gc-)*XuHufWF;GLPV$umx|8g4}musA~3 zD_WY+Zq(0IbR6ds~HXU#-4C zv#$iET5{CoNz7!CZ9{9lcZq_&C+mBk)@LwXIcD=u|6dp@u8h z=U`AnDb=Vf-ziY17+SWfjU-GJ)l5`96xNWhO0QE-jUWg1^CzjTWO?!2qT+H}vAXeV z<;|e{>(zGJr)poP8PH$}c7wY9Kl2iFIkdA(T_^NSZ8xb&X17CMsCh=uO)8cz2{)^= zY2MB1wsTq5m|UTbXOv%u+4&maVwN{li_vk5+QMkjI@LxtO+#v#tTxjQMN2jUlT}pk zt7fR>Zrh=2X0rLq)de}GN#~<5M(nXd8V|Kj1CmzzR5iiaGF5Fq$54E` z4E1(363&_ru|(Z6P3=18R3E=v9j9aWoO331&is?fs+rJ0cEl|VWb~SGh3@QACdX_dlt`<|74-ysu{K&aN9pLZ$W<(B>EO`PX z&@fI1V%>6{g!c(3jJ?xOzGcOoV6}$4&}58VHq|a0PK&MhAL9DNv8PphJqtsM=Smvb zuDWU8Gis8)@t0|aV}**PYP7Y&Sn-V7YCaq2-8tBlW`zCfeDR!(U1A7e*$uzumXArC zO-ZX!eeT%+$@aBl3E*3;rqSk`FeyZ3nE|z8;{$_P>Fi6O$qJ~!Z=lw;7PZKjMye8# zru2ERZeOD=;Zcuc*^!!C*Q$%+d^7a?klsedI(2RwH>2xEk-4Q9;Er-ZXoL@Bd=?z~ zylMT=XU_|2PaHkr8JDS^!5`-pn5h4GM6h=w812}gVx1FX%n9=;ccZ##m|oub1}YH& z=kHdr<0=?>dH~MVn^mj?#j|rORHStdQBkNfMlPC9y*fliaol*bvHmr6b{sb&uUnlJ z_e^KDV8|U?)CTjVflkeX?KWe(F|>dA&!V11khai(AFhnh;~9qz&!}Zo^K_jE$8;vzp z?@o@_JJkY8o{n*L?!@x=&;*kXUc6Jy01gzTSh0Lil#A>KNr6HHY52 zLp_i3Is4Eqcy{<#NHw0@5C(u=?45CH&n{#dk?pqcQfr5|hNB1bvUgOoU}voSwd$76 zY4RIO*oA!O7$@{R(u((BE;WrnM&J7?wgsb=R;&5R6;_L=_#G9c{Eq>tjz6f_MG!Q> zk5$|u*bBfGU^_yKgVOe?_-Y#}uaP=BXw%0C*_03_HJm2=XXtA0d+OHMST%I=LnOR` z{aChrL+X_#TE|KDRkp2^{CmLqf9806BxY-PC7Oc!(nvYIhk;-t@QJ6X_!N)|NKP`k z-cfO^Boqmu;%P#E{Lg&qjzMOT_~MKWe#BTWV`(EC@;NdRmbD77kf;Oer1CC@Tdnz zwdk*1em-HhMuN>W@CXcEcbsN@=kB`@`CjYPDp}phLHLDtWIW=C}Au#=%di|eN=+&>F*NzJ` z3t29}?o{X#T#BptA&f8HwO^n)sp|r*CbCLN19!3ZE}abMteUJrzx)6gk7cwyO)IDM zcR}aAnMgr{OOr*Mu5GfW86Dr&@}zOYm%W1q-p7{-Ji7!EKpo815+XohzXDq=ITvH7 zl^1DMRP-V~4UEVb_j&o+Y}z#yCJpCn%f5;7a6GI{phLVu z_D@ErMao-OWP-pG{{W)j|#vSLnEWKnhFrS|F2-_>lBcr+yAW@ z-YP9qqSmDv4nH2n#CBI}CkG#mW4CG^+>;ouCFui`G?Y-NWeHa89(#C3ao>oc8>xnb+q@5N}oVGEHLpZdW+GNTtJAPYy?;7DvZG$>5HATYTgX=j?H;*H!*^dfCC!851)A}p zWvVtnTc#u6(QVU^Ml6DOugn=5zK76rht@?Wn&85M{f?VdhjH4Yxo~gd1$>)-MYER1 zq6Mw-+P&IXDX<=5)NBLJh3~^a`>m)5+$*$F5-04Axmc|FS~N{ya$g4^rfM#vaL>Ue zKqy5`58SVnh|R#hXEciuo})RLv3jRpZg{~yOHlwxza z+N)j5%)~R&0OHH4m`uWudEidu@F@_ckZt5XtnFfyK@hjl3$r>N(RS1EM}V@2GJp}* z_0f4arpZ~%OV7;LZWWxv^R+d4(O;}&dk$%7-J?(y-|p6Zld~F3nZ5|Q0rFrRWr@p{J2E9_ zTw{FnxYi#d$BhvuTS>=iYz~@tLfdY%KB=7+zr7(z61A0ELMY zIh;QJ4DT|Y(JG_n&!B<-g5!xLGe4v=;1Zi9TCojEh;rHT^*n2OH2l;JUvrC7J}{V1 z(_TTyjrm)`eW}*{row>7AfHu~|E6K%`mH*UGSrT(4vyo*H0&$Gk`fp;NmK?+Vc4!`>iM>awsZ67n4ckV}u2=7M( z;b)70D(}Nx4+NRjSn$4v{W1RAROY-kd;pZGeHl=U!&3{sTY_pcCPda;+-3BAh$#Eu zv4~tdKLkFR^q4Fk($0_r@v|1c(@L0upA#vU_~|Wf@*RZpIsVAe`@f;>V+S=4ZN&*V z9X^GD&W=O%y7)_+Y5GdBLHx0Hoc}Zq`41s;rX0bHdygs(W6vi%i{X&{$ly!z9M?R? uo=>$tY1m7`%M<#kyd<)HAK9Vdn6?dMD!xxBHoA?wL&3?C-BvKV)W}r@OkU zy1J^my1RPUrj&P2^{-Ac9O`IDlnxD*GeyB_TWNkyupa6V`h*!DCtJ3{hwZbtZupzg zF2-hU7s^*U1z~cLblM-_GY{EX4a7AA)z5w_CH0m7rXK@UE>F! z^1S#yfc$X$JPAL3PaKE8V>{e{zuP+u#NT&13^elEwu4<;(W*IySV~bko%{D73^3aJ+pBuDlbbP1O%9fN8eyBF(M}dYsB1KdG!BQK# zu+n4^QYq&VDW=jYNw&DIZTMST)iBAH*ELKlnqMSI&2J7_7&0$pNl0PH%n+>xd%CV$=%Ki@2U$NomvJNi+nTCBF-6*}nX%eW zTYhFo`?oEb+4dsW&Y41OmmEdnd%O(>Zci1v+M;?+#MixD#ZI=mVPTa1HhTP0)%)J26-(4e)$1@8d)A51P16b$RF`j2z>n{zCNq8r zAOC^!(~RhP`l}#}u+`mCWP5v_V%vDrYg)r)vk%zhnRYD7X78iwWMi1^lLevA&l)e- zuFbEtSqtovU;CbHJycMz$-u$46ZXv&?Hqnjj2iMoFqHI^JC?W>CJ zon+MdBfXoDrp`ABdFUzIveHquf?F+Wc&M*v1Da7f_s)>~$9qMzfgi&#z zPPkEMN3~gU7|qQTVyP}e2sKZFq8c3nB~GIt zP!H8g=U@Kyi~WSy-lC>L-kbMpF9?6b48diUt3c6spJ(W@$eSLxgp#bha>t zP7M)e;rsE$LLp_B8{(+u52B<#d4o_4lsP~;F-nM2_YD(DnVu``k*xL~A;g1N$J=5Z zfb|}OMCdni9e?Vk3F$pgfBGnTsg~^PN zGpmJxG<~hGg1u#ZlvXTcQu#hZN2(oX!1%pi$ffkLhHyqt8XY(+bR=sJu&HhWYE&-} zWGY!FKqok0qs}0)BNZIy{SNp8_yaY*Ovu+oRXtZOMDrh$ghf>SgrN=ndN=wh`veR{ z_F!=I$2){19q8sw0xX~dy+pEXGqzDn?nDE6k&bukMHW%Xc1UvBVMub;9APchM_?p; zbHx-+!>xwVs^wmdL2Q5$enir)&6k`NZ7*wvsT!PP}*|{L;Bc64deTT zC6&XCVHAA|yhBfoRF>RwWdmlWbe-G6{ZPQ zoIu$Hj|y;DDPa~w^QA}mAj>#_L00jx5KVRSM1|5n62fe0nX#080Ar|Ti(*k{JSM!) z8+ut-uO4_@Xd?pzxG+F9JS!Zwb74JY=Zh8^S%xYm!5 z!btgxFa&KBo)k7v_5F%IDs&zZcx0jKTp^x~ltDU~HGhE_ia*I%qN3^(4s1$hiG%3F zSuiqI%J{3Wh6>&{gi?GSR8;L>0jaJ4vN!!jVKmKpM+jBJ-+`7wQQ-`luQ(%&20T=I zhLOR^uKH07Q)j&^R5=J^Pw1Wxm<42g)sOgt$PWePJM%ic&(jXzr=#~(^!@<{l6V|T zqpLaLd(R8EsMb#ei76}Ig_emxw)!*P-4W-78`b{jgo#WtBHj~Ps#RYI28PStFNKG+ zj|o(86}?yg4?(JY3M3x*ikmPLm_W4`1c_2F2;=plc);*Pt9MYvbTm|6fIr!vLv_G5 zW#ScDiJ`D>lxWKThMQ4%05?$iC8*o-Z-o@Q?2o%iN}#vD6|AW7?YBY>J_N}SL+R_m z--WmE=Ue|Jv?gmyb13cKDU77Li^5#J*y$e>*q+~oL_E0jJK+_49?xeck70d{}fw9$^Th{3RIDdltjS)ZHK~WNJro@H|(|zb0H{ zXl(dg=xn=nj742xFq}4UyRPON4Zqk?+)fwkg%X+-2Fq0xYT$N~DR4YUB&C^wbu`C@ zm$0))f51E&{d*!Em7(XAQvB)N+`u};`N}uj^1}_Up%@qi8F12B`4;G^X(olKwq2*oWfafWEN?eN)o~Lp3eh5U;n-%alhOFe;su zDq{=|+;t$_!(*iD4`OLo7XuS|XAe|-2fo+8CB{*C3mA}+VqrYxt`MVX&om*WaxVr> zMYusB%Q$nG`ekbaw*VaZYb&KBU6XOP@J1|g28RQ|1*!ZBXe76QB&F*PO#C<-|n%ZKX%J1+`Oi&2$b3=ZSYf!H60GA22M#PNn|lfj4V zt_G%UodmN=>{T39cL846_d#TT?P}=g!sIy0uZ7mv`8!noHP!Gr8>1SroiQ#8YQ=Dx zb=+-Gg{t-44IkReEvLSj8Vz8IdM*jm!+FC>hilmMdEx zF2Fs{JR8Rp2RME;(lFQoZO0gc!@-2)MN;i|FmwfZhK`OR|H@|rPt6%;c#$cb5l4hh zv}FJgFDQZ#f@6QgP24HuF+Gq%rHo-HRl9s86BHt zn2txRqt)`+2JSHz78zR6(}jj#_4a-(#888UELJOSHoU=*<7iAShJbx+HZaS)eW_s} zO7QdrY?L}q;SOAYKCd@et#)%^-{dX~*tTUkVu67aQ^s;Rd!~(r+ zxgvF;`mW+|vLuQQXd4s7Qj|zoA|}(UzA(Jm9Yp5Tu%^`5j^Z4KJa0F*Gqh?=C*F8Q zskobJQp7Z>DMxo)Oma5)p&|{Znn9vW<;fzGK9s$Y%0}Zs-2nVaOA#-*fPB)sM0OYP zW35DYIxz-*=X4;A2cY<}_WU@QKCYX{;zJC#VRT`QltO3wiCyp@!y-+if*#^j+OrSJ z>_m5wX<`)XMpO5}5~Ov*KuF&K#g;mfR{-2(ir)cm?es|0s=XWE+GL1K@OiBj8Dbv3 zAI}i~sy{lKDPmGj5k17uTpq#UUjQDL4CP?)vKLkN6d%(|l=l*uu{zUBWd1hi>FM4g z7cUl!ot_v+eQy>gvzclln{>z0!hTM^j_k|1$-DhjU-7UG;y^!<83X=2Jqyj}cR&|I z9Jr*#x%ExSAW@>1+af+bD;X+$| zP`26yP^?-u7**ULUBbkee#sV@Ro5GgrJd{H^4H~vObR$do*yF4#dl6k_DpfQEk8}7 zUH8I;<6OZ6IgaXYaJIbT7qK^4KaeGz>%8W%q2e(e;^V_aX8ri{@uVPqm7lfm5bc|Sx7ZLLzj`?|F4Za_rAoi;q z3?Kz#HJO?qjbI&IK$Zh|oi~rmHY=sg9}mw%r}3F2W}_V2aTpAG1q-E5gU27f+*ymy zB+s2??)-Rh2tXcOAdW+v2Lq?>9=L4veZ{#{awDXmf1+ON2^0g8J*fPY5XbaI301!V zZF_0HVxjr{^kM^O&m?iN4pJ9Qj(Ip!c?`XTDdMB}K_TyuHjyk%6`8>}f3s-Q0bzn^p_k@50af*uhEiR=*6;Jh zf9nnKnPdI}XlAPlusm9Gele6_{+9?jq%IO~)j%fGXoDfP@)b#@f+cWg7K@*=CKrp3 zxW1?A*O*^$i?|a{_b!9Vvi=7B_fioXsVdAu2gVuxqM{j$Qr$^JIcjF3&i-PK8j1|2 z@@bNV>TeYb2vdeMvaaMEpn+Q|^`!&9!EdSf3Eg_S2ovkkC8(b@QA`DB)GuVtbR^9x z0n@5ih;s;Dd^kOQn+^nPQEa&UrXi9;_20ww`d2oBaZfH6v$dBus%a~fC*$~qHwh|iZ-v(#wMeiJKf)`;wq6>37=sOr;^oNIdP!eIWD+W9E$44 z@07+cimNoFdJ(+aM5f>{DO<}mGFJ!%yJbmzdMzl?%5|e3Z{vz)+&b|e`lEu|#aw(x zqseq`Fa}(D8MioSv>V~2Laz0pb(VKnBi7kB8@-^{{H zFBf0ai|yRNM27YjN;lA;jpBZn=XRGf>kf_@N~~uCCWW#$ap&ORCN8GD^^#kqG)DJS zs=rfA0SvtCPN8>0A37D}ZmJk($kxX!SL`)+bL9rMfyOBiB(67V@0B`M&OldL?&SkQ zFUlTTXxqKK|2*n!jsm4sn|a6a@?UOt+Kl4+#G^opKcBco_do8?%}7s5Zw(iqe5A}!P76{YC~^ScYyq)2@DPzv+11+RYU_V^KI~j^_$;MLk zB7jVfl-K~^g%(EP!TXPi2>VBY6wb{~YDG(_KdZx~uRcn;suz!rmPX<`r{u0^iQ8{B zG}L1;Qj)#Kf7H6x($nlmLPx1PbGevv!LhAsCe3Hvk;*)po;13hq-ezk(6)9QvUf4Q zaFImCeR23yLg7iCk zj^J89F!mT+Fp9G{1VV-H#qAFV$|LzZ2TIItawWl?VvOXTY=LPl)ehpE08Fht?tR&X zfCGT{l@6aYO>0;yRCkk@WIH#9sVyNF_60HiSXws&a&T;j)E7^6()$w+>gNrG8-+jY z6-NTTej3wMnT|!Xa7w>H?9E9=xIe4e%n&O!*l1#gHvZ0xWWF0Q8MP*FqMrbWAo+Mb*jw7US^pOfgzhZsGd8+$zY`)DK z)4e_3Smhpsj+xf@VhVt`)QF%TezFN`VFyh=%cXQblDp|q$ zP0bi5&1Pt59A|3<@c6V-CcJod*aL=$GjZc~NKFB;^9Mx_5?j3u{8t zBg`q`<^t7XS@do))y;vaLVO*b@NBL_g!$57E#RJBC}AR61RGm>5Kdge@c{Jx zR_SVbDTCTZ5B}$}{>>%pPliYbIR{ruY;m43LWNUv(SRR#)`u!O!JXq#;p*Gavykga zk~_Fks$K&tua^mwsT)nd6GCwD4rwYLz-i#C9;_`qhf!hOn83vH z{9V#XyX3jZLFFyd4zk)1UDx`W$=u&*(e(!YQod~uo-t^WFeG@W%+SEF$fKCtKP2`vs<{~`vl^*bp_eY;X( z0dP9ldn@7Z);$bImG8>5oJdp+ z({@R5+Ab@qNWk21;cg5%UWWhta5vNm|7qES9?`xX$MDbFBbD=?d|w^kbX2_$6U<}# zv0)?q5h=5D2DR0f6i#r_ibT zw=}Xm&8Cj*MfTGmn}4(XP5NAGlJUezM)`9Xr5qK`xo4zRWO)Nz>07|W-q&grTB z4VLlgSEP*&wE1%tbZ)fMoqZZLY7a=8wZ8uu8unaoa0@Mr=8r7L!EM$QvHg(r@^R^! zqveNcjL~ZSYtqNev+-g?)%Q|`Kw+;+2dLy7v|@b=;>~#vq${UGnk@Svn|ODWLsWsw z7p~(d$&Ihp_oQ8RzJj<*e)+1Ve=NPG735nHvzyDA#Fw638P^0l~m$<_wrZL9Qyb(xaGV!+sf(~j~-3Gc@DEo2T-7t0^4egqMGTltRDTl zj~*Ids@BCz9+JkbIKEVz`A;*#(G%16>c^a9Gb^ zAVhsFZE`Ec(T!9ueJvee6ZMBLNu%642YsFG(j(a=kR!_#>0Pa5bZk$??>L(EPsrxZ zpV0UDZ=%R2b&%t8ze$nmu^*&p`}SHcl9qp9G?e^Dx<^BUi8&-OT&@3EDswgj0nDP) zze0)_NlZdxS+Ov6&~H+$tAzUjM*xSo&{b@Im~qXO0sz)J+6j{YvxMWW0(XN*-$=$G zV1h5hP)hq{<5>-m#n?;v;&jXmhCcEuOa3&5$475 zvP>1pawwHY;?LXp#*x0zcMuXv7Ybwxo!e^6tQ4?te{P(SZ6ecsFGCLWr)h8~8Tg{}@^&wz}Q|L-A zp$DfLdx5K$_Zr)&FRV23(Dpm4jEnHB*J|T)4KVe$)fm})5MLC{SD?|i87KQMePNxwH2H#cPnmJNzq%T$Jge>5psQ^sJnLp-oZ9~m zqx~QivENjEmob$N>^5ep>316Q?Lxpy;>`}1-&)Ddsxh15?}iHdL?e{K?ps=G*3Ah%#>wFg6WwT2lRXhhpokuzx6>!#R zAl2GRW4Q}-wRnedoBfq#r?JZQ)#-oI}olvsZn53S4 z1cW=@eD2PJ_LTCd@#SE7pfcPwSZe+sjgQ;G;w$IGCQiS~=y!c{^+|p3Ijdufk}*_$ z@@ZzsIMV!g`hMel*WWKZ>;Aj%b4L3lQmg-bwXwvteD?FkBJH2Rw zD1P^)EvoTpcUG`{I$nqAMjbZ3j^|K&Ey;RB>tW5-8uM`Oa|tcYF~-oGBgUSL_DFjC z2nGQE_U;j8&j^~KC2d|Pr{X(QdotDDEGJRL+lFvs3674UzzAb&8o5Zu4hC%er`L`` zZ@LzB#IafNTTuaez7;+AigCPKF&@LNy=;^KcCNjYI`^0{uOZvc&m!=qnedu!3UScY zN`+S$ZD%6)D2rZ$$IH7byWZHh@^!dctdeUv3{nW+8@gV1fuO&!(#LNaXZWpXrRisw z8aQE`=v4+t*ryKwmPb3^GH!0L%xUAcz-3MaeqBTd-q+>Vg&LreL|Z;JmfFSl3|xY# zAK7)PD?@x0{P=Hn4b@P=8E1opc=nu+zVOv_(Rtmzxe&vs9So^I)^X$uJbm>jT}BU!N*QxV@?}q zwDYp@R0A3=&>*P2;&61pCyAnewEHKl9f>M_G-`U!@v|?@`pID`S&`bGj8z(rdX4^c z^k2HWq(94|g+F87&U%1qr@*4T{IhXI1EgKq3;X-wFF+8wO#IdOEHiD-{bsx~Fum%i ztH!q+J|i4bgxDs@X|$!UyozcK@+_)Om)Txu-KS(;xZf!RVG5B*H5U*wC@{)xP!#iv zR_ZpREH&Uxs!u60-zxN$S#HM%l6uuFN3pfoh9Md32jk*|cyuSaMz^8AnyIB`Fg&%(F1kTclZ7BZ3)(AO&7IBji-Ar%EH_zS_4>hQO`iohe5mLdd_B4+L6Sk#a}J z&+$|fDQBYP%aQUle1LOpX><>isL4hQY+Fk?)zDHy$UTUF9@HFha!yY8;Kk2yyUwm? zFUL`6YwXBd5hH6e7S+dV&29I3^FkZh?(}-rnHneCopH}Mq4Bcjk$OP8l@sjoFrFqS z$aW>~3Fu#m=t`gTJkZe}TD_Cx#bDthN%9{W#WD)*CELyS^-pip(elj6#?=gI?jSJ7 z6R2d+uFf1SHk8!ZE^?mKIOIlW$(og=f+6rNs-{4paAB&trcK4MD&P<`gaf$yfdh~O zWwuzaV=$g9!;GcC zHo(P9nvtg|tQ0l8uY6kchu7;Gv#y7Cdb{g9dB+32I|d(1Zj?ts53;N&X3BX}j;Wl7r`0#g zVU@$>`S^PI7P*6Z&v1DgtJ`X%d?!8_!zOR=K{%SHXK8uc>&fQpt2|ww%p>@*vb-1$BR+EV;MAl4Q^q zbL3l_q={_zJ_Z5F>Z}Da-{s{^KoUEp+Xj9*^2cblOs6H0<}ZRk=-87tLDjYe zG>ty8KDM6pFUm}mucn7#USm|`_Ctu}B{|Wp& zSAy`?X&jxW-mB!bG;yiC&P_7WOeea!RKCb7s#i$}c#f@Q&W|kj%EyEqhE}L}x4IGVL|e3(<+k&oe6<=qfsA_qLvqWQh zgcG#$kSou8H4sGK z$n2E5?YMPa!N zI~QUwMM^&=YZGU#r?56J(T-#Cn;MUh^+zpxRel#;rjC7GPS*JESk{#3O_CGor9aCl zE^S`>Gp09A6o$U(hEYHSRUmkpb^d=&$Yb#_>ZIHcA9tLTbAZ9?C*`)Tq_dqDboCVc zM`vsE-?Hmiw&)c`FT5oWa(Ns1Hqh0DA)K{lLH3?Vq)%A%+o$q3RB=MGsMkK0zqAv{A?UBUUW=soQaMz8@T~l@OPRY-2LDX>r>N!U z%)2_!gIi6TDE^WXZk!Y{K4dg9Qru2?7qGvt{A+A1nLY<+Ay@P>T_MY_=BZTE-}D$= z+-Q!YAHOn3(dKX912J70dujAIq=D3W<;h&5zR$jXpKwBdK96V-&7 z(zP1DM4D5``fr?OtNBDJqx!!qk?ncGkfM+ks8kqI%z{WEC8*4PFA6E9jAE=9-1?*$ z>0}&mfR~jFUnmc75LEWI654D&YA*tuc_DLY_j#qC3z59Iya*fDM!th)^X>t;`nr3}NE=In=t^h!L+Sg1^JK_>K0Ft*?~d4)S6*ip_p zl+h65-ts)Kj6?zQsI{x*UWq$G2r6D=DL$ zxw8ugouD?}k3%v48f+@l#B=Q>6XfTtDY|V5=qR-d0E6TLnGSXZwA5lHg^q1i@;tHI z`4eDN9L6Z9l1*jJ^C1sRriy{eTw9BCF_eGBq)_n`Wv*w<=pu;!saufOWsBK=%^~~E z={{*e^+YOr(^S?h2P{|tF(?cvqFbgY3p^XTwH`Y$vrFs^xfS=2H7BQdo$?awnqy5+ z)k~%*TjaSYPEGTL;5y`o^L!=kJ*jl|*|!`9P6)@+huoA{nb;^T5rLVbVzQhE!+}r)DkcL;Xxd)fqs^oPXzjlLKfhEHssEKDX*t= zqp>4>e%2Hfv55Jrkb+zAavo%1IbE)hTM`aTOD*SfnL{`m`eq(e7aMa zsp>^2vdLdy7mD-{R5};6nmXqSy6bXgZQfHbU%cS>GQ=`)oDLgm3Ol;cD^2;5HJP!g{P8r{X0evsuXE<8xr)w4;aD4^G%`jLNbCw zOde^=d=qj3wF6_hxUHmwpQR2OR~?F^kC!5W)J%r7FrR~&QYQR<70NgFz~z8LHI%gw zYqHm)^%=_lV1Uiwnp2obW4=I;Vi6s0j-@v)Bmakk2SULI54wgcKju5Mq#;Ml7}&c1 zsH3=&qiB2Cg5BQVVM>%LF&{utvEAkX;mLNU=?r+PwvLxbU2{1@%CJq6~|e zjEMZOkSQU_EU{$BO(Cmj?_gs$n){0BNs9gs`ZTqJ2_9#;DXF`fw1S`H`ffg?qWTxgJFB}dVv4W?Xg@U2+l zzbHC=2RxOkyL>i6mv+n1HW_QV93ov_YHr0qPH&M6iFTokq1%eGUojn~Y6~2-weKmB zH1s<;QnZGoP^<6cWHX|28f$3#Nu?EC`PrOFcR^Xf2WB=9Jf`zK&3!!Z{C%RaD_sbO zFPM%#?G>m`19xJF20IbzdznpWjinU5Cv_oMc8e*dlV%q+^XzIZ({v-qM2imIWX|y* z;nUe5A?aaLrEw&R%%L+siLGETc<)idKvPTOa%P5U?+`QQFy4~z*ZYm_sN_5JQrTCg z3eJZm*Tn~P0L$jg>Mn)P!M^J}TL}JZ{zfVHMwnN@Tv|3X=JG)>I0*h>lE`c#h{31l zs6JkZoPgth!Qmn6Ph#wPeIz(zhcj<9Lt-51Cx!l3=ca<<`r2(axoTIIp(u5 zk)ME48g0yzV!D8pzX5L<;tVZ@l0Na9*o6<$MImXts^(^~X%!=xIVLRWHFL{~LzdbK ze{E%ZzfDx9mH5TxefqS6Sz^XaCnK3JzBk|0l3r_XifqAHs=GaaN@xDSCMZ5TxCiaL z%cRNpwCnF%HY;QtW6D5tTqD(-wDd;M6APWoVBG2S;B_xe?EX0Ez$v4GN>P%&j zhpPGZPr#t0K;al@s^WjHGG8}#vW@;V)TArR?H?X@O z4oeBLnZ;x*(xjJ-`K6eoIR+$+Yi%0rLF>{Q;|>4Ev_|~dr+ElWaoYeCJ0`fcbJt>N z%O#U%hl0pvCO{O^#b5(7Wuj1-Rx3S%rjn!40=JG6pT(J-dV=2>I z-ME}_)lPr^S!_q;;pUzmoE@iNIjuI=tk8iw%oQysp&F}dg`u-=FQ9>ya!k8IK9gp0 zyMUvk$*a9B626x^IfUZxx59C#&ooC&;ESkx1!@J?Y^M0jCAEx$v7 zE62T*=2HW(%|)jH3EEcUW&mgK=-=CsQLgS74yerIbBoG0=I{>i3V`0t7*kr9h6Od8 z+L~$ZTd7bmb)qlYn>yO+uuAge5HsRLxuz5<|51)@J_5TChhkzdl}!w&ZKc?n>WYx6 zpl+$DtV3Q9(6|307kWUs?Lp*=ve?8Gv~K8s1!VxO`8RzYyQJjZlv&|C%GQ^;a4MS6e(3%k+P z38u23A^Gc{lK;r@nBI8xPzPG~5R4e>p(bWcPhSMJNWiJ}?7na&;uUOgs@-8;+b@8) zHKsq1oOvZWWsrcr*6YcNnTysyd%=zG+q$>iBG=Oi>qV*fJ}5vEjJYzCfr02ZwmF`|A5X& zT7hIhSbU4u`>|0YEC69~Wa(t`R9>Jind;d(e9+44c(Uns54692nB{7lj$NT~m*wD8 zpl>J>*q|wIs-codoX?ExmTp4@f_GC$KAlmJfineH-Pn~vqxX}(#`Q$JZpHO6S1 z?{2!il{Xn9LZ;H08-?~-HYsHfw08Uyb8wvy6v!E2h@_TuMdH6E@0;l!as=_e`+B

    _c2+0@F*u_6dfNUw52N(O!qXU{C;Wo9@syZDfYQe`2q4% zSY{?q&leQj-LwNiN1i8w@@x(iv}GBcQ?5gHwlDDF|MAD+8!_n*dK`KACqpT_$kfJz z(SX~I))pWEZ_r+e5A4=IffT4=9n4MUPjJb|_Bk>mqNNzB=p{xw8QatzFn9ci#JCM8 z&5;Qi6*AkFkr+c?^hP$WsukDgIo@Gf?a>WmpG0o@xZy=Q{n{L|8yfn(g%<~KP~3ax{9XMiHkk(e6$}7N2BoML+2O5wj(zY zAW+o${8_4$u5m3n9Y;G!d2(&-wQ}8oZ;i5TQzqdludrcN1;><>x z+jyU?F58I9hLF-5*^5QfmZq9$+hbCvKk~HXHgnG&O-vs`lKE8gPg9~t?>{jFneLs@ zub}5Ag?E^y(SZx5L?81wHn&c=8!O*&hmgb?lG=n)F_kwO;ik)(Ij8NvhyyFX#)g5$ zyU6E%@KWjjIfMXD6WVaj{=Cbc9Ze4p!|e%9_BWY0>k;TA+#&1L=(oAL0!g}J-WaUK z@bW?9srGj)-nn%J9e)w|$D2Ct=h%el+1Lm%M!S+DzqLWGTx;G&&wnXK(gUH&ERUkQ zzk%ZrS8Fb#^xld@XRpW#_V-}p2R-+t*xtm}ZLr)%+e4Mv9yNdZ8u{S;)@-INUYB51 z0Gn&g*v;aDDKXz7(B~I~X%!kr#F>P>rcr#asRsrlE{cP3$LPWDu-_EB!@~j*i7O~C zz@1((y(!fcmM(F=?HXFHic#V{usc3NT-5Z+%I*O1M$_9Xo-<-J8l&H#GK+N1~axtsE zhceuQ!<;3l!*KusT1oTsgLWJ@Oi^$-vWXQOc+C$x50>7jYci?jMR~e%9uo`^krCf+QdhG;+XK z&Q?5^i?~SSAHfX=O>3y~38Ms?bbYr9DsTE9nR+&oPWhivTEAN9?KNJw1mQY@k&Tm^4RO*>@rANHb@3$T8r zn8g{>YwBodK4t$=N%tU|H?H4s;k>OZ-iby~@dcr?GF!XUtn39ZoqOgLxWG+4p~^p~ zcrNn^b8*LH$+NocYSdB*CxGAKePE2@y$;3)F2BpWNesW`6|YH(-a^wGrtDXITV32d zGsMNz2R;2iQ>(1>kRtSOYj*QUM=Cj^+!K_<1b~7IN$$e|DmJfc$_N6V7h@xxr&87o zi2ZgIExm`Qq=DCMBMo?ejns#81%9&^JEx>&#=Ipc5%vKEeC|fo3y_$@ zauQ*oxP`%n3A_;ks1baJP*ZkPeuO#SgK*waZue{AHUO3%;(xFs($d#F*Gpw-lH%j4 z&af%w*y{+cdX2ET9u%Xi5z&vvT{dr@YI1)VYtO^XxgITo#9B4;|)=9@h| zZcY;}O-iEbxBeG2jW*Bl)o}^#7otWr@oEJQDW|hrrow330JG<$n#+xT*=igcDlRtY z`q`UD+vb}+BTviThPkVH$IjWHfnP2(dj`w^X%cNd*OUetsZN&Rm}kX&v!~kE#x_G6 zm&>|%*Fh6-e1&<5hb)5t?4am`@D|&o7c?X&7}KApZ?vRcp+i5el6!`&DE$ZM5)U6M8Dxj<&|^xlxl-=XO1C>UEHa{o~`P z;tsR-j{T2n?FRyy&PX9_=&Pl#Zo?AN^^S42bXc&(>>1PFdqzxXWH{A7q!^n2F7|`3 z`%9C#pL`n*L)*uSC)>IDTq3q)U;V}Z_Q&hv(w(ZnM; zksVD+t9;Pxxiqx94EvL6x4W_=SXXWYl{{?rTrD~NzBs#yr&HWp#uivK=BHneXCX0* z^HS}%AI5paCYWgCQVsHMd34UVA7JlYQ>$6a(`L^_k*ymL5p06lwe>k9ryA4IkV0 zn_s`_!e!g9nmsKf;Ns}XXuCNM8n|x^lj*?kh~}36O-y5()SJ-$K_?tB5BG9X&ul{1 zHi_V+zGaT|F=E-7g~9m-OxK(A%$i+Iutt4u5EAZ2>RCsyDk#A}{*L)3kKzCQr`Qd` zj-j}O;a_{l%Z*t79kc`@@SB5br?Aev-m{%^*iW854YTXIHA?w^1?A{xVjiwcXi5hf zt686VDV4GJ0_DdiBVk(kKV21YP{?oi(!AB11voW@$lQMcU@8Gt~W^>yExvplc` z^{#7&jf!e>cX7~_w2q|YVQ|d{QnExiJq5JoL65sj9Of*tJVX}XZh;k!Q}4_5tAujBZ7 z4im*g^p?D8?8nz-`!sYg-Cv8xqvSrc@QQXG-826LPa%;t)TH=09)V4qA+rh9``KRT z7|D_Y;M#5N{~IXbn%D}-xVqs1raoM{bM2o)k)?<+^M;U7w!PikQ6dh+H(ZqV{zrbO z70X}X$=J@+?ixZI8*@##F#AU&Qh#ZXU=djc0e+euCuhrP*Fv1YV<+!hv+RoVkWE2L zPQcO?u&f%$s$vsXw?+QMh+8p9>z%|B+Uc;&dYZCaN~jcDQpNA+W0nk{`A`n3P|HH2 zp;3Pp_bHFhi1dZe!QMh^svR!i=;BpeEohx>m(B^uG@(r&C z^UZ=Js&u6(n;qKk;-p7EuOFBm_lnK*K8AGC`b5mE!}^1y{2AC2(GXwvg_%~+pjcOy z^5gTLBq6Qj&V@KS$s{kvkK|F#N66l}Z-9Wi;A>dcyD-ya4`{C%qzQZjesItds3KcH zrt?c$p5f_E&H&H=e#<>85lyo!t_b=c8nkz&AqHckkgzKCuUE`GeX%>(t~5x(&BH81 zfxl5<%m_&fNvFMGrj;J_^~=KM`4dBgc)Hr!RPK97@G<3s)4Xo|poYaS0D!?fH3Ma@ zRwUy*XoOp|p`2YVCn7iIppb#kRw*GI{g8BwM;|04WDDKs)DR49kWl6YYR(?43WDc- z$p;CjJC^lDxryb`)0;=?fW3o-ZphX9rwNS}3Yu;ZDlaioiI8P9IX8~lowFP-TQ=ao@HGMyW$tW6+gkbbUM3U)`&Y^rJ6zQ8SyRb?SZbNKBPZAN7siTYp7|h3$ zO}o6|B~f|;fU*tKL1>%j{%y{o{541q&$IY|-!2q$L&fn#A`A;Vj27p}!O_@m^aRWM zL(i`fOker~V4?SW2CL|uy^8b`E`EldULhEc9qev8=*IOa+I-$&CjzM9jFCbNjnDAt zwmvi~OzQdH^q4y}=&?TZVRI>)Z>#aA&HW5F+ym>z8uU{iO4|(yg-H*tpS%E!3wq3r zq>BD9q0F;!7<8|k5q?EaciUW`a1s8~7-3-0C=@$8*Dbw6gRQz$JTgwes0zmQ7(W(H zuX}a|+#=}eiP&>9xQJ!|0o%~g(3YxiF(*;gK+`%WB?BTP%raU?gLn)u2)&Rn*z}BB z^_y`RKQId#CIxKi#IjIC(ywEK9kPHrpCjU;em$~1>>trEW*Q7G4UbI3Nt>WL2c|yH zk+A{BSD%*X$r=I;2fuYE3%!DCJ##VUFi5u0#@Vnv&qCmSaIfbWM$9ih|0p(M1kZaN z63>_r?S_UuSwfr4psWm}sTF0ml&q9D7(~@gHR0Oa8JN*ISUNKbI_v$%L@QmJVk!?# zKwF6uLzdF{X_%7*06VEc!Sz9=C)ZlC+z_F(>!x7E7BJ^<>RiOunF;~hlqv(yDPU!w zH5Z$PI$6{#S{mqKYB1~eGZ{wWV3tt0lyXj)kb%k*P&=9%gT0sT-4{TwocS5?_IE9~ z0;VLrETmrXVEX`-Hqb*nr97Tn?hSK5t}E4!_AFShPMi(A0cix#?CXN<3==J8sl)4puFd-fb#!w&lo|5X7K4eo>jCWuLFP+qDO~wZXKKCCK-OuaHj5?lvuP zwmNPB+yWMv^;d&a=#DAsw9}k5y}NJqoM*8)(`BIpIE@*JKA+)}w;q_GxT7#>F(#eq z)&5cN@NnE~b7WkSLj)6l`FyvX@h*efJxv2k^XB5g`wbajc&}lpACjCLeX6ZADWJo~ zIqE=x51`wZ2*{?`s8H1T-LBpEN)fD4@UfbWFCtLl(Aj#H0vFdL5Wz^n_#z@Bj_Nrb zrM9%Kos=1nYDnIO7ZGr9R2z6ZX0ub*LQ=M<{`=l{wGT@Xq6k#2MFtnPiAecA2@yO* z?!4QMFU2JC*b4#L&hS-j$O_nwom>4^)4W$V4s%-HT-o?|qc_&!EA88wJ%=1slmM{< zLk)6=WGr7~g!BvPfgnjY{L8TaWzY54!u=&e+s;`$wxC}ZqvhdEL7r5WH?c{LQl@Kp$LvCE>o5Gr1VP=y;p{X%+kRQmWpXvs36bqC)FF$C9e zbXa`DA1d8_W3gC8<^yN&$ThyQNHul9eF|EmOjTv_sFJ&^a3ZI#wF{gVk%pH{Rv278 zHq|YpCxhW&v+$BB!KH~z?X`zo@g_cI;>cv$vx)UAm*b7-6P9t9MayTR*H~B1=YM%v z3hntWvm}Tzxq-`s^4DY7Utf4%ycMx9ekqGbxCiwRye znrWc?qLRKEEQBQqGGYxaI3HP7(z#A@F$K=VCCv0Y&2jfYUK+c|VLp7dGIA_p8n`PMKP@7-qkjLc4Wi9xZ##wA&Z-xCBHuSdNf@zJeQ9Ila(+(;U{#%T=I_ zIdDe{mKs87R+$j#5oQe|Z+I9kZCPTOjuc;pa8_}SX>)^q-Mgo;F2ih(OFuhP#c=iI z2>djTTZN}g_q%axUc)?cV59S=EnO;ysncBmFD8v;<9j^RAiMEoCPuriZ+b)Edbw&G zt_fUA>e`LzwsaQwXQk=PY16$TG>w*xN z(to<8B6Y!*KdZGQFkwdW$lmt zB9}&9-*4@>``|P|sv8XSc(vTe|Cq#DieQb<2cmOm`5@tUR}#DoJbiw}6z#IU)exxe zG+hm1HFVBz_Ng)NKRuI>iKlr<;&{?hfLkM!MdH~KOJHqeJj{2^)sREAntQ`N<_{77V zXtdX(k$m@ou;a9sr)vtMaQPuj^PPjh;rYTeuvg8T=BKjk=fvERc&#_%%iLYWE3eU1b|F2N-<)|!edVc~+( z{)ko&b)-?k<==Y5m}gL8aq1vMhll>$@-evpg8X!&ny&Vd6a=*Gt&|x0CKlt~fec{G zq+o*PK1qRS#L%8YxMJ_vM7YgC87c_Zc$SpOC5G;u-YE!TxPs9WM!5jvqYBBL!s(69 zNa5?)rRxM4z%wp<8L`dDR;9v?Lp)g&aw%XL)!%T_$Bidxj6=v=g{0uYtN=mb4X5g4 zTp;Y|AU$PN;FjGhI^vjYch+p;L|xkzYzMvDLs{%>pB(qQCB2CT++|7!tBrZ}PpdU7TjMbs?A-IRPb{?i9+m7IhS4%%++i~#430Y5S5FBK$ z-7nS*WuzO}oA|~TC#eC@YyjAX9@6Z9yJ&EAWCoq-q1@s`AfcLVD|-YI6DU69uVUgO z(C>jNayfPHVcz0_#~~h#Gp;`H))Q}exhGKa?VlF9V|NLkIJi-K<|%lE{6c9D9Zs+H zR$?o!3Q99p%`xlntlXBqc@k9DeFoX`gz$2eU^NedHuuwTTRQawoWc_dX3m~2{?jfh}E=v~4snBucUQG+msha|IzkTb62-3*Vw1S~O{HAA01gN;7!5(|lG zOJ&apVeI~OZ@%#@Qb-RaQTC&PY!CR9a$wD$fjgl^fH;}t@?eE$2_9~8EivA+gce0| zficmu1P?$l7(IN^z%?Vsw04lP$+HLP-N)eM@u6CU{NHHdr| zb3kP(sxxhBFyu01jIx62{^Gg^g6D3@&c`N{!}IWmf2*5^&F@HI7uZPp00!MRtRb}* z;kJJlnxr%3j8Rs4pan=>Y29IMZ%mNE!_3J_xl{9V!aVZg1sPPruG5t))n29(8th|h z;?VLoBS{ZC`x4N1amNMJw59CvNG)1$9Qsi=3|=uM==H)EgidY>I%Bf3!HGx4At8hM zz5pOTbzH!}T{yX81z0&jhU$7KGxW@SE=~hj%n#NCW(7u;ugcs`B9CA!?b__Zli+5e zFqSiYAf&_ODWHOs8jhZx{Lh^@d)_~m-`wfH_;u9|&J|ixn}tfHv$w|em%36-KS=Sh zeuw}E35bgyPlo6NEr3MM(}u*)A5j{E{v@OZ=RogUp}6dH(lZkV!;HP(<4)tOVoXbp zZDrj*8E$9!DkaRx8$P0HjxYynASM=7a!^d>yg}B)G+%&gqII`7T7rG!5JgWP)dDJBb{M+h{4t?jYwmi%(DVJs+!f2P z2aw%C!m76>#$Rzr$RbMkw|s}EL7b+UF}AU~2n!`FhRtryzJ<^1*=p8JXrx=nbhtd- zaG&-}W{F%p47RAE*VGJPUPyP;VD`!nDrQF=T6U*tdxPPkeXC){eb_6WtgX&A_qpV?zL!&G7vxGA@=r2;|H{BZ(A$GT0!+kR8h7P71vN7B>5>>^f|?59&-zI()XW(d^?$8}CW?n!Ih)45Rwf7(79>edRG_ zqmyjjw$HqzyMwp1$amV)36iT!2S|tBboxdC2GW@V45Z4(m3@A|^(BAYiAd*GE*GX{ zG-h3F>(J%LlslYoIIncHa63UQ=0v9+Y9P4i&MX~7&)_(1IH;_0wy$SR4Q7yV{{@*> zQ(UUEsYTU~NZ@W6i|Y;>^zGam=a}=__k7TB%t@0pH|(7NK7SAM-8~1rLjZ6+GCuUV zb+8vYLpZ3cc2dJ_4Z}y6O?$854)>srUtT%tHFaxT95N#xi>QcjI%lvF3v;@R2QIt- z3Jzb-Y}Xw_&NQCQc64>4ZQJFet}{9vRAc5WrC%%gRQ0;6S>wYU31q`5e}Twzum&lP zNcj7@;<9&8^NZ|&obGf`gWM~C>l<{gM@ZPON!k5|@|07woS5yL6wG?34=!{S_m+LFV27m}yED!sAk+UGMg~ig<>^_|^KU6_Xxpbkm{-8jAFPdk z2dw;4K49%Tt;A8qLW5+spE|^t^9SX%It<~OPkcZLKa1d3Nu3}!KvSw;2-p4!nq2T; zp=aNC4D^jc%?ZVdjdz|QSl=*`sqP%~S>1_XV_WF$g_QqK;OMaYUWt8!9umkBJjV%V z`%KB6Ao!js_TW!Y!(rJK2+6h&l*fF5Iy+SwuH}13?{B^}pj+aDv@zepS3=I>6#u~_ ziu^Z1;pi~d<@U~6$+5cj`C5z2i0Cc+&%RI<}3AeJ|yqT z7m&R8MFu%oV7N~Ab02U@eiqvJ*xTU`tAeZ8U~=v=MF}o63Ld)}3rALD);Z43_N%FU zZuz-cwUgg9(3#*^lzZ^3ih2qKB|^|k6=gkFaBHf zS@pB;AhfkVHL@1R^{9+YxmDf$hj|cP^};hJ;86(fQn^bHZ|YLLi-GYI)$~_)`a*2I zw0wtse?E6{N7f5bJ~t=1qdx93ddI(iBg zDUm^7asCHHnHkHy0KE1C7NqN%8RG35OppJ7{S=lTAQJBEg3&21?idjgPz;@}3PL|Rpd&CB(V zDLm_%zb2;#oM+gFU4mj>?nF7KyP*|T{0jP^T08PZUVn;$%e6cA^xDW0*r-D_{&1-K zx1Ttvm)UcN(4s4-KreRjY4*sEk?{?KbAlV0axdYoQp_nnM@Ilq9fR9@n;GFHmcDYH z2Pr?xI+_3A>}1F#axBe-3~uab-s3b-i z*OpXZG$?eXtN8&p7~Sd1N3l_cUpyZ4Va)B7hL$wvBo-?+8_m-4yT;`+Tl6say9g5wFwm*?XH2-m6C z;r{pl#qn{7k0(A<8fC_914H5SoxOrtlsm6=f>M0@g8rQ-A7DUImj;|DOcW7rbuKQl zlZHMh;>^(nFi3amN*~;pTV=+C-l6L?pUU@r85K?q=GXdg_i9!@vrAMNse2W82 z=_S~35zwg$pc(hJKvJoH^*6gLi?~4!qmreF&Z7?wZlrj!O?l5&AD4N z!wn!;O}Kof4eJi~3~h8V!jR}ATH_6%G6p({b%&Q)oYN9x;#?Pxz>zlu+^Y<+y2!5a zV145S$1u*^#z)-I51@zQdG=M4vDBcY4OgxNO?EBaWbweM47p%lTZ#1)x7`nZA|0OQ zf3*2F50sqn9Jl@i-ILzXxM+gFtl*|pn5*VFF6VJsJLdMu?OqM7UG*`?q{4CiO|UZ>x6G}#na6uTJ+oRW44AIft_wFTGvn42H-tb^ z3{_bT@l-aa0gdK^9KCk9miVV}F@XTsAi4)0i34!fY46wadXsC`NE%WIKWqMPQly_G zC_dmqjyRQ3#);VNTSA3(I9l9L#v0ID?6h3G=bX3l1WM%N=X)(Qk_T$~)rP_QOJFnWE zE4#q^@oVdR*(jedB3ZWt<<+_6y&GD&(TqfuOUy1h5<0|wiB@g00inz^c-4UU@eYs@a2P5G$txb2Az9VgCyCk3tsu=j1K;+SsesM>F?s=iIi@;G%GynBm_ zvC;xT4r|!a5B3Mn*`-tuedoW(9yg&U^E`#H@kMgYL*+2qaTMEh0Guhp?Cy zR91%}cbJPjCVBdGSAk8ZkBVJ04M8TCeEwd$#&u+ubG=k5aKnze{7^Ra#IO&_NI!2g zmpBDLzpcq{TXqF|&}Lrdto2A=LjoNu6BQcW591ogw)})o8mOJs2elhGP4A8`S{~3y zLHmEzT?=rO)fLWeHg|VTfXybG5JF+jCI2ofTMS0YfTfl5LMFhbrzYoi!^ zj9Nj$Pjl?xRA{wItqRI$#kLr&j*k`vt!-_qWyT3wL7}KqEo1wg`|so5-T(jhPl&di zOkTVD-+S)4=bU@ax#yt+`lvVIT+eJzN7I@+Jt3d~Dkc zdjVCJ;>3v?h#t9=@Y8+MVF^{(ji@N7qiWC)d={OS1NSm9!7$W1%|1Lim{893Lv(=8 zDYehErfdIWpIegH)!6`uQ9T#%PRlyig=2<+In9<38EaNrH!0 zqUV^VmUL{pF)QkT26duY4HXPrxpr~yHZ?yidbI4VDE4nm z(LoZ6S{ukL&`NFpPvZv;L@B@6qg9cp3J+H}SM7FY(MkK+Pu`5u+1xA5(s&ULML+j*iyUv2X;svi+nC`gMODGikX0oW&iHvL3zDG9)fT)K*22ZPUUSHKbcqPC*AqKCeQu8O=h|mLW6zy07iHb&W z2B)AT#YkY~v)}2BZzmf)E8D@9K8@1LRVQPQ1$u4?+`9X(vR{y@=5{rQv%jc!370|- zzo#iA81tS?c~-N=V&1DV8B}2F@cs5*%&p@}3n;7%hOxk`2jP3uk zO$;Q*tBLI)G{$aW^Bswk>85ww9%})dvc?(O=8XySSFmHA;XX>VMm`vVLpD1)o;b1} z$v<1qX>a9%o$stjRY+zv&^;vHD`@duXxjMfSkzQBt7jE+%5|O7UYmVf3lU>h!6g3k zSyWYPpA}l(2xZx_Uvw3vqS- z=&ZKVO}NjV#Q-UpvZFIl%QnYsDeuFlripIU{k=qP6UD!{xuAny+=Uztona4bM?)(P z2r{}J4HK=-)AJkcsQd1Qvp9H`#+q}{apAH$p3YbYnlRRi^(aSW5Fu{cV9yVj9HwKS zqhbpEcC9s|A*$M_Z0fW~7f}pe!v<`yC37N758Nlw$@R(5Cy@@6+I%6VtD>lGg|d!L zC@{-Vv5Lrc4*(l8i&S$!G&$sNfl7XGM@-hc8Tr)P)0lkfaUJpK@73mIh2aj25zC31 z2)!34g(FHWQk6dRpe{2%LD@2Uc1*%cm@@RotZlW=rtPO=RS*!vlb>4s^UvY{^-I7iwjxBd*-n5cQGjbmvH02Xzg>Qdd0U7+%zd zB!hN*Fxat^uSB?5IgcsZN8-OV_-c{^wNvWj&WW_6!|Cx=pcMQfT%#;SYuClhj$Ag7 z?kg81bov(Ipw1I$(Q?zZfqV3R!Zk4(E;SWmU@&c&jZUD~ok0D~5IAW|v93B<0f@Vl zGQv9OXoc{h$`!W`X~%L~sk;ghs<+P-m9{l>_)=#UotrCMS+zjdI-qB>%+K&ky2v+2Dy;YnkZ>j49zJTpfW=N4kdIoJ-aR?NG~ z5U4hZ zGmQ?`BPe|8=eV$Vw#E&s${3Avnt;X^w?v`Qn`1)wK++XWqIi59OiH3>EU%-M`A*Zl zWFQIx2N7Dq8Xzp8OxBv>Lem|JZE5C!@b=kCkvAlQ>Zogr$fCdBD@M3EJ4n{CkIS0L zbs~q#R*K{wg(rLmc@R&Yc z1DCzYUWR}g9T%50YqjtpDX-Y$zB$M{mSK;(^8>)61(0j&giqP!9|*trsP1}KI(b$J z*Whe^G5zgM$mR9ZoxA$A`2}CmzN_%$@X2AwKLgzJg2CNxOOT$&R;STb>%^GB+2tHM z)`d>UuWWJdj5uX1amv<*Y{S2z-B#iHN_KlBG2DZ@<(9xbuPrw}4KH~FsU=U=z};&i zJpa%tX7>Le{8OtKM|DjiBQC~R-LiHXG9+KqX=skO`g6#gi+AYk-7GHC!P|IK1pN*h(m_zYrkKj4!In z@l??xhSHlii0s@t=7Q+Sh9Lw0YcC?e00 zDCD8K`(K=+l9>^j1ERoIYRer6U512|-mGGznNsxUPLUg>2pa%4%rD7pEt`qVwlr)D zDEQ5j>DA21+zgV9e_oFIky>zb(8^?&0OQS%hgJNUT2Ep7qyGzf>=uohY_`D}GwQLo zY*(_|gDqjMkieY{__y{Q-t$I$vy5uR`XnuoZJx-b_EW+G;f+pJn*DCsCW>R3MMW#M zZxfT^?(v!3B41kJ^jxhiJGBso^CnQqMj)A6z^x4%;L-D1kUZUcM1Dx}m||#bBpwVf zL}&7xnaWEihf>Nsk?sy*D{S{_fqY^&kmGtErsJLu5Ko}>UIZ}oabJ66d zz9-pACAr8$QH$E$`{2xoJP89R{n0*gaa^J^Gr6Ouv4A>5$wCaxe_fg|vMj7ZD^5BS z*Cn(mN2iXZ=IkWDQdyd^b6Pqb`lEBWvT{m_QZ{WVt$xEXrWr*O1HMF1j_TiPmBNZo3+}ti ztf_icA&Zs!X5`bO$DA$0WnHiQ1NN^B}m{J$Lw2PHPQ%iN1 zrsP)U^2#*+(WGU7xSp!LZa5YnaC)a`l@zT=VQyh>G4lz#s8~_F7Qb7u-fPMBgd>eU z+ktZ#-O$om3q#NBPZQIV!)R(#wZ_d`#Lz?_2Tm#6+Wr!~KQyxWsi)z<)#Z^xPm4?9 z@<>=P^HS(wje7z;dlQ;@MNJVO)5Ky}_v9spBuDRnWKViKq{&)VJJM*u!_c)q`H8b4 zdiE(+w4_R)wGKYnz>x6BYQ13r!NH)6)&qqbDe~DVPjsdDoisY#29MDBfiyQTXgT(u zRR=?mGNVBX+&R$RvyQY(wkP;;W*gQ!m`$LQ#6eoV1*B2$ti+stY+CRtM3OS4);V*G zF=WYJ3$_n5#7waPX265osgnuPBT23lqv7Fot<@#(^(*z9S}22e8; zt2i)N;HJgTh^&y{iWWKUkjSCKpCqm6k!UytY6|H4Y)dVm7oL3~X^#f~L# zQX7)ejKL|=1BZ>MR-hQZ;>zTNK=+AFG*T~<6!~4(I>j;wij%koS=J5zAo{?sux?o=#wR3QhJt8 zaz|X#n?@MSdd59l@gA8FaG@Q2Ke0eLRF_9zW+Iu?pXA&@t4~1Rv^aU@m4KxUyTp#t z=x70EKf3atsI~9^G#E0#Y^RyN6dL8%8f?`KC2G4eOjk^@XA5@&}Q+9DeqOcmu_5)K&l{)hs*Guo)bvO zeB~8~SGi|chEi2n?<@!NHzhPHwf+*NEcGt9joU!raPTNK{)Nfq5SB|2zHvENWAw|8 zOr>v3p>s&W1sv0)q-LfmTT8rIMF|rU__YFjaa>pjWJxpsq^=vBKBaK<xzX0C| zh@#^i&deT{Gea4bf5ABB+Zw!~h6}YL)m(jrZx4dphS!wti9YyOYGB+gNvOt9{MyxH zGL_R4acAF=l%iaiH^x0pf-xbXNa?QhDSJE@(& [AZURE.IMPORTANT] If you choose to make your azure blob storage containers public, remember that as the data owner you will be charged for data egress charges when data leaves the data center. +> [AZURE.IMPORTANT] If you choose to make your azure blob storage containers public, remember that as the data owner you will be charged for data egress charges when data leaves the data center. ## 2. Configure data format The data is stored in text files in Azure blob storage, and each field is separated with a delimiter. Run this [CREATE EXTERNAL FILE FORMAT][] command to specify the format of the data in the text files. The Contoso data is uncompressed and pipe delimited. ```sql -CREATE EXTERNAL FILE FORMAT TextFileFormat -WITH +CREATE EXTERNAL FILE FORMAT TextFileFormat +WITH ( FORMAT_TYPE = DELIMITEDTEXT , FORMAT_OPTIONS ( FIELD_TERMINATOR = '|' , STRING_DELIMITER = '' , DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss.fff' - , USE_TYPE_DEFAULT = FALSE + , USE_TYPE_DEFAULT = FALSE ) ); -``` +``` ## 3. Create the external tables -Now that you have specified the data source and file format, you are ready to create the external tables. +Now that you have specified the data source and file format, you are ready to create the external tables. -### 3.1. Create a schema for the data. +### 3.1. Create a schema for the data. To create a place to store the Contoso data in your database, create a schema. @@ -121,7 +121,7 @@ CREATE SCHEMA [asb] GO ``` -### 3.2. Create the external tables. +### 3.2. Create the external tables. An external table contains column names and types, just like any other database table. It simply doesn't contain the data. @@ -131,7 +131,7 @@ Be warned; this is a long script! ```sql --DimAccount -CREATE EXTERNAL TABLE [asb].DimAccount +CREATE EXTERNAL TABLE [asb].DimAccount ( [AccountKey] [int] NOT NULL, [ParentAccountKey] [int] NULL, @@ -147,18 +147,18 @@ CREATE EXTERNAL TABLE [asb].DimAccount [LoadDate] [datetime] NULL, [UpdateDate] [datetime] NULL ) -WITH +WITH ( - LOCATION='/DimAccount/' + LOCATION='/DimAccount/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimChannel -CREATE EXTERNAL TABLE [asb].DimChannel +CREATE EXTERNAL TABLE [asb].DimChannel ( [ChannelKey] [int] NOT NULL, [ChannelLabel] [nvarchar](100) NOT NULL, @@ -170,16 +170,16 @@ CREATE EXTERNAL TABLE [asb].DimChannel ) WITH ( - LOCATION='/DimChannel/' + LOCATION='/DimChannel/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimCurrency -CREATE EXTERNAL TABLE [asb].DimCurrency +CREATE EXTERNAL TABLE [asb].DimCurrency ( [CurrencyKey] [int] NOT NULL, [CurrencyLabel] [nvarchar](10) NOT NULL, @@ -191,7 +191,7 @@ CREATE EXTERNAL TABLE [asb].DimCurrency ) WITH ( - LOCATION='/DimCurrency/' + LOCATION='/DimCurrency/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -200,7 +200,7 @@ WITH ; --DimCustomer -CREATE EXTERNAL TABLE [asb].DimCustomer +CREATE EXTERNAL TABLE [asb].DimCustomer ( [CustomerKey] [int] NOT NULL, [GeographyKey] [int] NOT NULL, @@ -234,7 +234,7 @@ CREATE EXTERNAL TABLE [asb].DimCustomer ) WITH ( - LOCATION='/DimCustomer/' + LOCATION='/DimCustomer/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -277,16 +277,16 @@ CREATE EXTERNAL TABLE [asb].DimDate ) WITH ( - LOCATION='/DimDate/' + LOCATION='/DimDate/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimEmployee -CREATE EXTERNAL TABLE [asb].DimEmployee +CREATE EXTERNAL TABLE [asb].DimEmployee ( [EmployeeKey] [int] NOT NULL, [ParentEmployeeKey] [int] NULL, @@ -318,16 +318,16 @@ CREATE EXTERNAL TABLE [asb].DimEmployee ) WITH ( - LOCATION='/DimEmployee/' + LOCATION='/DimEmployee/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimEntity -CREATE EXTERNAL TABLE [asb].DimEntity +CREATE EXTERNAL TABLE [asb].DimEntity ( [EntityKey] [int] NOT NULL, [EntityLabel] [nvarchar](100) NULL, @@ -345,16 +345,16 @@ CREATE EXTERNAL TABLE [asb].DimEntity ) WITH ( - LOCATION='/DimEntity/' + LOCATION='/DimEntity/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimGeography -CREATE EXTERNAL TABLE [asb].DimGeography +CREATE EXTERNAL TABLE [asb].DimGeography ( [GeographyKey] [int] NOT NULL, [GeographyType] [nvarchar](50) NOT NULL, @@ -369,16 +369,16 @@ CREATE EXTERNAL TABLE [asb].DimGeography ) WITH ( - LOCATION='/DimGeography/' + LOCATION='/DimGeography/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimMachine -CREATE EXTERNAL TABLE [asb].DimMachine +CREATE EXTERNAL TABLE [asb].DimMachine ( [MachineKey] [int] NOT NULL, [MachineLabel] [nvarchar](100) NULL, @@ -401,14 +401,14 @@ CREATE EXTERNAL TABLE [asb].DimMachine ) WITH ( - LOCATION='/DimMachine/' + LOCATION='/DimMachine/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimOutage CREATE EXTERNAL TABLE [asb].DimOutage ( [OutageKey] [int] NOT NULL, @@ -425,14 +425,14 @@ CREATE EXTERNAL TABLE [asb].DimOutage ( ) WITH ( - LOCATION='/DimOutage/' + LOCATION='/DimOutage/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimProduct CREATE EXTERNAL TABLE [asb].DimProduct ( [ProductKey] [int] NOT NULL, @@ -470,14 +470,14 @@ CREATE EXTERNAL TABLE [asb].DimProduct ( ) WITH ( - LOCATION='/DimProduct/' + LOCATION='/DimProduct/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimProductCategory CREATE EXTERNAL TABLE [asb].DimProductCategory ( [ProductCategoryKey] [int] NOT NULL, @@ -490,14 +490,14 @@ CREATE EXTERNAL TABLE [asb].DimProductCategory ( ) WITH ( - LOCATION='/DimProductCategory/' + LOCATION='/DimProductCategory/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimProductSubcategory CREATE EXTERNAL TABLE [asb].DimProductSubcategory ( [ProductSubcategoryKey] [int] NOT NULL, @@ -511,14 +511,14 @@ CREATE EXTERNAL TABLE [asb].DimProductSubcategory ( ) WITH ( - LOCATION='/DimProductSubcategory/' + LOCATION='/DimProductSubcategory/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimPromotion CREATE EXTERNAL TABLE [asb].DimPromotion ( [PromotionKey] [int] NOT NULL, @@ -538,15 +538,15 @@ CREATE EXTERNAL TABLE [asb].DimPromotion ( ) WITH ( - LOCATION='/DimPromotion/' + LOCATION='/DimPromotion/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - - + + --DimSalesTerritory CREATE EXTERNAL TABLE [asb].DimSalesTerritory ( [SalesTerritoryKey] [int] NOT NULL, @@ -567,14 +567,14 @@ CREATE EXTERNAL TABLE [asb].DimSalesTerritory ( ) WITH ( - LOCATION='/DimSalesTerritory/' + LOCATION='/DimSalesTerritory/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --DimScenario CREATE EXTERNAL TABLE [asb].DimScenario ( [ScenarioKey] [int] NOT NULL, @@ -587,7 +587,7 @@ CREATE EXTERNAL TABLE [asb].DimScenario ( ) WITH ( - LOCATION='/DimScenario/' + LOCATION='/DimScenario/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -596,7 +596,7 @@ WITH ; --DimStore -CREATE EXTERNAL TABLE [asb].DimStore +CREATE EXTERNAL TABLE [asb].DimStore ( [StoreKey] [int] NOT NULL, [GeographyKey] [int] NOT NULL, @@ -626,7 +626,7 @@ CREATE EXTERNAL TABLE [asb].DimStore ) WITH ( - LOCATION='/DimStore/' + LOCATION='/DimStore/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -635,7 +635,7 @@ WITH ; --FactExchangeRate -CREATE EXTERNAL TABLE [asb].FactExchangeRate +CREATE EXTERNAL TABLE [asb].FactExchangeRate ( [ExchangeRateKey] [int] NOT NULL, [CurrencyKey] [int] NOT NULL, @@ -648,14 +648,14 @@ CREATE EXTERNAL TABLE [asb].FactExchangeRate ) WITH ( - LOCATION='/FactExchangeRate/' + LOCATION='/FactExchangeRate/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --FactInventory CREATE EXTERNAL TABLE [asb].FactInventory ( [InventoryKey] [int] NOT NULL, @@ -677,7 +677,7 @@ CREATE EXTERNAL TABLE [asb].FactInventory ( ) WITH ( - LOCATION='/FactInventory/' + LOCATION='/FactInventory/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -698,7 +698,7 @@ CREATE EXTERNAL TABLE [asb].FactITMachine ( ) WITH ( - LOCATION='/FactITMachine/' + LOCATION='/FactITMachine/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -708,7 +708,7 @@ WITH --FactITSLA -CREATE EXTERNAL TABLE [asb].FactITSLA +CREATE EXTERNAL TABLE [asb].FactITSLA ( [ITSLAkey] [int] NOT NULL, [DateKey] [datetime] NOT NULL, @@ -724,7 +724,7 @@ CREATE EXTERNAL TABLE [asb].FactITSLA ) WITH ( - LOCATION='/FactITSLA/' + LOCATION='/FactITSLA/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -733,7 +733,7 @@ WITH ; --FactOnlineSales -CREATE EXTERNAL TABLE [asb].FactOnlineSales +CREATE EXTERNAL TABLE [asb].FactOnlineSales ( [OnlineSalesKey] [int] NOT NULL, [DateKey] [datetime] NOT NULL, @@ -759,16 +759,16 @@ CREATE EXTERNAL TABLE [asb].FactOnlineSales ) WITH ( - LOCATION='/FactOnlineSales/' + LOCATION='/FactOnlineSales/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --FactSales -CREATE EXTERNAL TABLE [asb].FactSales +CREATE EXTERNAL TABLE [asb].FactSales ( [SalesKey] [int] NOT NULL, [DateKey] [datetime] NOT NULL, @@ -792,7 +792,7 @@ CREATE EXTERNAL TABLE [asb].FactSales ) WITH ( - LOCATION='/FactSales/' + LOCATION='/FactSales/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -818,16 +818,16 @@ CREATE EXTERNAL TABLE [asb].FactSalesQuota ( ) WITH ( - LOCATION='/FactSalesQuota/' + LOCATION='/FactSalesQuota/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE , REJECT_VALUE = 0 ) ; - + --FactStrategyPlan -CREATE EXTERNAL TABLE [asb].FactStrategyPlan +CREATE EXTERNAL TABLE [asb].FactStrategyPlan ( [StrategyPlanKey] [int] NOT NULL, [Datekey] [datetime] NOT NULL, @@ -843,7 +843,7 @@ CREATE EXTERNAL TABLE [asb].FactStrategyPlan ) WITH ( - LOCATION='/FactStrategyPlan/' + LOCATION='/FactStrategyPlan/' , DATA_SOURCE = AzureStorage_west_public , FILE_FORMAT = TextFileFormat , REJECT_TYPE = VALUE @@ -901,7 +901,7 @@ CREATE TABLE [cso].[FactExchangeRate] WITH (DISTRIBUTION = HASH([ExchangeRa ### 4.3 Track the load progress -You can track the progress of your load using the `[sys].[dm_pdw_exec_requests]` dynamic management view (DMV). +You can track the progress of your load using the `[sys].[dm_pdw_exec_requests]` dynamic management view (DMV). ```sql -- To see all requests @@ -916,7 +916,7 @@ WHERE r.label = "FactSales"; By default, SQL Data Warehouse stores the table as a clustered columnstore index. After a load completes, some of the data rows might not be compressed into the columnstore. There's a variety of reasons why this can happen. To learn more, see ... . -To optimize query performance and columnstore compression after a load, rebuild the table to force the columnstore index to compress all the rows. +To optimize query performance and columnstore compression after a load, rebuild the table to force the columnstore index to compress all the rows. ```sql SELECT GETDATE(); diff --git a/samples/databases/contoso-data-warehouse/readme.md b/samples/databases/contoso-data-warehouse/readme.md index 1c736852..8effcfe9 100644 --- a/samples/databases/contoso-data-warehouse/readme.md +++ b/samples/databases/contoso-data-warehouse/readme.md @@ -1,6 +1,6 @@ # Contoso Retail Data Warehouse -Loads data from a public Azure Storage Blob into the Contoso Retail Data Warehouse schema in Azure SQL Data Warehouse. +Loads data from a public Azure Storage Blob into the Contoso Retail Data Warehouse schema in Azure SQL Data Warehouse. @@ -27,7 +27,7 @@ Loads data from a public Azure Storage Blob into the Contoso Retail Data Warehou 1. **Workload:** data warehouse 1. **Programming Language:** T-SQL 1. **Authors:** jrj;barbkess -1. **Update history:** +1. **Update history:** @@ -43,7 +43,7 @@ To run this sample, you need the following prerequisites. **Azure prerequisites:** -1. A database in Azure SQL Data Warehouse +1. A database in Azure SQL Data Warehouse @@ -54,7 +54,7 @@ To run this sample, you need the following prerequisites. 1. From Visual Studio, open the SQL Server Object Explorer and connect to your SQL Data Warehouse database. 2. Open a new query window and run the T-SQL code from there. - + diff --git a/samples/databases/northwind-pubs/instnwnd (Azure SQL Database).sql b/samples/databases/northwind-pubs/instnwnd (Azure SQL Database).sql index ae61e563..e4a045ca 100644 --- a/samples/databases/northwind-pubs/instnwnd (Azure SQL Database).sql +++ b/samples/databases/northwind-pubs/instnwnd (Azure SQL Database).sql @@ -148,11 +148,11 @@ CREATE TABLE "Employees" ( "Notes" "ntext" NULL , "ReportsTo" "int" NULL , "PhotoPath" nvarchar (255) NULL , - CONSTRAINT "PK_Employees" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Employees" PRIMARY KEY CLUSTERED ( "EmployeeID" ), - CONSTRAINT "FK_Employees_Employees" FOREIGN KEY + CONSTRAINT "FK_Employees_Employees" FOREIGN KEY ( "ReportsTo" ) REFERENCES "dbo"."Employees" ( @@ -171,7 +171,7 @@ CREATE TABLE "Categories" ( "CategoryName" nvarchar (15) NOT NULL , "Description" "ntext" NULL , "Picture" "image" NULL , - CONSTRAINT "PK_Categories" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Categories" PRIMARY KEY CLUSTERED ( "CategoryID" ) @@ -192,7 +192,7 @@ CREATE TABLE "Customers" ( "Country" nvarchar (15) NULL , "Phone" nvarchar (24) NULL , "Fax" nvarchar (24) NULL , - CONSTRAINT "PK_Customers" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Customers" PRIMARY KEY CLUSTERED ( "CustomerID" ) @@ -211,7 +211,7 @@ CREATE TABLE "Shippers" ( "ShipperID" "int" IDENTITY (1, 1) NOT NULL , "CompanyName" nvarchar (40) NOT NULL , "Phone" nvarchar (24) NULL , - CONSTRAINT "PK_Shippers" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Shippers" PRIMARY KEY CLUSTERED ( "ShipperID" ) @@ -230,7 +230,7 @@ CREATE TABLE "Suppliers" ( "Phone" nvarchar (24) NULL , "Fax" nvarchar (24) NULL , "HomePage" "ntext" NULL , - CONSTRAINT "PK_Suppliers" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Suppliers" PRIMARY KEY CLUSTERED ( "SupplierID" ) @@ -256,23 +256,23 @@ CREATE TABLE "Orders" ( "ShipRegion" nvarchar (15) NULL , "ShipPostalCode" nvarchar (10) NULL , "ShipCountry" nvarchar (15) NULL , - CONSTRAINT "PK_Orders" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Orders" PRIMARY KEY CLUSTERED ( "OrderID" ), - CONSTRAINT "FK_Orders_Customers" FOREIGN KEY + CONSTRAINT "FK_Orders_Customers" FOREIGN KEY ( "CustomerID" ) REFERENCES "dbo"."Customers" ( "CustomerID" ), - CONSTRAINT "FK_Orders_Employees" FOREIGN KEY + CONSTRAINT "FK_Orders_Employees" FOREIGN KEY ( "EmployeeID" ) REFERENCES "dbo"."Employees" ( "EmployeeID" ), - CONSTRAINT "FK_Orders_Shippers" FOREIGN KEY + CONSTRAINT "FK_Orders_Shippers" FOREIGN KEY ( "ShipVia" ) REFERENCES "dbo"."Shippers" ( @@ -308,17 +308,17 @@ CREATE TABLE "Products" ( "UnitsOnOrder" "smallint" NULL CONSTRAINT "DF_Products_UnitsOnOrder" DEFAULT (0), "ReorderLevel" "smallint" NULL CONSTRAINT "DF_Products_ReorderLevel" DEFAULT (0), "Discontinued" "bit" NOT NULL CONSTRAINT "DF_Products_Discontinued" DEFAULT (0), - CONSTRAINT "PK_Products" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Products" PRIMARY KEY CLUSTERED ( "ProductID" ), - CONSTRAINT "FK_Products_Categories" FOREIGN KEY + CONSTRAINT "FK_Products_Categories" FOREIGN KEY ( "CategoryID" ) REFERENCES "dbo"."Categories" ( "CategoryID" ), - CONSTRAINT "FK_Products_Suppliers" FOREIGN KEY + CONSTRAINT "FK_Products_Suppliers" FOREIGN KEY ( "SupplierID" ) REFERENCES "dbo"."Suppliers" ( @@ -347,18 +347,18 @@ CREATE TABLE "Order Details" ( "UnitPrice" "money" NOT NULL CONSTRAINT "DF_Order_Details_UnitPrice" DEFAULT (0), "Quantity" "smallint" NOT NULL CONSTRAINT "DF_Order_Details_Quantity" DEFAULT (1), "Discount" "real" NOT NULL CONSTRAINT "DF_Order_Details_Discount" DEFAULT (0), - CONSTRAINT "PK_Order_Details" PRIMARY KEY CLUSTERED + CONSTRAINT "PK_Order_Details" PRIMARY KEY CLUSTERED ( "OrderID", "ProductID" ), - CONSTRAINT "FK_Order_Details_Orders" FOREIGN KEY + CONSTRAINT "FK_Order_Details_Orders" FOREIGN KEY ( "OrderID" ) REFERENCES "dbo"."Orders" ( "OrderID" ), - CONSTRAINT "FK_Order_Details_Products" FOREIGN KEY + CONSTRAINT "FK_Order_Details_Products" FOREIGN KEY ( "ProductID" ) REFERENCES "dbo"."Products" ( @@ -380,7 +380,7 @@ GO create view "Customer and Suppliers by City" AS -SELECT City, CompanyName, ContactName, 'Customers' AS Relationship +SELECT City, CompanyName, ContactName, 'Customers' AS Relationship FROM Customers UNION SELECT City, CompanyName, ContactName, 'Suppliers' FROM Suppliers @@ -401,9 +401,9 @@ WHERE (((Product_List.Discontinued)=0)) GO create view "Orders Qry" AS -SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, Orders.OrderDate, Orders.RequiredDate, - Orders.ShippedDate, Orders.ShipVia, Orders.Freight, Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, - Orders.ShipRegion, Orders.ShipPostalCode, Orders.ShipCountry, +SELECT Orders.OrderID, Orders.CustomerID, Orders.EmployeeID, Orders.OrderDate, Orders.RequiredDate, + Orders.ShippedDate, Orders.ShipVia, Orders.Freight, Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, + Orders.ShipRegion, Orders.ShipPostalCode, Orders.ShipCountry, Customers.CompanyName, Customers.Address, Customers.City, Customers.Region, Customers.PostalCode, Customers.Country FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID GO @@ -429,28 +429,28 @@ WHERE Orders.OrderDate BETWEEN '19970101' And '19971231' GO create view Invoices AS -SELECT Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, Orders.ShipRegion, Orders.ShipPostalCode, - Orders.ShipCountry, Orders.CustomerID, Customers.CompanyName AS CustomerName, Customers.Address, Customers.City, - Customers.Region, Customers.PostalCode, Customers.Country, - (FirstName + ' ' + LastName) AS Salesperson, - Orders.OrderID, Orders.OrderDate, Orders.RequiredDate, Orders.ShippedDate, Shippers.CompanyName As ShipperName, - "Order Details".ProductID, Products.ProductName, "Order Details".UnitPrice, "Order Details".Quantity, - "Order Details".Discount, +SELECT Orders.ShipName, Orders.ShipAddress, Orders.ShipCity, Orders.ShipRegion, Orders.ShipPostalCode, + Orders.ShipCountry, Orders.CustomerID, Customers.CompanyName AS CustomerName, Customers.Address, Customers.City, + Customers.Region, Customers.PostalCode, Customers.Country, + (FirstName + ' ' + LastName) AS Salesperson, + Orders.OrderID, Orders.OrderDate, Orders.RequiredDate, Orders.ShippedDate, Shippers.CompanyName As ShipperName, + "Order Details".ProductID, Products.ProductName, "Order Details".UnitPrice, "Order Details".Quantity, + "Order Details".Discount, (CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ExtendedPrice, Orders.Freight -FROM Shippers INNER JOIN - (Products INNER JOIN +FROM Shippers INNER JOIN + (Products INNER JOIN ( - (Employees INNER JOIN - (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) - ON Employees.EmployeeID = Orders.EmployeeID) - INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) - ON Products.ProductID = "Order Details".ProductID) + (Employees INNER JOIN + (Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID) + ON Employees.EmployeeID = Orders.EmployeeID) + INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) + ON Products.ProductID = "Order Details".ProductID) ON Shippers.ShipperID = Orders.ShipVia GO create view "Order Details Extended" AS -SELECT "Order Details".OrderID, "Order Details".ProductID, Products.ProductName, - "Order Details".UnitPrice, "Order Details".Quantity, "Order Details".Discount, +SELECT "Order Details".OrderID, "Order Details".ProductID, Products.ProductName, + "Order Details".UnitPrice, "Order Details".Quantity, "Order Details".Discount, (CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ExtendedPrice FROM Products INNER JOIN "Order Details" ON Products.ProductID = "Order Details".ProductID --ORDER BY "Order Details".OrderID @@ -463,11 +463,11 @@ GROUP BY "Order Details".OrderID GO create view "Product Sales for 1997" AS -SELECT Categories.CategoryName, Products.ProductName, +SELECT Categories.CategoryName, Products.ProductName, Sum(CONVERT(money,("Order Details".UnitPrice*Quantity*(1-Discount)/100))*100) AS ProductSales -FROM (Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID) - INNER JOIN (Orders - INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) +FROM (Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID) + INNER JOIN (Orders + INNER JOIN "Order Details" ON Orders.OrderID = "Order Details".OrderID) ON Products.ProductID = "Order Details".ProductID WHERE (((Orders.ShippedDate) Between '19970101' And '19971231')) GROUP BY Categories.CategoryName, Products.ProductName @@ -480,12 +480,12 @@ GROUP BY "Product Sales for 1997".CategoryName GO create view "Sales by Category" AS -SELECT Categories.CategoryID, Categories.CategoryName, Products.ProductName, +SELECT Categories.CategoryID, Categories.CategoryName, Products.ProductName, Sum("Order Details Extended".ExtendedPrice) AS ProductSales -FROM Categories INNER JOIN - (Products INNER JOIN - (Orders INNER JOIN "Order Details Extended" ON Orders.OrderID = "Order Details Extended".OrderID) - ON Products.ProductID = "Order Details Extended".ProductID) +FROM Categories INNER JOIN + (Products INNER JOIN + (Orders INNER JOIN "Order Details Extended" ON Orders.OrderID = "Order Details Extended".OrderID) + ON Products.ProductID = "Order Details Extended".ProductID) ON Categories.CategoryID = Products.CategoryID WHERE Orders.OrderDate BETWEEN '19970101' And '19971231' GROUP BY Categories.CategoryID, Categories.CategoryName, Products.ProductName @@ -494,8 +494,8 @@ GO create view "Sales Totals by Amount" AS SELECT "Order Subtotals".Subtotal AS SaleAmount, Orders.OrderID, Customers.CompanyName, Orders.ShippedDate -FROM Customers INNER JOIN - (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) +FROM Customers INNER JOIN + (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) ON Customers.CustomerID = Orders.CustomerID WHERE ("Order Subtotals".Subtotal >2500) AND (Orders.ShippedDate BETWEEN '19970101' And '19971231') GO @@ -521,16 +521,16 @@ FROM Products ORDER BY Products.UnitPrice DESC GO -create procedure "Employee Sales by Country" +create procedure "Employee Sales by Country" @Beginning_Date DateTime, @Ending_Date DateTime AS SELECT Employees.Country, Employees.LastName, Employees.FirstName, Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal AS SaleAmount -FROM Employees INNER JOIN - (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) +FROM Employees INNER JOIN + (Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID) ON Employees.EmployeeID = Orders.EmployeeID WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date GO -create procedure "Sales by Year" +create procedure "Sales by Year" @Beginning_Date DateTime, @Ending_Date DateTime AS SELECT Orders.ShippedDate, Orders.OrderID, "Order Subtotals".Subtotal, DATENAME(yy,ShippedDate) AS Year FROM Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID @@ -9056,295 +9056,4 @@ AS SELECT ProductName, UnitPrice=ROUND(Od.UnitPrice, 2), Quantity, - Discount=CONVERT(int, Discount * 100), - ExtendedPrice=ROUND(CONVERT(money, Quantity * (1 - Discount) * Od.UnitPrice), 2) -FROM Products P, [Order Details] Od -WHERE Od.ProductID = P.ProductID and Od.OrderID = @OrderID -go - - -if exists (select * from sysobjects where id = object_id('dbo.CustOrdersOrders')) - drop procedure dbo.CustOrdersOrders -GO - -CREATE PROCEDURE CustOrdersOrders @CustomerID nchar(5) -AS -SELECT OrderID, - OrderDate, - RequiredDate, - ShippedDate -FROM Orders -WHERE CustomerID = @CustomerID -ORDER BY OrderID -GO - - -if exists (select * from sysobjects where id = object_id('dbo.CustOrderHist') and sysstat & 0xf = 4) - drop procedure dbo.CustOrderHist -GO -CREATE PROCEDURE CustOrderHist @CustomerID nchar(5) -AS -SELECT ProductName, Total=SUM(Quantity) -FROM Products P, [Order Details] OD, Orders O, Customers C -WHERE C.CustomerID = @CustomerID -AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID -GROUP BY ProductName -GO - -if exists (select * from sysobjects where id = object_id('dbo.SalesByCategory') and sysstat & 0xf = 4) - drop procedure dbo.SalesByCategory -GO -CREATE PROCEDURE SalesByCategory - @CategoryName nvarchar(15), @OrdYear nvarchar(4) = '1998' -AS -IF @OrdYear != '1996' AND @OrdYear != '1997' AND @OrdYear != '1998' -BEGIN - SELECT @OrdYear = '1998' -END - -SELECT ProductName, - TotalPurchase=ROUND(SUM(CONVERT(decimal(14,2), OD.Quantity * (1-OD.Discount) * OD.UnitPrice)), 0) -FROM [Order Details] OD, Orders O, Products P, Categories C -WHERE OD.OrderID = O.OrderID - AND OD.ProductID = P.ProductID - AND P.CategoryID = C.CategoryID - AND C.CategoryName = @CategoryName - AND SUBSTRING(CONVERT(nvarchar(22), O.OrderDate, 111), 1, 4) = @OrdYear -GROUP BY ProductName -ORDER BY ProductName -GO - - -/* The follwing adds tables to the Northwind database */ - - -CREATE TABLE [dbo].[CustomerCustomerDemo] - ([CustomerID] nchar (5) NOT NULL, - [CustomerTypeID] [nchar] (10) NOT NULL -) ON [PRIMARY] -GO - -CREATE TABLE [dbo].[CustomerDemographics] - ([CustomerTypeID] [nchar] (10) NOT NULL , - [CustomerDesc] [ntext] NULL -) ON [PRIMARY] -GO - -CREATE TABLE [dbo].[Region] - ( [RegionID] [int] NOT NULL , - [RegionDescription] [nchar] (50) NOT NULL -) ON [PRIMARY] -GO - -CREATE TABLE [dbo].[Territories] - ([TerritoryID] [nvarchar] (20) NOT NULL , - [TerritoryDescription] [nchar] (50) NOT NULL , - [RegionID] [int] NOT NULL -) ON [PRIMARY] -GO - -CREATE TABLE [dbo].[EmployeeTerritories] - ([EmployeeID] [int] NOT NULL, - [TerritoryID] [nvarchar] (20) NOT NULL -) ON [PRIMARY] - --- The following adds data to the tables just created. - -Insert Into Region Values (1,'Eastern') -Insert Into Region Values (2,'Western') -Insert Into Region Values (3,'Northern') -Insert Into Region Values (4,'Southern') -Go - -Insert Into Territories Values ('01581','Westboro',1) -Insert Into Territories Values ('01730','Bedford',1) -Insert Into Territories Values ('01833','Georgetow',1) -Insert Into Territories Values ('02116','Boston',1) -Insert Into Territories Values ('02139','Cambridge',1) -Insert Into Territories Values ('02184','Braintree',1) -Insert Into Territories Values ('02903','Providence',1) -Insert Into Territories Values ('03049','Hollis',3) -Insert Into Territories Values ('03801','Portsmouth',3) -Insert Into Territories Values ('06897','Wilton',1) -Insert Into Territories Values ('07960','Morristown',1) -Insert Into Territories Values ('08837','Edison',1) -Insert Into Territories Values ('10019','New York',1) -Insert Into Territories Values ('10038','New York',1) -Insert Into Territories Values ('11747','Mellvile',1) -Insert Into Territories Values ('14450','Fairport',1) -Insert Into Territories Values ('19428','Philadelphia',3) -Insert Into Territories Values ('19713','Neward',1) -Insert Into Territories Values ('20852','Rockville',1) -Insert Into Territories Values ('27403','Greensboro',1) -Insert Into Territories Values ('27511','Cary',1) -Insert Into Territories Values ('29202','Columbia',4) -Insert Into Territories Values ('30346','Atlanta',4) -Insert Into Territories Values ('31406','Savannah',4) -Insert Into Territories Values ('32859','Orlando',4) -Insert Into Territories Values ('33607','Tampa',4) -Insert Into Territories Values ('40222','Louisville',1) -Insert Into Territories Values ('44122','Beachwood',3) -Insert Into Territories Values ('45839','Findlay',3) -Insert Into Territories Values ('48075','Southfield',3) -Insert Into Territories Values ('48084','Troy',3) -Insert Into Territories Values ('48304','Bloomfield Hills',3) -Insert Into Territories Values ('53404','Racine',3) -Insert Into Territories Values ('55113','Roseville',3) -Insert Into Territories Values ('55439','Minneapolis',3) -Insert Into Territories Values ('60179','Hoffman Estates',2) -Insert Into Territories Values ('60601','Chicago',2) -Insert Into Territories Values ('72716','Bentonville',4) -Insert Into Territories Values ('75234','Dallas',4) -Insert Into Territories Values ('78759','Austin',4) -Insert Into Territories Values ('80202','Denver',2) -Insert Into Territories Values ('80909','Colorado Springs',2) -Insert Into Territories Values ('85014','Phoenix',2) -Insert Into Territories Values ('85251','Scottsdale',2) -Insert Into Territories Values ('90405','Santa Monica',2) -Insert Into Territories Values ('94025','Menlo Park',2) -Insert Into Territories Values ('94105','San Francisco',2) -Insert Into Territories Values ('95008','Campbell',2) -Insert Into Territories Values ('95054','Santa Clara',2) -Insert Into Territories Values ('95060','Santa Cruz',2) -Insert Into Territories Values ('98004','Bellevue',2) -Insert Into Territories Values ('98052','Redmond',2) -Insert Into Territories Values ('98104','Seattle',2) -Go - -Insert Into EmployeeTerritories Values (1,'06897') -Insert Into EmployeeTerritories Values (1,'19713') -Insert Into EmployeeTerritories Values (2,'01581') -Insert Into EmployeeTerritories Values (2,'01730') -Insert Into EmployeeTerritories Values (2,'01833') -Insert Into EmployeeTerritories Values (2,'02116') -Insert Into EmployeeTerritories Values (2,'02139') -Insert Into EmployeeTerritories Values (2,'02184') -Insert Into EmployeeTerritories Values (2,'40222') -Insert Into EmployeeTerritories Values (3,'30346') -Insert Into EmployeeTerritories Values (3,'31406') -Insert Into EmployeeTerritories Values (3,'32859') -Insert Into EmployeeTerritories Values (3,'33607') -Insert Into EmployeeTerritories Values (4,'20852') -Insert Into EmployeeTerritories Values (4,'27403') -Insert Into EmployeeTerritories Values (4,'27511') -Insert Into EmployeeTerritories Values (5,'02903') -Insert Into EmployeeTerritories Values (5,'07960') -Insert Into EmployeeTerritories Values (5,'08837') -Insert Into EmployeeTerritories Values (5,'10019') -Insert Into EmployeeTerritories Values (5,'10038') -Insert Into EmployeeTerritories Values (5,'11747') -Insert Into EmployeeTerritories Values (5,'14450') -Insert Into EmployeeTerritories Values (6,'85014') -Insert Into EmployeeTerritories Values (6,'85251') -Insert Into EmployeeTerritories Values (6,'98004') -Insert Into EmployeeTerritories Values (6,'98052') -Insert Into EmployeeTerritories Values (6,'98104') -Insert Into EmployeeTerritories Values (7,'60179') -Insert Into EmployeeTerritories Values (7,'60601') -Insert Into EmployeeTerritories Values (7,'80202') -Insert Into EmployeeTerritories Values (7,'80909') -Insert Into EmployeeTerritories Values (7,'90405') -Insert Into EmployeeTerritories Values (7,'94025') -Insert Into EmployeeTerritories Values (7,'94105') -Insert Into EmployeeTerritories Values (7,'95008') -Insert Into EmployeeTerritories Values (7,'95054') -Insert Into EmployeeTerritories Values (7,'95060') -Insert Into EmployeeTerritories Values (8,'19428') -Insert Into EmployeeTerritories Values (8,'44122') -Insert Into EmployeeTerritories Values (8,'45839') -Insert Into EmployeeTerritories Values (8,'53404') -Insert Into EmployeeTerritories Values (9,'03049') -Insert Into EmployeeTerritories Values (9,'03801') -Insert Into EmployeeTerritories Values (9,'48075') -Insert Into EmployeeTerritories Values (9,'48084') -Insert Into EmployeeTerritories Values (9,'48304') -Insert Into EmployeeTerritories Values (9,'55113') -Insert Into EmployeeTerritories Values (9,'55439') -GO - - - --- The following adds constraints to the Northwind database - -ALTER TABLE CustomerCustomerDemo - ADD CONSTRAINT [PK_CustomerCustomerDemo] PRIMARY KEY NONCLUSTERED - ( - [CustomerID], - [CustomerTypeID] - ) ON [PRIMARY] -GO - -ALTER TABLE CustomerDemographics - ADD CONSTRAINT [PK_CustomerDemographics] PRIMARY KEY NONCLUSTERED - ( - [CustomerTypeID] - ) ON [PRIMARY] -GO - -ALTER TABLE CustomerCustomerDemo - ADD CONSTRAINT [FK_CustomerCustomerDemo] FOREIGN KEY - ( - [CustomerTypeID] - ) REFERENCES [dbo].[CustomerDemographics] ( - [CustomerTypeID] - ) -GO - -ALTER TABLE CustomerCustomerDemo - ADD CONSTRAINT [FK_CustomerCustomerDemo_Customers] FOREIGN KEY - ( - [CustomerID] - ) REFERENCES [dbo].[Customers] ( - [CustomerID] - ) -GO - -ALTER TABLE Region - ADD CONSTRAINT [PK_Region] PRIMARY KEY NONCLUSTERED - ( - [RegionID] - ) ON [PRIMARY] -GO - -ALTER TABLE Territories - ADD CONSTRAINT [PK_Territories] PRIMARY KEY NONCLUSTERED - ( - [TerritoryID] - ) ON [PRIMARY] -GO - -ALTER TABLE Territories - ADD CONSTRAINT [FK_Territories_Region] FOREIGN KEY - ( - [RegionID] - ) REFERENCES [dbo].[Region] ( - [RegionID] - ) -GO - -ALTER TABLE EmployeeTerritories - ADD CONSTRAINT [PK_EmployeeTerritories] PRIMARY KEY NONCLUSTERED - ( - [EmployeeID], - [TerritoryID] - ) ON [PRIMARY] -GO - -ALTER TABLE EmployeeTerritories - ADD CONSTRAINT [FK_EmployeeTerritories_Employees] FOREIGN KEY - ( - [EmployeeID] - ) REFERENCES [dbo].[Employees] ( - [EmployeeID] - ) -GO - - -ALTER TABLE EmployeeTerritories - ADD CONSTRAINT [FK_EmployeeTerritories_Territories] FOREIGN KEY - ( - [TerritoryID] - ) REFERENCES [dbo].[Territories] ( - [TerritoryID] - ) -GO + Discount=CONVERT(int, Discount * 100), \ No newline at end of file diff --git a/samples/databases/northwind-pubs/instnwnd.sql b/samples/databases/northwind-pubs/instnwnd.sql index 166cd313abd23ea36420d418087b5c92b7006c90..971368fdb587762b09fedaee1b59ece24c4851d4 100644 GIT binary patch delta 585 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⋘c*tuW)$p$5zqpnI%F-@2}W9{+?()@55C% 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�+Cg8NxOb<8 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≶^~6(JWRs@_vq8Uo1|sr28`KA7vfK(}3}%-Y@zsZ-M4XE<>zG^Qjd=!T z{h0Mo!pFQ9(N(hkE!I1yky%(=SQl^MVxO_5bsv~d*f{zbA*&zgqXz})sUt=Ty1T=j zQGUDsr47IQx0R0evfmm+7WgUmr5lMnwH-ONxZfuKi2&=YvqHz*HT%c^RkD7$+SnHA zzOz6G>qTLtC;rA@IPMkEa`sdfuw4-puYHY`Z}nqsC0E|s2XP)XwL^@ocv)@W7@6M0 ze6`*9AcwAQwE3~N>#VE(HNsbtXWBXw8?gN>^Y&wOt=Q?O_^{fbEoa6nZ|%Dy!K}x) zF)r`#x4Um6S0tcJpI*<%KJLAL%=z%HCEt7c;Lu2={P6Jo`%i!L^!2B|d-{*3A3go_ z>7%EQpMLiA-ZA?1@&4#|{{88bqy6#IZ;tn;2lu_FUq1chc>mKu`StPn`04)~qknn& z#WCkUkI^Rw?LQ95-yYOIIQ0I-q5r*u{-a~wFOKKu&nx}*)^d-}ma!}h;8=>L9b`q}X?#um;JtoivN z`^nS)dvHEIv>*pnYrcJ0^C!pXy{Er^wgXJW;%7(u%Y**uL1FGMp8HyhcfWb|-POK! ztoEB@ZS?=~v9s(Wf#slwW%$7AUppxI|Fx%oKBzx`Uik$i`DAo|a?pSCJFQsq-qZg&q<{6iDjJAGcKztN_uirZ5iF(?>@J{_+{sUmm*t?OEpQ zM?C-g(|>#VpHKhr-2Tne-yi6I|LGqOoZmZ8`TmWjuN}E^OaGf=$9(Ou>}yAckrAIB zdOkYle*78ruMP~z{WG0tetOuH+>HO>h|_lud&vsW`}N_AEBxiNE_TBAjy2#(|LbS^ z$0zDv9G?I98Fyl?mv@ysh@d2eD?dNhdj06e;@ny z2S-Kt{t>x9c>2zBe*EpRB7297`T7yfUmo$M`h5BsW!)97N9K}$_y(%hE9d{+G1Kh( z`g2|U#?v>C+VqX*n(*y|qST)r<8K_JZ+^!4^P`f=`Tl_*)rM;E^TT2gV}Jkh$XT-Q zU!Sd|!eRrMeR4?s>mmKy&oofCsDQlD`S*vvKR7;m_dk!7-#aY&rvn*R{FkS{{j3Kf z??2=8;jwoWUhg0M_m7x=^ZDH49Qo$)tRL^td^3gm{^6ri zoGP4x`{#pW{CnFQ zO#9A3`OdTcPP6mLcD9|B=ff;CqeETaI&}ZpA~CY(9-2QqW=BWQ2Zw)Hz0%{?;$?l> zZ=Tkho3T>d>{odZcRXvaeC`4t9{5D_8?CW|_PyuzW}Mucwkt|&A3cnt)uzAk+SW$~ z|9e(ls|<9qES+mVUbNb?Y;@ZC>)dGEfcPfm|960I8Qkwdl{*qR!tdu%k7@D&+a@N!@f+BH*_y<)Qk0d7`Q|eFG)G zor6TNljoXvpf2MnHlZ0_=n-F};c8E_rC_BI6cx36?~oq<@C99b3zeEIZ77H-+QfA4 zF`DnFW|TBDZ02C+=xAq_C0fGUb@R(_{n%*i+zI_XD`UtSqOUgglDkRU(G_Ay;Inub zOVuy2=))(P`e&}XFO-@!+PT<3eqagQ&=||g596ur>ndm#9pB}2_GitW z$A}?+lc`Ak0#{&Kk6w7($*xcfr?kg70cY6;%h&&i?`@utx}v0=wL;9 zT0}cDtQSRu-%5xB(#W96h$x5M%x8^Sv_fIbqit2Wc8dNmPrjJ4f?3X+*{vGgwV3S; zdd>)Y+Opp$7%B9z7JtU0UeJeU4e~cM|IcoCYfRv~8nWblI{;+R3AXgj-}Ma@ZkQos zwqk{I2K%fMv(-=MfhLxSuQsv1t1xR2VMZKgq*IFrspc35M)B|oWSu?HQGzj1mM<4u z?9ql3T9m_c9{r?mG-yG=UonY-m{4tI2dKN>==9B1z*leQ6f`@vjyF1qLf$Y|qdNnx zQrb>m9m&~-2|CAXyqYM;2_0$8@vZ|kQPx;No! zGd&(`;F&mvoRY4m?96FqvU2di9<7n4=PgpKtvX1FHS)_SZ8 zRgZ1$JJ;E2>uv0k5*xEVG(p!Kgo2-r=S1*37PE{6(#Ax4uo)inv|r@QW9+7{{m43Y z2PEaH#LY(;xFTI98TOp%U>O@J(tlZcZ zJ3-$Fh&MSPrEHhZZO3X^4A>Q5E?@Mu9DBmkmBJ6IG9U(uAzU={$S8<{5kiA=qcXES z0L_)egzPA4%9WX*913MMv#|%dS?g+I%v+pVBYO5ncdqiTVU8Cc`O@gq!>7r8Ge>Kn zhwjj&fEzS3oIa=$4?d!y$9Wd=;(~-27lp=D8e)J%m^0U#09LbZx@ncOmVjbbXbX|R ze^8mbfvXN}kaur|fSw>HUdBfpnIqpZQaoYa+~LYcCQ0vJqH8XKZ;!bNy;A^Rz3CG( z|7NeX1FyUBh)Szqr8W)rB8wdU@<B=pL)Q$&EKrX=i#zgg8zn(2<|58L9?kA-`XW8~Z%n*(Y88F+y{rc__db@XtIS0^ zNP-YtW<$X?;{e^*I0gl=PXY?^Sf0<~A*I#N=;MVFgP{nZP0Q35Rx3`dWnPG5yev55 z9iJ8J8wE8%bxp7mQO0CC`Hr=m$6$oLvkR=P(%lQr#$T(^crH@oZ^()|Z}znao9o2} z^piry5%&04!^1QWS=sEr+5?`+g9kn^lQ%1XVXxYAEj#Wf*&pAfS&JOnxG^n5tV!X*JY_k@*H`eU{tewbUEvW4)U&Ua)-7CvX z@lqqJvu4;1rqD;4J~4orh80&(JI_ULI^Z#1ym(jJokdj4a^LI+@G?%G1nv`VJC3bF zM1yCI1O60YJmgWrRtgq@q5A|Heb;T4t@Qza<+{7DK? zI2PgL8Z*~QjSQ$#@y&K~l@S{HV26BbmZt((qsu7Z+wNU{x-R~k?be*~pOMi3bNzyc zZ`3YlVS#-tgex5z7=!N_`6%rU@ZV*`&y@x<*3nw|MuGKwl=M9m#z@4ajW!(flWek{ zf+|w2F^KOGQO>*1I9|x9$LaVNGLF zyw5F|V-vo)(`FyAraoKW#7yjb4~mZ6GtP1kGM`-Wy-LMNlM!TfytUGZrhT<&k8ia4 zC%#0$J%A^mPi<9`u_U{Q1o=2I081>hl7uT#ewYIfj$B&zq0ynQrb;XnZJY}mb9C%6S@8q;}Wz7|{K^&PI%35)L!v!U*G6KX- zgt#*iOJjrHL0->^hQFGDT3K$j#e!;&){p^f_M;sMBZQYwkN`c`Vsx%7YZStn*=Ub9 zmKIkrVl`yTn@|P;IU!xEgl}V^Wb$di;;=wF8j-QuJBsQEl=u9f6PMpB@SQh#AA;kT zo>n#Vh+MXch&&p^+#TRfP{KFb;bE!K4#71B(8z9RVmv+Ny>-|>+sI1h9Wn9=N!AU) z!MHsV#<%S{kKAKTaKaAHTvr6?Rj*Xu6A|k_IF;$Fk3Q=dbo7>!<6n4Bu7mjGJ=mJT z#3}Tf1rOWE5i%isM?Z6ngQ$z|)tme0Sa>U4H7~1;NRfB;pqUA{WIdPj0 zVxV&UaZm6DVf^>oFF2Tm(91{T3s%N>{1;vE)~@ho1m2*}-Z0zUEqaS~dE~;5m}@b| zwcz$Zp$`vD#Lb>Mc<&L+Ua15@}If{?yR-@Xok-Yu%e6nppO(X=C;<4p1~e0 znFVF2?t#X&E2?<1jvx0$GZY<}KUx+CjLNH|Mgr`~F?<3oCA~wgC|~!d0?~8-8WAuT zD|Z9fdoFuQT8Z+|>~#ki1@m4CaS&0WS+zH3(s0{`FgmcU@!DHw!S}zqvQi)Qv1M?< zu8>~oVXmYj<)FA5recuGW%{|Dwdi&FqS3zidg_to82WUUo5WBFl}4ymx0qH5#Bim4o%c7Fl-<(J&&_noe9|ea6AeJyRRQUH6L8Xs5S- zZYeweYJ|^zL{)^L#Iar9$y=R6Kl$`MYTFy;zBe9dAWi1yu`A#gQD8sNp3(0vPt3@v z9`_Gizj5ATZ=9}hIn%^8gx4FF#%D1jc zAOFG~B&JW#Q8Zc*L%VmNH$i-4LA$ySRUbIV)$N=73VpogrVD30@TLip%q1(h7h4%e z>f8%S+Ev?G&T-O=?5`B4-n-7TuVv3t>4d(bTz`##h^ygkYtF>L{4ejhzjE(!CxEpT z&ML$k34EFzV7`+<{b`DMF`0SmtrYak4mjgEvj)TaGH9|UT+JKWYkKQ9fH?uySeTRG zF-X2$&k6?Kpk~fmQH_E-nEKBiDF2N_z8C>$WWJi>z1$jwRW6ik&%D_!Ym7naHFX|s zx0>-`s8^^D4YbhmIQt)Sjn-s8wsRi^<2CzPiTY^;^5kP|Bt(WB<{|%AFIL=c`^t{b z&TL%UJjd=9);{y8KP!!XPdaRqsvS9E;OCszL2P>ert~Bt>1{L z`1Gv(@TF%h@gWBO5||fn(heFg&qCG=TxG#v9Zw(mm-Q!MYXo-OMVuTIjkiI4&3m%n zicj{K=~Wr)jedH6&|@nPk?2-IHc%1P^Dke-U>}7G)SheF)jVnIySbo~P0{YPx0#@QdheHFFVe(As%L-^G1JRI_oKI<@p!Mrczo;iNI&Ym zZXUTb=|9}>K*R6B`|Wz>K3UI7))W5(PrSWzg1kJ@WMw0Q1^TGZ zppRszQ;m^aeMEjAJBqfp^>-YvMoGRd|C7Gegdgr7&-XRMCl;R%eb3vf4)~y1l!?XQ z-Fb|R=P|vx+kmvu08^^}oPYL3pLeL=_x%< zm|F(98SP$sU4_J#oEB5xR1>lpUA(C@pzaNe^?0O!ruE6Z$8v8!w&BJp#Vk>reSJpd zC6sS*x~Bo_UswO{=?wKe8JvxTSmV<@)Q4WC4+Z@Eh+v3=z0ye#T_V*!F_v)4f1}`8 zKpgz#A?ycJJ)#N`59!z5UsJ_e-bhTZSU`CV_RVz1G<#a|1k`)aw_(o$Pxv(&VY;^B zB}H_j6g$yH!XA8OKw0GZHkDQ~-n}xXvA0xr0le{I?cJUL!wrq0yuP>2wNF01=7aP) zn>meX{T4$EJo&(25T~BLTzv-n5VSr2vcXY*t zfX`&$+vXMj^#b9XlG|Z$XVH7ztt^jw{C3vzsZ``JTI;*dUL- z`4yslpS5^JpB(bOwtJ`C?K?E4B@-RhV;pVd=jW z?Xv5>xJKWIIji{~&c`UCgREx6t#sX~yDxa>{@9Ufv|<`<#qD1IO4h2(EnuCM`lr=ixnnkkKUPtvu`qV>;wLFDE7j}%yi-!;aMsNpWszFF5;l5O;`ib`~Q24wkl zKFXc%nn~O4qsO@!QmoV6>UvEj(>?R--Cv~{)gW^15pwXVI<+s!ul(lJ5(#4|=6(|f zeR}PO@eX^nIm;U-qpxR~PS=@*e4|=*T)o{%w{lRtiCxWd1!T@M_qytzErHYP&fgW$ zx9x*`wT7DvQQ($F>)C2c1%kVKaEqs2&Y6(B^g&|9{oKFCP%0~Sri>iXrV6r0hkC!q ziKQ*fG^)<+J21DAx5e}|^9FaM&2)D_b%(r%!VWMZ_=eql!qeWZr+&js@|M5iwD!+4 zcAkGK;;n0RBI7Ms8smN5s&zQ{QazJO3`MW@HCVoljFqP-fIny(ht8i+CqE_%yKh*G z599OrxA(3jb_{pT!<*jhH#2@XGj~?K;;yvj%nWxtd*F2^@Y|fdQ}gMCxHtXA*irub z=U~Kw7)-`w{qB*Yu&!NY^0s#6P5-)@o2}lr%3S88t9JD4J^Ak8D_J!2D-QRpx5?_) z%qizZpM4AJy}1YX+cZ&t=XZWN$e%sN6TP|eDd~|~F}XJ*jjOC@tdxmC8f@7Y*Rk6* z-Hx1(uU{PY#K-&xZ|ghx4XRM8{n)?`;2t(oWSlf&arPh_LXL6I$d1%1H+*|Z)y7}X zS0fOo)|0i-+MadEyQMH0G{T-qZ4p2Tok8kl%%~ct;^B z?R}2CNBpb#*1nx{*5P<0ktS~Id9lamO2ZeK{o)C_SV=uH0twP4B7@1?*t*wK)KCGS$@7&w-`OLi??{!1| z?Mi(2^S->E7s=7i?a6)MdtDESH^cU2X)zal_CQ%3wpJk!HwNxP&tkuiko7$7jMZLq zEFV|S6;0`DDdk1!EI0YT&b5D@A@=*~jy%1L!Q3N~WG66p(0Uo!v&8+mV!c)%Zu_h@ zbq9<=St+ccNA7zfgnl0HC=K-%qn%>*lc~|C7ln4HYd)_M({J_Kb+%G+i~;)0eSBMG z{r7BVTwgn;&g`GL^?)R3oBv2b@z3GObz)&e%>UUB$ijy*wKd^yb=VptDC|wbIAmTWXXYF{n_CjXWi<>p#DkoL3gXGgU2Vv_+@58v|DL z?mftSz8<(zZ|;4kXg`qCR3P&^Y?#UETU0$8+z)w@Y~xz!Yk&2>+`r|o+6EJ-j%EhE zo@Sj_j6buK1ow%j-xfpw4UFFgb#s(FHRI`l6(jXc+g@;I_^TT@d;b}Krs5MBav!bk zj-BYO>w)>L^tH$Qy+|50i;@T#&;+~#cTcVsL%m%zS5{%ylf97zOcEdLwAZ`7C zUk@Jn4wmdV9{N*v##7{ssuG z+Wmo@#)tSq?K@_^jaSoKJ%`$})}3~M2&YY4X1+Q(pEv_}l%KVxH*@U`hu%KAFZ(vw zTji%hq`lfvyQ9y(uuipi(9k}yGIc7rS9n`1#~apablnc>@n;5zPGx~Vqr4!Gtj?Xp zW$Q?!(G@(ey-}=d8arkWwLNJ2_VwTTz%>+IX?U9 zlC>7O3(VxO7hQKiCvdSbvpfNeNS@rH6=!XcQt~W6QgFzGB;)WMa%N%Kif>Y@gtVcw ztNhcL=vE#C)eJ%m29 zl#+%dIeGg@XErLo%bEXZPI~xIJr7)2j`?palYQG?A3Rfw0cR?oPGVZ4#M}D~=u7Qf zVs?99tbKc?drpTvu_*@GZfj=YXTG){R{3}c^f$!N$vV_S6K z^KXv$?@6T<+I8l>L^YR1C#0_f79W)^=l|COkF!+Yz2J)*=1mZI8Cz z(CE3-<UZ4Wk)q-5;BAZ@BQvL2{*LG4_u3Qb5Nb5D;fxOI(ZorF@UD;hDlN^U zf*7||uTt$JIlM)GBJon5-{XrWS#8de#le0JMZQe0-vXPtLGkh*@6S=4sS$YMj@gEz)ho#-{Q9_8vi{Gx|r5n!z%kjz!<-r?=zf0-Ds$#V0( z?5E9A&*iG|;5NPSd+o&+1@RPjV-nvvB}=i-#qXnu{PnYJBf2JOF@J=tCx6{NA?=kCQ;P_JCGZE&l-%* zir*S9^qKucMfBN|M1T?VtaC_jK^fWnXf+ggD1=&92&Oi*?oq$QrH1lgY-(@wX!PQp3yRM zCT??*by_*E^MV*VZ^z+Xj=&AXCi~qNkJb=#>irr4vGx@3>_rEtfeFueE^33xpeW7v zDo@=YQ`rZhGPCMcLmE#E*%RzQG+$dX)+jf-=n)q0hF4`V8jo~>^6UX~-#P;>X1!zg zK^17NKA@Ag;t?)`TN25ci`43(QajrG^?4n4ZlDDVto_bhSDtl=p!G%zyw#o&p}L-F zZ#!P=&f34#C%W!&ZuMrjs2daJyF0`kfB7>(GM0QAH1+sA9vsfSk)#KLQKnu0M)~MZ z9*R4s@3vPFBzJha9nt^dKjQwHn1(ai6w;o=MyK3|XO>WcnA>L2J4?)n~rtUZZkNee+1|S?}m& zEoL@Yf`~C8)5SW9-zbcUG`uDs+x_}I-h&JE+8ht1W-&%~u%DUJqjq2!6rR=s`T4|E zMtV9xf9|4wL&p9-`1x9-n)A4QGi}%cMuW5afiYAw(5O&xj0(8JK1THQ+;$RL{X9C^mEuhfn3>fD{1a`Wz|LSq zYsRd|=w-QyuW|sf%8KAoH0*wgwFW-H%2 z<4$2s&_{1;tajAb3P)-1?(a?}3O=tx=@EutQdGOWw;z~SRXXcnUU-)4ejmcKFt%j} z5R2hd6}%6w)klQPeCGN6#}-7wBdl)Q(5sHEGvuKc8+U}SHAU5b5wa$nE5qBzLM%BG z!PM_bXyZArGI3BEyh7HzH!50c^+7^^XAXXWfDss6Maz4iHRFDfXYE**qi_2COf*2R9y{H-=^AR5JILE>7WRTKZ|*}?dgIBMOytgEe3*x& z%)mGALXB1&z2TSp_Yq>QpJZsw|7=Sl{YgS!`;LZEPoKR%n46#yRi8lejM8hypsY?> zaO&)GFI;IgG9ntnVqXl@ftB4ii;vY8Ilqy$2X>6`yeCd*+#5%yod~bgbN{R{J~mmW zv{D>FSaigsyyaHGim&^7aP1fH803lJL{=7BoF$UnR&i~sT&BPb#TT_o^FJd=IgDm$7xY1JF< z=oH0OQq55Cu1L}McB$9Y9I>Fa&k0;?9j)pURoq^PO z>`bWcvsKd|3cs1QjfOrm%T3WML-98p%rNh$_c4xBEE%u3j=uJnCnugv2Bf9m(!}%8 zeVPiYg~+05eA{~~E<5LHG??wkDr>B-@J!dNwrYawm^b)PRB`57>CY~LCEvb@m}kiN$Xj(=Qy^n==KdtEZDK#TUSt~A~}U^aT}5j*DZlFheuzI7m7 ztX*a%y?RZ59al&Aj<(a89i>@~;oZCcj|@HZk{9(%$=6)5}`-{N(KF30XI2U-u@Gpx}Ako`Hg9ViRh# z#-A8X42YZimdrSR)7VhDe~p6D*SuTmQ2hOEUFB{2cpXMy6Xvy}cl|#U zUE@DgBY`$gbE^w65X~_3oW%n64|XuazL{*iLf4izsGISuqTSZyTg$_(){NG(p)uY^ z`3_ai-iv>~z1FwO%*I<5e4>udqz3mtCxer^v;;Zpb2EaJn(D(yr%wC$-vL3n%^P|#ov3~2chr&2z_HW?{>;d_>RTX+dU|+LudW% zQ(Bz!yv8H-l4LVpYOT3N!Ly(^>~mjJe?VIu?hdr`g!_siD1o_WGO-~8oEQ3YJ44F- zvRic?c`BT#Z!!kio;6~FJ@t-?+ULz;ahAr%^0B&I2GzO}yF`5Mzd_q-Ebdl*=BJC6 z$DP3HR@2s=h_!3f=PWF}twkZBZr+bS;k&kvXPmjO`L=MLb3HaY{cV{%)%t56?&Cfj zE4=8Q@3OmAB+GPBCuYXM=sB{IRlU^dcK|&~E0vr&dhO>>&lwnJ=*0!j^y}3&@47|m zbszKJJ%BIyv(JXg-KssRJ;jw&dluDRo*;1JB)$2b4GYFBMprmWCi2S zpxsdK?~dJ{8J%m%HF7((o61gA=M`;Md(^u|er60(gWh!y?2sm^pykdIIT4M|eDgls zL3(z<=x-jeAc`T)3f8cG3muE^_e3eIYL#cy110XzT08D4aevLx^ho9r@AVNF+y>v3 zHhuBlH5-xkgONlJX91Bjp3=QPwFmC)-}_z-cEt27C*@4{zrJy%&Y0ee&N>;tl`)Xp;3KN4?0d=Zd+3)G?S#Y*9`yaI{Lemesp{OG|qp4XVRj>AT<@=ml z*;@)8?pYcx@2)+^))=s=)rSaRMQvDwe(kOG_b6a8xJ+-CU+MJyo+_31%HL-?dWnBE z=N|3dp}lJwtgkATxo-xzd(8*?*ji4$J_ey;-DyPIvtke*+PzAp%+>6%Z*;!i(sd5s zal~rJ?_G}E2fo{Lp5*v0@_4z|p11L5MRo1#@hwHV`Cr~6bx-oKp278XJw1PyNUMu@ zR(r%7%0wB=$#2)U?i-IVw{7$~Z$fRwul|bX+E;UX?Yzz|nXa?cI(}1&*+;MW7Vvg4 z8pMl-ks&7jQsJGp@6URI4}SY%{N^4F9=G@nZ|{v{C`W0WytV3H#FBbli*J2veLI97 z&uR}82gcs-X9sxq9x9gOXqpGep^3x>{o2pzS?goSJ4oyD-QQKK5u5RdB$Dvb$=W2 zP4MsD5B4E%_G6#wyf3aUHezDjse%(lFWmL+f_J+I_GtNi%Y8n5k@t7cY@ghj-eB;!x8u@p*HYK_ zXpuU%8OA;Kde5Be-fOK@&Ud#!s{gx2Uw!+zZuWcoM7HygFUVdedI1La@y_kYqHnzdIpUh&Q}$3)aUz~3DG{D@y^NN-s`b$@GKX z`e$peyu76`D@5UPtHVEN)FMVauCvb%-<`VV`>Od$Iv>s&uE!wnFTYk__rMi?pO3~K zApg>jTizb`@eq{Dc&Xs+DevF$x~e|woE7EKyT?_TJxBJ@IP(>}4(vHjTmJ?GRCa)|xb@}A=0`L#o73D1lYeuo4aIcKIGLd& zQ#+g@9B1r)4d%>JZoDS%$dfYmUAOBg%&L6X(h5g&@V| zW<9#)ocBodX~zyMEn-rkbk`lZtDasChkOB%ca8bzL-*uAmB;M&-ibZlLCcG=?QMFX z2{!z<_w@}eVzb8Jj4LR-=A-^ANjJ95wMBEXk5+jT-Xm|~h5pO`9$<3%^*v7j_kcByb)k0JdNQ(ugd#I=chPacJkc%Ce4ep=menk#-S~%MKAes#Rm^#NzVtJ;^f$G-OeT!tS=wQ^ZjT34;#u{ zt$L=tnHMAduB(srhROu?eEg>6pRuqmCys6TKi0gBS5}X!Gjv4{)XjHRqxv*1ygpceZR7a$sApZ#8<7*^P_pGs+(nif2TyvdT|)tzM&e{_>o;?4^J@HCx#zyp zeh+#V==U9ZbX9#sU(0WQZMec-+7)N_VrqB@n!WzN{{}%2X+IDHpVFohL9dxe{KGV+QJpwaY(Pj-J!aI(*TdnYT zP)BNTHBw=`w)JP#>4D~M>pmLE zmrf)>9<8)uTkT$!>^ zNgXeyH}a2q`RERC7fk)$k$!2^9;*JNyY|}FmAm%+U2d%rXFsg{P{WB_qEGJ6P7vX! zE5=B(Cf~Mboz1(Q;F=;HR~qlt-l);k7xk)LCFql_JTKvV%WqZ{pGf#j4alzSK3g=_ z)U#dR=Q)hUM&!v@kuw7D&Hw&iyxe+?0J7+IKJq)tjHLLU9hDWuwefA6C%2rPqFmLw z)3f``E#6Xy6o~uH${QUz@VH-iyydTUto_NLow{3huZA*5R6vhE^#Xk;{>}l{IPk8T z`2U(RPR;<|&=u?R`t6;SjwD|8E%~tr>&)qcj^2S7HOLs;Lwu)Kr-*|)z?{b_qfw5v z%B<|FS2jyq-}h$gxqsG3%*j{gfp!m-Ub!NnW$Y6F%+ZzPj(uw!>enj8JhV&%X0|*v z`ySrjlk0Z?um?dZ(Nqw#doq5_`H^BDIM)bb7diE^4Ug>`Ye#N$hB<%U#dmlfVgQ=> z0rJR*t~t+}dOuM?LOEC4aehQ&C9z{QK4YchH+kn5wy-m*E7l{%WH~5 z9?iR_`a%}7i+S6(f(*vgS7f_ahBtb5eD=|-`}ulfwedEm{l5-<_ppn<$J*_(io=TF zPFwc37uc=VtrgSV#+_r0V~+FOM`S0q?OyMrUF+>A>Cxj(IA?ULB(Ek%>-$P>pR?OA zyy=a^N;8|yd@BcdQhPw3>S8r=j1KW8=fCQ1_H*|vJ|S)P zgE}z;B_77KulXQXH_`)l(5Hfq@6GudN(G!EFzT2>|3y7e#{Xm{UN&YSmN zr%M|L(|sNMK!R4!;+N}G9I!R#8L=;D*&*WY?y&BxZ*&#Q^uD$|&vVQU@GdrWCm+y! z&(FuJisWNFuetYU$}#Wg_lzak?HP*YK43;h@qo5F-uh$xXCIjF)*B;K-`2cswKJO0 zZCCEvFM2zzy}&mzqTnwSQ1Oww(W-q$(}VA5r>*m@W$wvCzvW2@)m1xoV=?deW|Y2$ zuUXD$PTz@vJHQjbDlluHdp@i&qqpgG@3B6LGJUehvp5ULn=3S~Y1krqS{!Cpwk#DZ zN8vn@Nv*ADA|uu_7mFKNtIKxh$eX+`ugUnZrv@>OH?>GA91-`8wwFFiz9gkb>`s28 zK`&P00U6>i!~UYMYuZs;c`K)W{B{-N!R@6;B8@j_n^}w|#{R;D3=;6lV-cL(b`QW` z(T`dLT2ssS?3ecW-uUB#edZJur#q2I5eKUhs|}j=W~?oYwX_;$4nXf2Ni~Y=>R*zy zeWYb4)Z#EwoMZl`jqRNj;EGj#%j)LC9;eEC^3pdxqVKBaxE}PzPWr8$edkvBGqv%V zi-n%U)*h-67MV$&&#pM$PL*2Y!V1-2R#|HWJZRP)G_71Uullpr_Exra)dcoM-Hay! zV90~@`Y|+6_wHj9KmhxA#GaMc%ovN}BfEd1qzP`cTS@GSoBdUPyfJ(96a@B9GqCZD zU%YgPl5#7`Vs_Tsc(m^Ehu$N)>|10&k+nT>-M>YlJpk2Rzt$kBAwKwt&-!-7aLd-u z)0QLtDoq6D_i6pXxAE9)oEx4vX@PxWGME)pqd`>BkWTcRBRG`iS{b23;R6Cz94Khi zE;wd8Exy6$8LD^DIRQXljaRrzb1x(}c+U)bx9^c1%e@f~3R*AnpkLjop3rK6w=d%& z+V{{?CUmBLtHD{wfXsLSy^3rc&~RRfdBvn!X+}7|N`tQYdf=Gvxz&H-pmkwvi)1^Z zN&yFZ21$CW_3>WYGMDdz#DWaMvvP8>N}N^{m_ei_&#^5DdurnC9T%=>x(8e*S$So# ze^RNhvj$#epVfv~ku7Sm_UwDW+KygpkmJdI{)`mcK_VpAw#*y;^akaf)(E@k@7iZ1 zPt@@OJoyvPGLZS!(R?&MMaDctU-winHVR;;*WoVq=3`RI&YSi7^GsxhQ&yl=3Gbcj zeq{!Du~HSk^I)bd~duezMnzTHu zLM-ShbEGJ>qc?V#q2c#NT9d1jE8Glz4-Q2v{_H& z-4$pq63omV5I5H5qrW4Ann*IoEIWIb7i$H=QfyQgJ&|y%1}Sl%Nl7~Xthe^yg1|_v z^XfB0w3NeJvBh)diylaeC(>pnG$Y_y0bOaeFju~@Rhugg`pjjoO$<0IiKi4iFk2a; z(TIpTR#RylX`v(i(SNvW{u`&s@p|ItP8j`bOp>rwJN;IRPOBbmTKQR-ZR;HS%tQ*$ z!!A$3pr}kM_8?=1Bf|)Ez!FJxn$PmAaQ^Zd=Ex{X&&N!4mx&5d1v4Uol^}$DJS$pC zg9H_y?_cvB3~3S4=T*m!2zEqqm6hVE@Lhe-g_hRlD>eG0H@3xVY*rK4^@zxh<>WY6 zfQ$2)oh{5`Z?KwsMV_xHDI&{(}9 zG&4d1jYx!Ys0^hwr=7WY5e8{UZltCcFAQ0&JT%+T1|seY-eoZr1TGI53vV513*2yK zrf6D!tZK}}BKL(^?<)LvfI$fBlrgg>%b2G(w$o?Mn*U%5EsuBkRzao;isa~DXO0f{ z^^DP@Wb&h7r1qW?B55X*cjcEg7_JCgTZ{p#85`#z(fPo9{w)A+v{^wswb=zCie3?S zA53k+D(?8as~bq>S3V$7#zq6{s!#b(Hl(Lk`4FP@o~1W(^*qh{>W-qBw@IGckqxVn zAangC5!BWl!0P7B_YTZJQRK|eVnP0cFM2|nRnUbDaiHq(1`o0ZDkE?qLj4UvS}gDv z1}nW|@f#GYBjf*?;rLSwSXuv&$ZvYABaK+2kq8iRcs|L$uEo|zk|4@D>24M9(j!nb zi$Mx`qd>-rl;7LTVC%UR2#k%4|2lxak5MrWND)Oam%c_}Y7K~twXA&J?c=9D&zoMi zf1mAnnCe-vAOXAIM2&`o^k$?(bSc0{a{bnlidA3$`{PII@&wh3l zy7V4C8XQA2R_zxx%{u9A-CC`XdnG;d>bXAFq+@0m1EU@aAYsKSSK*Vn-~!EBB2M0C zh?1BiW2ISjNMmJChHqrrgWdRvb9UxyZMzsPMnO*R9aE59^BEjiC8_obc?KQt&!1WO z%$YIRC?|?>phY(ZBPrcC^5vA3OoWULbGr4oGrZY|Cp&~_^{^|fLr|0lVKY7d{SD1* zw?fco2DTVA(U1!-U-WJ)r>FJ2%Vw+qeItf0f4jp1YtCf9bIc2E(h65{T~^VSSvh_! zocr9-tbDOzhJK5^-1N|jgtg0A#)KLKX2ih#poLadV?qq;p}%OkmI(0{`y$|qS~dRX zowjA6bpxxXrkK&bvAZVn6|*C$RYqEp%%jhfcKWQPOg@fI>F9wc z()Q!vOucuD3;DvftIf z`Rc>(19*DHlLoH}q+P7t%0|I`XJ7lYrz(^7J<{U6zV}?n*U;E~hC4_lW2RJnvc)!= zM|S-1&pTb=D*H!rU6X#;7gOR$1tQ;xf^~gEAAlOBgQLNihGUy$hkdQ(>|2@ zJ!(nSvODS;1N&*D=FsmMZczwxY;x8vE1$QyV%Af|xV?Di-?5)+Lk~>YEq;GKW5T%n z$2KdCcC-%~>5JOT>+9?vYVn}85`w#W@?Y)Oc$>k489n4dV`d};Cv7uFS;t8-TC++n zdhvf|AkQvSFBTIc#@-ymoq6F4<~@Tp-rrK;s|gD{ne@PYS3De(LXxdOL3)iOk?L zNZ-yDcV&$q{pLnjzavnI?+h}>Gq`--QH{DHf=$L`aIfb%A~L+kMse?5Btv~LPLnPB zi5?LX{dUocs`bC@Taj}872|5S8NBly?KHHO#kBR+skXtIx${83ouL-yo2@(IAsfbP zD-uO4$rZ7pstvABz3B<>b&mZaFdQg6`bcEagXSuj5uU2BBELohdU?0@!f>CbH0wP2 zLQe~rEstvmS{(MMXZ zc*O3E_U-u1uz&y1_~G4HedpkKC;aevxBk)7*Ps6J>6cIc_Vn@7Cr_U~z4!FDPyg}s zi>H4-dcS_A{pa!i@iBt>-XZbRWBlIJ50CdpPd|F@fA^UG$Eb z&!4{e^hXCJJ-o`3(y(SJTx{@T$yYx>&LA6(G?<~X0e_Ke66o{{+U(DTtT_v6o~e|4-1 z+GqMdA9PW7_Kg4GK#)uaZ}RxphcC+f<+Cnw;Csg!@TC9sGyUTe^)C+3fBYPWUmrS@ z{OHEh+!@nOCq9Ol>M;}{1I?%!f_CYhTh-~@fclP}CA%UkqJS;*-vftl!;Hn+D zPmf2PfB!tfL&wI0#X)D)Pd=OV zcZYh{;!9$y+1!zv<5r=m&1>Ee{ihxr^ia5^x^a8kDu53 zv%_Aczj;{s!Dp8J=@GB@52^PL@4tCeYtLUatRL=Sd^kz){)6ZCn@5lF`PBK~+0#Ei zJpSOY<9o;R{?Y%_XS+T)tcdpQgZk}bZFKNP?%U7&??2D|=CPi1=6vg!_ML+wlAS;2 zv*>I)E6;~n*oO{vee2NuXN$zho_lEi@H5}xq346cKdfHq=XrR!(!P0G&)euo@XPs( z=!r8c?sP|--5(zK#N$ufiWRi)J+Ei%l6jkUMQQD$i*dBt)@Z!8^^w8kW>1D!le z=h}}Kt@bP%owoiuH=3*T{U*6WQi>FoWL1(QM{h>#gD*3>FWcs~vK`HSXZ1TW80fKYzoo3- z@?S>DZ{4ny^xm$R68W9W2#H;a@mDwVCpLrr_-zcx|9rM(Z%odex#1Lg&f#7Dr!9$T z`TjYhwLh!C-!<&`@1ybX%iW{a@S9DZ+4ANYI%DDj3dBsWm_4}Fi&neinbh7Ib7;)k zXQ+pF8tGx%R}=HwjL7dZCOdtyG%P^PdOeg?hj>vZDGI%gT>&|>6oJ^6A{ z$dmiI0zS7WhG;%hN8AsCCmG1^c|%zdn?EO5srUNmAn*NMa#p?WAw3>V@5_n*wN+Wo zFLU%CAtMU>)_RsgcQ=0Hz}u68=sY@k&$_H}=7K9Gp=R`soz|bcxc2eOPt|@hdpyhc zydD%f1BMd5gS|ZT8kfOyoi%wL)%LvRaOIRK%%9u9mmgzXCx)MHAmFt zuBS9;o#)KWYOqXhr_89;TK$@H&zmn}G*(;JezvZAJMU}9dwZNFgSx-<59-Rye%kjH z+|fI|^BU*zNT!*bnRD&Rr+oYJwf$|~^-p8E_l>7JR)Yu<{tW^2P+w+_JuvF57~W`@ z8Q0uZa_u9{Lv8!&+&|3?keYlUC(b#udU~%vcunt0cDT3szsry0PQO2D22sBC;>(xq z{OyR8zMRIRG0JW0TK+aDR|@%`H}7&E3?A<)YG~x1ueG$T zk^PQuZ}PWj>=cohDDcaG)fwCQ-TvP1Kh50r-HyT<&VFm1Zvc7ouJC%ddcqj3S?b@I zaGjOkZGF6^=Q(@tCK+Z(wt{~j6m4^-4Lx;>r;!^+@cf^%Ri`K7x zd_LU1nAuZ#?&%*7_8kCTIdy5H?Yh>{`mKAF z#xATWgR<@OweLoo_wy@D$o@_M zU+V_R>5aC%=PyIj+@H?TKCI*UvVF{t&e|}a?_5*~vG-pOSUdD){MRe%xTu7kKOk_qHsq0@tphG?sLxT zIA$F!22(~nd}MF-Q~*XxcdRELeR74J42!3hswh;$9!r z&3V=oWo!7o8PVsgh%#-_$yTk$Tkmznq46NrjG=s<-mcA&Yh#gFF4p28enbN<@i0@g zb1X4_`kSvaf+BV24L;K&)<= zdpoMvGH2?F{h0@vVqhIIkFlw|vFhu`M1*|h6Uwz`6t2d}mh;|Wpc;$#=eg2(bDH1( z^UdrsbMVVEi(da#C3ky1;@8_Cdq$J-Su)X z?QYbXu_=A&V3+vsj2`*_5|1h{Xs3@XcE_ z_zpQ+YYK0;WH)Wg(mVr1uS#^!`)fLLr{Z@zRiiVeKRq~| z*#2EscrSg({&v?O;GP!esY5U0E)M4D#BZIa1pdVjJHM|oA~GUtT-=$SOU?w>Y-C2? z$7cmYX+(8>yOMiEJ*)g#^X+&}xAG95#O1Z~Ay>e9Y z-}5c>+tvAaM)LkR^uPfG8qW-~b0zq^*(F z7w5Z6koOydW8|sXMCq~DkGQNzPIvBv`gsmg=jTfHQ7qtj2J5vE5Q#x6Odq!*Bi?Ha zpqH;8Cib9OHoG?W0Dlkj9&PPmCVX}Un(&#{+o&_q$j&ulM1cMyzt32%xK(RvyYr-v z)_$B-+bXrv@Aauc*zQ9H=@Z|`9^*Y+B+Xsp=c!UGky9d_#;CIgTwR}tu)625IVjd> zM;{3Ha63Y`c~T^Z&Qy+jUO%F^rb!b)#|CGm*JP z71=Yjac%k-j}PTPYnr#O$DX^O*npsjhgFq2tzhO3aCIw4I{@!_n9bAgp2&K`M87f4 z`cPt4zP)M7Owa!igwk`1X%tuVeSgjVhF7zcbjRYS*(7oz2=-?6YoefJ^6e$?Ge5~J z^j6bBP;{ZPK99I3S9GjU+Qyt}40gLiJbCYX|5^?jizVxTN`H=njuq>*?|xZVS>r)} z9j|hsf?wVFSa+}w)B91d{yRf_m4$8|_Xb(Bo$5L<@w=3B`LAJgGMSHIOnjIF7tO}Y zv43K?d-modvk;9TI=x-nis$sFH`0%3=obsU)IZO~iNSsB<$x-fh_AO5F)}t}G7{vx zc`y2`V3yN@sG~BTyf*KfMI_zJWDC9_i?>&P4hr{r`z*aDuITdwPP39D4}Y{8rx`a( z3bWRkcsU$AFypEK-uTMvN9eD+BiuoZIjo{aBGb1FkhgB=Z6hR&ik@SWCo(;4EPnc; zZu}VERs`OpuLe;OOX6ECA}{7Mt4$B?J{tMyB~j}v@FM&1QWX468rtjjfO(HJ6~YQb zWSlP-Y~5q#IH=+;s~Zoi4K(f@-s81Q*>K@^P7u+H)tB+~?RsVed2J8fJh$H|;)r1H zdvUt8=4`dQiTOU(lgaMs-R_2Xv^?Ny)xZn-Ru5@ad7`49@$q#mFf#4}Go5@iI$2+P z>)-1ss}5ENZK^@Jk5zl6`Tw|kyJp#*Vp&KB=2F)PN7~ctLYzWJO;Kf`E z7$YJ;A|x>A+q<9h%tPi{y}Ebrm-CnG=;&2dSy`FC{AE_H)xG!Gr_7_fSHJG_sEIf4 zkhA}-*;u^i{9Xb#)Vqws^02O5YZ;q+AGG6Oy7Q%TA6eBWBV3Ps9Ao+1$f}2J-g?9$ zz2i$9TXrwGTDMo6`&xhl7_yFe&aS@iIagw?=zC7U*l{0tXFyiPt0TA7ymtanScl;E zq+uPl=R`*9t6pP^Sn)bcc#q#qj`o#*S6Wg^c=ytG2x^=CT#GgLHdncjt7lmt zPiBGImetO9&b6}PlcRCLw`V;Od-@TlzY9S2-2YTxcU$@R+KA755v`{ns5k}kSIdf> zk9LOhT+^&Q`*=Rif+xRqS&ct#=c%5P2lkO*1AaY?`owGfdk%Fcm^-T{5>bF;bN;b- zCfe)u#fu(w;7{K1O9hB;ue2|^v3=~_>mTP|8DYbF^0V4MW(3WBs#rhDvSv)3E_yNY zuAVt?&kjUd74EoRiQ!7;+D1}$J3d2$_p5pj)A-27NIu@fmUT=mzjX(8uUIRx?b$8M z-HY8z^N9)_;>Ck|Wa@3AEB3F5?rj_5c5lj_2#+fnDLKkrF|!}%KTGZaPLXFX&VNsv zVREWoF1a^5>ph|R!h@$5^{y_x=0S254b^X$w#_Vn6}NS@Wcb7Tla@(nuQKI7Pjak;0esC1)XR4$PCa*qBvx-`D3-S*kF z*0(z`q>l8s^*4sEWBq9Lt@@|>J=?j$TeWTdbHa%@>zLu(f>s9?z$6~{)r#Ku__f}TO${_Q5XevE5n23~$dH z>)kWyxDWPze+%Jj^G8OGqp?u^`_v~g|F&7@Vc!eQnrsp4NWZRr9`Vmpk)M&l=?lnXE)5?f-?_+Yv)u**H$N5G>T_yEv(|ccg zK7YuDyAyQG)`AZnY30;7tb0&QRywDU!n@p?1J?d@uOmC)@OLag(J5&~IEv%rx}<7; zE&4fsIC13L9Ps=C`|M2^wTgRs0WTyRT*UEUi+I*x9es#Y#lB2clEss6_TM>+k zVl<9ck}Eyiyw`oNWS>4|0?vExhe3CM&(2dda9HKUr`ZA}jC*>q=Zli882fv1zN-H` zug4gy4!?&l8Y1d0y?t)xjl!6p``Z>C_2U}G=bH%g;*Rile2|DuenDZaceeZNKm=94 zt=N&fW6IVeL|-M}+}I}qzX1gU^?`&s>O?i7#|X1o`&q2V^PgOB0$Kf_b3{+H;f`T& z?6>z@Wbxhi`<}RuBl~P5kJk@Z-haXF-Aa^1hO9br-(K0vQtg$_`(!YC|LQK_j5`EP zcW0+2n33@Aq~Co`8fLs>lrivq9sWnrUU>jF)u4ZH!?<l6YrqkdxFi9~Hrwa}B>Y6t)JjlXmEr>Op`*g?Vh!&y(iPm6xK z^z0$lViNVeCFHzn?=@bRJZ7H^I6K#NL0rqXXKMA-`Ck@_)M%6*KgYk0_G6lxr>O^G z05d#R`#$%G^qDXB&@+wK=H5Dc+ym?bH1WDWoB6DXoEYZW$C#`Sc8#Z$^PERtQ#r3i zm{y$1aNo9(10`m_TyUN9vS_kYTUKk6zuwB{@yxj&!8vb!21X`4efFO1&g-XR@K9w$ zA?LMIU9V&OT1}9&13YEG>dqx1-bM4Zp0BKVuG}-8q|>HYk@;JXa&M#+~E}*Jow-wvi|WCsko(h$TdGKdWM%Bf0nUT>m)x7W>Yd1No*8ukHfb zw_>Oo=EwwE`+EtZ^WOGaR7aGb9c_-l*Uls#oH4vTgUHOjpMBQz^YxF<9&5Ujre_{_ zmiwxNb056S`11@;)njEHB>@Z%B7M#>U^=}@OY(l=AI4Nfu$BswX}x-&kba*y;E5=`Q$+7~W%}Pk>+(nRP_J9V$YjIokf} z3_NBZKI6Uf9`2C42Zn9N)C#8y^W>>n^T8c~7gAziZ`k|lh>mQYU z){oe;@piktysfRD$F&dFX27!?eLQfrQexThu79EnJ!|4!R9blj;n(Ykgl`|hLM$O_ z2Y8=iv=OAWWuNJLXT84v!Y1_qi!$5Y3AUNBO1cYxSWWfJ30mIEjN}}_F}}~l@@#Eh zXxpis|8VTT1DyMnyiPM@lYRn}N&u=Ww;t$%NuKWfM9gNL_yp|ac$?pk9TFRfSdIpoi(pW3DR z(Xr>hsK~!Lkvn8^O^?V}!}rrlJ*%uIaEH2fqWe)jJn79kmwBFXd@-l2R`&UXe2sFX z+0E9gZR}g=)je%bJ?uTl><;e+aY{T^iq8q4_gp1{o|5Q!R-xrC2>C~GzZ&0JuNoi! zF+QiE5~_yyJbOGjx3#Z9-q|C!n}5%u&3){HsC@w<*@aj4t@mX5$NC2`vUYPEXk*9r zqxvFncY=i~k!`r{Db(sG9(J*ni%S4&QRVvmobIuZTr0>tq7_ z$lM3Do}TU&E2!rU;|*!;Gn8LBCsI+08;)b&7_57dnFCKz^^a(>hx95(NA2Tiv+qfF z#k~Al^RbGrd6wCC0ix-&5gR$3f8&MBoXw6l(yQo>ct1PRk2S3~pOuexWuGeuiGC_f z&G3E}vDMC%Ozdos2UzM1F)y6@^fvcm@Gj6^C`+{1V1;Lru^e~6G5Q}pf;-+-mA!U= z$hbQ1PlNp&Pc&0AgY%e;8I8tu55CQS&nNU9({jQ$I_?Vp<>Nf}g9{H{sjj$2f)#KR z&;8zL)wI`Gzd|Y+PnxkujE$I^c{5-xW=9{RZKbg{daWIHVH>-{vuE{;?|Wv49l@!G zJ{*E0rrkZvVV^zV9P|1!){kI+EyA-Fp3d*;U*^REE_uho>~~~j;#@5gfef7eUX5kj z?BijxkN#w5xVMfOGtaqF-dGU|BlK!!_|~qhB&Y4JeueMH$Uxz%-1Ch?GTJ>NMt5(| z79eg1>{Zj>>qmO-ZMLgST5QYEu#Vh4O3i!5Gv<^+->1pF3&;g0rAS@l9iW|NwstPg z2!F&Ff4uZd4S|qYWG(J!&D30thB3W+blQHk{yjZB6ajYB&$}8@&fINf_q{_up3e{La>i7r zX4cy9%(L#P53@jy$V|UKg%ABa>N(GPR+*#i=eTZ1@%4R?Zp8Q)T#dG8xNa|)J=o&= z3Ujk{>*uHORXeATczQb2Ds0L6&VavVLKSpEiGD`+o{yu_W;p$+pa~(mDrasiyUn8?(U2RS*V`WQ2%}C->V%{wXC-=-c zw2kiAq_^LXQC8`m9Ol^XH{yG@@N0fVA@{Qfy2rw=eV;15TZIVb*|F{rk#D^n$z$YS zIRlsSEa#4tY(LCeH?m)4p_7fR|90PM=G?0`sZ6Wex%h9?Z=9f&SDE!{PC({4dBhmE zM&W%JmU(KGHz~lJ@0(~Cy_#E+76tBsyctA$H&7D7g-CHJ0vS6=xi0Qq^ ziQaR*(;O_aa=!h5?0*1;h)U4 z`gsd4a!c!(=GkV3dk$5HT%iMRVl0C4j@+l3seg9^nelwYCbQNSna;|bpUyqU{<&Fw z4sNUw6ZHniSDDbGGa{tctfHbj<}QqQ%VRRzD!Z0ESgY9W-mqtV`n1x$V!IxFFjU8} zo!t?)S+d*8|Klo0SGbSN$}3kG!rndm%#x9PhxH7RXZSG};xVh7S@p~pv%IZ+ zTWe9A#5joUwE_!Q5x!TZKUr@l@H5`AJ_wGs(GX#A5WP_xH5*-9g6Daa4W+Oz%cEfr zJx>lXxKHpOPt3Zv%3!&4FI4}u?q2JkQw+o#ZT&LBI9buXzs<^URt*px*_ijyIy3n< zgYr~GHg{abD4#QPX4c9_N)9}E%F5_+2Y@xS$^*>tOv-rzD$zJkUu&+ZW@uT5{_$Oe z6N{Q7CmWx8XmHPK(Jl8ux zeC43Cf^~yDJCCII%*v0M@En?~)PphlupTQ@$*i*a)njbkTH93_XN7lalBb)ks9^dm>Ecx@^Bm3LFS%L3I-wL7O zP69WdeL{Qh{XQr6+{&1hel^Psb?T`D`=IA)P13LKIen;cS5)(5#5m0s*s&tw@t^)Y0v73;aDev=JoU_rdQ>9uyW&(wd8m97b7ct&Z5|-?JYL0 zes_s{V}FF|ImI=waY$N`F1bJw6^V+iE1Cz z%-B}jalPB3*sSk<^VjXQ=JqGgNVIVL{gb2B(Mg_!NZQ9`AsyR$Be9Ct zW*Fgq0{h6^t4B-c(PM_6&A=fH;>jAOW#kwc8S>OO$JIY`vTue!+LJ$AXvZk5qmB8# zhW701eKV;wSuD43Hw+&wnlWVe8c2wYcwCjmqm4cKX!XNvXFMEP%T}$`&<-$*XuvyH zD&0@d^xzwuWQTG1C(@mRBHJ;%zpoWf>)4V{v7h%DbIt3`QJ%%`ZukDn3|@{q;2u4^ zoL}-p<(_Bu7%dp1;@JmsiHEp`OV22uC$LA(kaER>{n(dtY`C*F^F?&#CJtV2Wno`I z&v;nnKI#~my5pgo%?h-56A{{4JKCJ}_0FgNbH+FOXzB;1@W)6#ts&U$yeAW6%WF@f zWXvZW+4j8L%$wiP+T!PZuk#8Sjq&yy{Mnbs?E{IgdbIVKVF!TRf180suUyCfaiqn2 z&N~TcoxRubZ08h_Q@G?_i#Jaib{;j(jNeK5nHQ_&#r(H}{H?z@a4(4Qc%68T@>fT$ z2W#i^W>Z$JDlHDr^;lQG-tlwv71LMvVC(qui3MiB2a7(tAGH|4b@xjBv5FOD#fo5` zcoKQ_1Trt2M`&Y(ytqP}=5JTe75?|jL<&OlP!6z!)OHx2`533&eO9DJOKe)>>h-vLkr6kv9-$kGmidt6^ zXN*qkUvhIFa96a(XWkwsK5uMbl^!je#vn3cA*0zba;k&7FPeA)`MLhX__ZxOx-;cX zUd=%)$K!Y&_U&C?jbp0k%=URq?6FyoO5AK!|H${t`zf(_-*pd^1(Ga!TJNNx3E*n6=1pm`9MG4xzPsXm9lD-6xj!W~!Ze)ja$x@7S=6&K<(sBLqK-Cmw6dR4P^<{ljAdT-9wv1P@4 zhT|T9A0t3Bi^o;(A8CgO*{25xI89mZb9^ z*0wJ56TjyIH6Q=9K0o5${hEF3w1aEU=&d$Az`!0KeVYo>}l=hHM{I%@Iqv8!5K5%4tnhN4C)nk^Q)*ou8QCpEs+u!O6VYci(hk=O=IY z$VUEZMZl=H_uSS_G+)=#_f!|m;cpn!dt=*1&v0xV`}oSXe!X5>IkM``ByZeH$)TrG zPxJc(Ld*N5{K4nZA0u=?9@uT6X#%!m~{Yg2C+DB_((VvyWxX(;6#2RGOH?w=M(5L!gn)yzfVV)@6 z8Pv9W#eIMd@9n2`k8pm4oZS{f`VU9a*k-o=>z-M`+p43_9%y}cf5v8pwpxZ?*=jC5 z&J0hZc0fOU@jPY!=ymM2RwURZLZt31@6+VW8OQ0M_Z6>+gdXpB-u)}4n293;j-=Ve9Nm_Tut9`*>Vt)$lF?n~t$pABniC|Etz}?A1)!AvgX!_i;3y zF;t(=OM@T08_~>seGflYsEB1l$=RFCDMjP8S2eF6;H;tWTQ8|J~7aG z5646AnAI!i(3Yg->~Zv3w6ANKe^}}4)9e2B8EeDzbyl8xY;`T#W@Ml2dd||E{#U$j zrk~BH=Wm*iSG)|r({~pfk%Z_+w(Y~&2YB0j<=y(fnn~lT?ROxuX@uqgi$%QK=NY(S zeam7#nRgHPWk=xgc*XPV(sK;qI?F#Y9$WNy&(Bn5?h(U}F}{t3U6z);uKT$oSaQ>)PPu2iF;8o5aF)xzi&n#X=cWoUE=98Y!D&nF#hqcY+ z$NM~Gu-cP$*OA^Q7BS5D>w87nPkiME>2vmXo?b_V&7)m*!Z1&d%2dZ)^10K;EbR=+ zJx^Rc6aCZ`KYUGoiQJP=G)I`&qzPkqvHJ>% zBOi<8^;P4Ep7)~nRQ1~#dL4`3-&pVN2G{z1!##)Z&jTy?)YeMAHT8RjI47Rr1pmj; z>(RWeIhN_Q&nNy@xc$2N2ZL{)`q%?yfzv6@KG$lePXU}gvVbH6!<=(7{*gU=^$GkH z=EV|2pGP)%?-Vq8aq(34x!2AheeNjnt4Cumi=NrR^2PUzUurp4d=J@Ryo^;UaXT|ev zpLv;VgA@d!@cI_|*XFNm`5g$m|7!NRT^V|=^LTb=8sD9Q`%@7f__@?o2KKY$Tl^EH zKK#Tr(Hiyr^)c?RnA!e}9IMay++ZkU^9}$8(DgiklwEO^fwx%S^VUCkzyteT z4tfT4WL)%TJUwT>@=9g-ll^;kul;Pj=lQx`e=Wt5HR+Qf=R`Hi33T-g^uCOEZ|B=Z zo`B+%Jr^Qn%^={VVV8xtYD%6MMeC-?rf)_S;!i z-L&v9)!67WOg~-=-&dJ_yy86b{*0Y1?6J(lH2iSar5_)j+;RH;cJj!-8`E#r8J(Hf za~tJH`r6(rIdeckq_Ai%-pl7#o&R|^W~#I-bf@$)!IAa%J^%Q;+0$NGE#l44FfXon z+d9cU)_TunZO?r4!}7Y#uX_HW8hYO8PD}=@f6#J1bAIgmfWPl^%*oY=b?heEK4BYU zOvkL_cxYChp0U#UE1ml}C0vQsc;EJMW&11YpJ;i*4E#_NF<(p7vJ+r%Ua!|bSu?`9 z-{PnG@oXwWn7LuD1jzJu!d%dD6C*DQYp|Hg_XS@7ooFb!Aj3##Amhh_&% zZ*p?ooA3Ge$&be)&zt%BY8>^h*?C2WI?JN95Qnd=K6-QyWEcAd9tX|}FrK}Qx~j27O!1DG3e?o)sF%f$7mnsN zr>t`p$PhE;lc;0RyRY2F@XQkBakS&!{nlppdJZWVcv4_wH<;xr;gb!$y+l?ep{Jz1G~J#>dHmbw-{c);;yJcYseoW`XN| z6K}iZ90zuvpqqA+sX51O|xX$O9S@Rsl=w0>B`Mc85eqL&~=22!%!Lb>@ zhtERR&;0y^e^bFurrv$VX)mx6?tO;!Ux49pGbSHb()7;SVxD!yu=TQcj0uZK(DVdy z?~K;;vieHxQ`AHgY zN1VqIYi3>jB(<(Nj$qqQ@UGhD*3rlNM$gZm_t^qjIq-Q0)_I!+@V5iZgIPesQ{L0Q zk(tp(HFrjIX32S^&NN?pRX4L{tf!yE&)MF4vQdl9^rz?A^Eiv2pS`x=i3Waqo<6Y1 zd14jGES&PT;(N|9V~nh~vZuGB8{qmfn6`}_}jE18`;Pc!zJ?GC{Gm;DkuJfpJm?Co6P_wz~Oka3@0 zcOH-*$M+*7o;k+0bCjQtw2#04khR+whJ})>b9NAg7!r zRt;BHwGTYoc}At~eOC2}-_yxwpd+HZK9i zjb!@UOZ{0#&r$KJmpr$4oYnqOwnteP@t!&Mi)HIqA97IDa|+?r4CEgjd8bP4nXQjsnF2ajmwGBVZ7u;Ejw_d)Kt>TZj>QnR$%bZeVq+*=0Ipw-hb+$u1; z${rOltUJfdF}C9Iios{x8AmPttSHWyjLEzcSX$1=!4NZ;#;=4zg}_A`eJh3SY&)W&5dAe!j;+c z32W9)PwV;6A9i?K`|%9s7>KKh)%YgLcEfl&_qHx`kDq_`$`B-z$>-kigx)bqnKjP% zq598Sc*;w&>Bs}4B(~f4yH0;_PcNjqr-n1EPj4htg--_};-oAxdX2JPTkN&kesn!*-QW3+>yFyT(NQy` zXDMUWwU$=o_Imaqax1YDp6@;3leo>3nPBxkYs^V`h?O%AwDRN5@gB5qup=d*VD$ggyjH6x}*wMX0cBUZ@|J%7GM)yW`p@Z5Jq$oOD6#^ja!nSa*l8~^B;8FzaUqf6J(`>$HNUMJ$MVMIk@gflu? zc}vbbwmEUQ8&I3PT?efnX_4~M+{&cNT0aK>k};TyZ#{_c;@ zvlQFL$_!Yoe6O5*Mc~RJb_7b+)Z(XjYxDg`2fedyRnXen(VJd#wvXh@KAUSc7PRKi z<~d=0bzAM{9GKx8u^Q#!h~bzA=g>RqD%n=#oGRd?bLY7#?r3?nAM7hj+C27&_<7Vv z3t4)$YV27HVmYr+i)%Q>HodWOFUO*9R?D}izdJ#zp5^z?o=29C*7wLeY7#7S@Am#3 z?s!K_yCQSdWZ_97ILr5V_s3o=Ru^e)4$^7vI6jWjv1P8v)bl*RI&!qQ za(AFr^2}oPdrI1?>i4u|evl3ZJzym-NQ!=VK{DCN>#Q0Hz1C$D+4=l$#W`QCZC)E$ z8obTF(zY61EpX-gAol|21J&>J`+TE4Y@*?QP-iggF?~Pd zVS9MVE3GS)Bo|57a@)9eP$tp$9$|f~PA?rK_tIuxYh9lueh0$S*@)xQOn4%VU88qQ zo%lrS9o9T}y1AER-ah_dfOk<&B+XWPwRxhAKkW^sV=t|vv}lh~N7r*<)83U&HSVuh zKCWf4>2p561?01dcg?=PKCfjJ&yZ^Q`zr8-yc+NMo(!0y&1kV?;7V=d7YWoYP)q;`WwTxodsKG?&t3%>VsoKj{l>K*tzU~wHjN{B=V{R$TeNtya{P*9tYyo! zqj$75qoaOUM>;*%bfVxFuJK$A!@OseTFml!0-lxo`40WZT<_=xXWpw){|^Y!RUKz- z#%KIv=d8W|UySqI*$!5ztFb=4bocDNy`yBWKF%=86LFepb^*`p%vsmeqV>$2l}SFR zDZkSp8~D-6(W92|H9h@?2DvN4)7@k&O%=B4s!hKZooCgc9=7qH_wl7vW;_+oUa>Ix z+BoYRrD%umxDq{iVBXV+bAF#h%+C&>+Qr2R=O*G^B}Q`e$C{7~#wx-YZH#96wO6rj zS$g{4Gt*Be3FFvyE{!9$tzW9Z2gHotMM?k>CAI`vs%md z*P}*J8V$BbGT37$7OV#}{r9@ajmZ9J zZR=W|xuV_c!KKFNHGeNTdo%9zjCxid$H>uijX4?bVr86OcFJB}l8^71!AdrfI)f&? zGt*eQ{wtti)R*hHQ@!#UT=)kK>$MT4kcjWvs$7i5^wf{5W5mp1Jr){|k1AMp1{*zm zi0#OL_KXJ|ZHPcm>2H+GC|450kMH{;Q;yXlN|W(;GfwBGulGk7 zvLtr2v^P<;^4#JBb zUB#H*td^_eES9Q=v8oQ^>77T+9A~pL?CyE>(_s`_`jydHd-mtb@~s}SR%~B0ix+2_ zPd~4=UDMjJz4iPP(qXzR=*tm(tSh_n)7-SXH<98`E7=;`*&R<4iP}Y4i{{aG=<}mS z`m{+}>-rguMn6N?zR}|~d}Y(PnrB4+sOQ>8*NG%fj+$c|`9>8_XdJa3jn7(nN^ZM- zG?S(X2I9KBCe|a5yur)r z4D@0Q+4xI)WV7P9e%6is>1~T+tNB_jZe3BiVmyxpbkW%sT(1O8-i)>_bdWi(E?m=# z^VT@KQEiF+E!mpaeLWRV%#V$17Uy{;^hfJywW_#_wE3*NI`3oaIG?XpHy(X^*+Ea; z?cd)^vHsCKYV&R1Mjc`-!;;$fxCTS^MsnT5MxM&|Wc<06nGNkZ<(doG9{G#_zE; zvsVpE=*wn$wffoopr^l$5)S!ZZ#3y;6Z?2ZHVBgRQ;K`kBYEZdC+$2K16Of4-|W>0 z*+gEH*>!fVqm9jNH;-2qvgRD?rsv!sm^s)*FHd=+Mb5j^-yC4eS*{~PzDL;2+Sz|L zjw{r9e$8sO!#S(Qr@eh0zj5QbXF9Pn9_$(Gc+2*d&`0mu1~E{htq_xu*=L5I;$Rzz zb6U)HevgdAQ?`$FWCX38(Q7?UJv8yC*YWa}g^4Rf*x0MiW9NvOx1RDhD?=2nV`XWx zRp`)Hiq)7+!`Y;@NC!WW^ZnjrLoU3ETK%l%w5zqm8gTwjWlbb<~nRPa&F||s(sJ-@0z@d zc1Bq|w}Z}^iG{JVGQgPLyc~H|^SGuJ#)k&hX}unW&M^%{o9nF-z2FS_Czo$QU|=nwhmgdAy6wzB-F-L=?`E8;h4Hjchr zJ9G4~%W5MM!`6#wXVP=!WYgYw6K$TbQGL(M^gysjt=sL)54v*Z+-U4|$38l)KO-LO z=N|gw)7gnU`{Ugn*m$$DejMAfa@%F(zlPd+_(MzN$C*5g$27H#Tnyteyn36_`#%5P zvp1IB>WLOD(2AHVuNbq}?2cYpK3K;ZUSP^j^W!UxW@z`U5s7AWj@*xYYsYf-!hn42 zm4Rl*mPj_1D%A>_DA3TlmFJYfBu`*fBIbm@BiVZ z`RBKpfAih`f4Yr-eOocukc0j&zk3zqzrIQE`DZuTU*2B7b&HkA{_H#MqbKBla*GtL zKe=fT^MAc*gP7IlwSViz+0Vc8_NOuWzGY-?;dX zw>cR4tJ?@mfA41dPj0-z+rPhE|L#o_oxk<%?|l0ozx@y2{`YVHF~F2$bS2KM*s4L?T>H%{^QNJ(*Nz|6`s!WfAKw5 zcvWx4|KygfKlly5vhi2H(fNnpZISCgy!l|xwg2e5{MRSx@82T-x8E~BHq`us?_RU_ z&u$j}-AzIzIR8&?eXvpiVEDKH-G_+&>^AooH*WJw_5J$WKfNKsMtFYp?Z16T_h&a- zN9*WOd9MHC?<2D07(D;!Ci{z<&R^d0ke>Eg_fNma{iiqmzjMpd|8?6Te{`$)U)?hI zw{Pb^`|1yGTGZ8l{f(VJy~&XO{tX`p9sTp~5n5?_r6Q?jB7|Fak=p;~ZRYR(X65gE z``N9ge*W#3x9iVtK7Vn0sr9q(Ge5iSacBO)x8MEE%r9?P|IrQ4f4Nx)8?XQ<>gzv=(-HvSjCvHLH-{U5*S{q39lXWu#by_^5v z`}RNIeESmH@7`oT|E~Kxx7>j7XSe+R{I)|q`F?&nyEv??UX? z@7`v9apU5bH@#onGVqI=-Y>uF|ISSUN6LP2lm6o78yj5FW8E)qepvhSTdN$|-~TTA zH{?Uk94$wybCKyOy?Z*=eD5Q7N3xSRHv4A4 z2(@aQ<6+ygA49Cl*C3HGucF>jpfC4Hv#>q7T0e0!wzQE4=NWAaj#!f|*Q1SuD322L z;(W4(gpp{_;vH&Nbuu{9^)>eW9|^169cBd(e` zu4Q&CiA1F0m_F;Xf%j04h31__H+xs;iXa_P#NVs@i%(m7mx~me`wgPvm|jush_Kr@ z4njQoM=!@n%rzRlTHly9Tg`=*8T`shmXGb&5n}_W9p;f$8QDNIN%*F zW|(QkS?g+yEWcR~O-$=c+xcK!%)2kdFmh(Ku7_FgnAv@Th+?mCMd-FI`sH6a*x$oG zy2R;f?d7j_&)IiIUuoIO6Dou{DtbKYjl8L<19wQjUXwKZMP&V~7p7B>q`U&&c8M!@pdhZJ_p$mV$ zY4s*z#(EN4{zri%^o!Fqd&F!nEjgl(o`}R~f6LL;TT#qvy;tduj`?z> zXtJ$rd?@GY`@QVvkrs^EpLS5#Gm_?Kg#V%yP1khA$|$_fc)gdY$EakFdzy$M_%KWe}V6 z@kF-+^rf%Uh-)hs##S`A~ZkDVr%&+;S6*w%ZmrnT%0qx9Tdq(xQZ!{dEmlvaKrKrrcx?{n3(6sk)_E{1BgGO&;t#)>=`V9N5&8urkDaPHV6CzfMr&VaQ!WpY+ z$8r@%5zbodgTm9Wbp6R$uYN3qZIJEw>@(-Q+V)usuc91YSu@tu*(ZuN_j#fvH1kATcJMJCLtJ~D z!}eIa?!&O0avkk3he4gZCnXZsd=38_aWS1+8N)BVaM6NhkL@Rs_0c)oEsi3Jfo$qw zwAw}D3Ds`%&zewVy*Xp3M)aXWe_x=wbrqdwSpDdVdBco|<~T@>Td__UyOGPv^~biJ9gDp>DGHGr zU$QVVzPG8QYI5aQv5%d+X4zJjnlqN+7&(ZXpX*t_ER~}ji|g?(M}s79M?~t0YcjWc zd8eKCF`lu#HPF|;h+RLr*{deLn*Y3yA0=T5kC?fhcY{^B_300@6Roz?%-`8tdBQ3T z+lCU~$kWnOv!a{XYGAj;;XYEAdF9#F(ze%$^_Bb&XWK7cVdof|y0ZeraxC&z46jG| zc-WTJZmst4j`r}#C@yBjxwo@0zFQZ=!z1g{!hhA`(WTor;N5dB|QdwPGT}liswkYdv|4j;`^0%?B&P!^|Mi&S2QR_#P`_Y`wb7 z79)L;d~F7*wy7YIfS?FM=}g$g7{0AN9L!4Q9nGxvkM(7o)_wJF+#z)pR(xxje%@lS z@n9R@%!NI@8Dn8`pnszO5%qsWdyF#V;0A>l&e+S?wiIUBa;_}jsBdQJT#l#udRKpi5(1^rDGh$sK&(S+9F~W&00ssn4CH1 zvqF^{eH?(RN~0|&G2419WnEbsc+>twHCWM|QL!OQ8(FC8Ved!qZx!g#h`>i=+jA0R z>2AE$j69&_dwNO6E_1RJ2FJ>@B*SK4GT|JSuu&TZJ$O|^Phv^3y*rZ~G)8M8`Z4^E z{VFD$_cK#()t8uCVa&rH7I=4+tL*L;%d#)aT=_S^=3QBRytx)R-W=hb9`C`h5h@ks zkzrOC#jMm)RvG=67k>4QZzB>*NNd9^#?d*-?=83<9~0fqMXc>QM+X0_a6X=4UCe{4 z2*SjS{b6yBHjymD2Wi~x))sd_; zvt{|%y8xM7+QPk-S=n4{m<4g=eLU5xDyov533Zg9H*=0y6HdJT$QQngB{t1Eqd}35 zl18l-H_~A~O$y!7|9fGLd0}RZ42Zs&usJ z=|hbl$NzZJJN|qPHhW-JXKN@a8^tW!$84k-6Yw6N@{YtFe=(EQokO(E+T)tHaA^^n zuI}3Ww5}`;^o%aa(ejUDAIsMG)CRuuFOQCs*T!+kvtZr0W^`C3-&GbGRj$m*eVAh3 zzh26Y(1yBu#jg6ns=nEd*JF#l{klgU<{y~>5rabp^|__>o0suHPtQ>@+N!Xqj$`

    a8dm|k;?Vh68E4V9McQkwD-M`W68|v3C$nLz7=@nOLU?LS0l#B z>?x_v&@)eI?l!JvoXF6Q`RSQq?!o*`M(+Y-!1IV%cZn;|2%oL%;c{M~uAQ0P+h~jQ z$MR1ti5eV(u3oWSp`2*do+~{p@3*q-Ib;3XHxF} zCzHOkDFV^Qx3aLm)sA+t%LGV&^h@7y7jtLCXzh%+D%{Kz`R0LsZ*55XDx>*L}PAL~N+BinF~cM&(PEe>~rQm!&SW9*eHq@MEX4aejH z=B#})V3cxvPYKUA-&s$@S^SZ_XL}e**E8$GxpvO_Gxj_qqR;$myZ2;j zd=HDrV)TAKZtu04srEaI7`q2xd-Fc*x3<4Z4FaEgI&)G|kX>g`jQJi>W@G5#_C&4~5L^2}-R zSv+8WT>s6`)_*_mv%*?GKVv?__iS!5VFqBkOvpT$*wux#Km2~y%;&8+ab!OB-qU*4 zn+4a+8Ri_G&)ER2h=w71a!qwvNku_)%+bC-Bl){Nam3>FjPzcrEv~%V2Vj$L5f1lS zpyIjXf*y&C(Q+0k8QFU>aHTu;@3|L`*CYGYc{!l1KkQS(MD6?4jBKydpS+xL#>wcG zyQvM>glDmIA0VdK*Q(DqNwL^B(0d0c@6K?=>T5Eri+;ycZg)IZLpcC55*U|ZXa3=V z?O{DRD`KJ9Y)(5>dqiN=_cF0xp&m>0c;nT(uQ>2Zl}rweO`JqGXHfr32b{I$HJ%@9 zm4VQU<0?{c`GQSxCyPtQ?gV2Txjm$=cHZo{ChN3Ej%6{9nj6NB*e3!sS&Kd2)qS|F zcGp{pGRp}B!>m5e@;@^%$KME-yT{zVIx~@p-D}cD@gpv-=D^5cU3R(dH}mFXSHCQ4 z)16dCoQdV@HcYkGTJQ%Jc{Gcn1QRdU%ad$!%CL&-)H`#1=2FkquQL3$-nKf(kT!}d z*>VK0jW>&%Z_gg})Nu#Qx~w1>FZjKF#X3=i?yM=>Q~zc{_MLOJ%osh^#v<&iX{|Gw z&%x&AZC>A_Q4R*fM1?=N0Rgo?HEvbQI1KhSV)QzbSnrs*S=WfQdbwv+OdHSir#D)i z9@rGgXvKCJkagDjt_S<{*$wJmt$Yu|Z|Q1Zug5D<5DPE4-wY~|U)h$)`>ZILETQLW zvmje}BKq?ySuOMQ9eb_%_gWc@0rY*Hdt}aUnfc!p$1>7C_|8GHEPQP%9!$`W1P3_98EXSugK*ye$iS=^fiPf6?j_)M3$C;$G$JcAI z7Zcj`s{uV_$62z_cM{F~s5XzpWra}Vz2zR><~{jPD)05xGYjpAc+W0(n0P4uBd^R3 zS9@;s?-`j`TAdCx-AU6~PrVf}c=P9Xpji+}cD}wXww}o*^0=>tZ6_13E6?#u2FnJ0 z_;xJwTEOFd1~zwtiJpv4o963WwAN>v$>2Y@RXND0_px>_nYka;+cDXfF>^4S_oONB z>=OBvZS;B;+I{oF8dh+P*L!Zyb6ew;=t2MJWn^644Pb9qI5)Y$hPJ#uviTMA?Pued zlSWppUzm;esynvJ!)T`AiN?t1AEVpek|dk)NM4Qhykf@QT|q$|h#OCH&&}^-;8m|* zrw887A27yZC;HUC^}KbRQ!_nVE8kN94@D?D$I2fT()?U>Sjn>%dD8UM?I}o~oknFU zl%MneeD!^dNUV@*n$|wGb7VG26;*Au0{zxndFCRP@zy&QJ{z|&c^zAP!Uen8rndC! z&tClYIRvxzIeT9}E2d$*`gOmuAHYrR8;SWqtIT+JKJK0K$s=x~)MJrP`;pkPHEYL* zeEUrgeb0Zh;kvm?4?fqAy`Q2dzngLR?QL${xn-kWpjP=|h1z9{86p^-h<|hbweezY zpFQkKyzvt-^TD_$e)>HR9q$W21?%|$MO>Eyd5ul^vna#AH_#jz^bfy-oTybIda%mgAsGau(Q*8R(blX zdCtJZ7F!>|`*@93sbz4Ccc1F!ylIbw=f|LVjB{r69N)4gi}DQj^EZ;Lz-yreqArib-^=Pz9M8&+bKL+I^t1>)i4`b_oYMr|Gy;=9PZ+*Lj z^9ULKhM7m+KP%4z?YzrF5_Ujn+#kfYSA+xUPy3p>u9~@H$toyivkag^AF1zIpUhb! z{Apv+o6Hgc_gYZ#EGo0H4)@cav+1t`FMP$KHP6*7Y))Yw%`z}qAS1-PwI{ltDyBTb zX5YifJXv5zs=>Vb(@(=@qO%8`pYjD3`12~0@d>Lw;lz0(bHT{$4fC$S>W_|O+n+vh z$TU6h^O*~LK6!#`&L?JM8w+FQr^>*QeOdGBo{-_{UKxzbyR0*7ghgyFzdnYy_!$mi zna{u=LkeEn*#*cPldr$7>i1K+^)K(%zKnL2@u~e|uUT0qPTs8j`V3_8%62jt_vwe) zU>C?S8uWVdVGLTWwmu&}MJrb_*Qo<{a7z2?3k&WJEN1CPL~v%wG1u;*RI{8L19EfX zo-pQq3%9fAuO|m!ac@$yyvoI^%%AmQ|3}pS=AQnHfB(OKuTVA9dY2*>{^m)~o^WkO zhW)Yi^;Pr8_MF2Gva7kRPf zWgH8P_qTE%$MvDPXZiV=6J}p~wXe3Xuj-eB`9!N_&y#B0k$13u z)6r1Mvj&^sO8?e$2HqR{3OO>reKM7^>B?^gZL)8e1`r6`%Zh zrXyDOi0r%0oj`@5J&aSIN6C9Iy`}4CK{y?ct^r|ZzIDHOEDOW95p|7y=VRSfX7lXt zEu@dw)3F%vHUeXJ@@lAe-@hMxS#5m(fF3p zcqKoxGw8Qt_NsDHj`H;tttW?;Ht$FnPj&y{fB(!2_uUK3iO7Ecdlp#t2j8={pI*NL z>(K`2tbd;Znl%I5r#gQ&m&1456G6-l)9Nvvo+HnJybf zFJ=#r89xhG`)JcAr)Mi!|BBW-uRD_*?0bOqU==gNOQx%Na3h7+av;amlB4EY*Q`1J zTpY0DYj~R8o})706x8koBt8Yv(sQSv2lJgxV?TRe)8avoTz_?AaYw^mkbUvOrF_!D zrM#juIY8#BoiTK0wKG{6pMLiLNNi){yt-V-we|0A2LC8vsvcPlbKH zoxOZ)jOTWooNPN_0paFdEwfNA;IT6bZC6dsj%&;rYbS4c1aof>@%>By0;2H6Xl#8H-Sc&1)@s;#aX(C=1#?R5!#HEmP97T1TC;Gxwzg9*4mXO| z`^VM$iLsitqRc#~$pD^lcRS2v8&8m5UO`@V@)@!49Mb|8#K~D{|d*kgh z5xCYk+y$N+_=7`6RyZ8vACFa!eV_NLJ+Wd}?Cq`3qkP+f41o^c!;&NAvTAOOL-y5% zd!^>ZCu{OxJm!YDdAsIqT#q%Tg1~Oo;tjbHGT|=Js~Hd_ea|WKgr@8}((8D5jN)r% zKogh4lXp|`S`k)tJQq*sU0F6l-PX-K=my9 z)~76!4VWAbhF5#UAp5j(ZAN67^<|XZF6-mT6JYGW-P>r?#-EihuQ4fqpaL6}PCT4X z)wSMb7@XdTTbG@|bnkoS-q*7pTti<*WUxJe{K)BG8;guH zANRJ-YKiq&Z}odKV07idRvVzQhP_hFehR=BRnL>Ywe7joHQt>A9d^rXHjkd)&+>5v z=(1RSz)alBnQS4G^I;YS)p0j>8o7dq&8q9rq-RWK5Q%yrdA+s9(U&P~*~5!ZK>9LH zu&Ut-kX3x{zWbIiys67cad7u^BOCwkc8jn1%d zHnf87d%p=9>}H_nN#ykL>4_9Vu=MQ@tv?Op{8E=s37btu;584mTjQ(x@fuTd4q6%8 zav4ifX5yDM=8I?4{(uDXR!qEOq&%Tj!rO{HZ(O*7$I&Kb!pxC!UIOExXRdPt|)ob%uMG zR#ztNkIY_UYj85y%FX7hv9yME-b#r?w#*9S@l6KI!uTQ%G7`U8PeVCcNj}rY2d!*? z&a;EwuxOtdICt(mAM@unn`KmAXc_(1e@`@<16eBr)-UKgb*%Z~WQH?J&z*Y2h8@qE zGZMXV&2Q~l^R+Q25B@~~r?MTp<)%I1c-U{A_KL~Psy5kUXyQ@k%iwsf?%s;wI(Gbc zp2SnFHPwAVru7QWqqng=y`#qD;4FWA42HOsAJ`c79fdKbMD9wNpB!$+k9}8V(K$RF zwHQ5)_&PH6x#ENCeuA-*tr@@nAwsmslK#17`{;d-stZr1cH3w2;N28F#4Yc0=2)jy z>1N7G0(}$p%;0k@>2;U0_~dr)q80oaHmOS=@cAe@m|W?vMA!A|G7+bW0DMozd!o;icW?lH5zT#_N4JFk*AyNn;+Ii6yksrbRza%S*cVZ5Hom z?j`KA*WycSw^ogxsQ8WzhVkyd1psmT(ET98L^rHquQMj;>;xo?^qTMV-qVKF)_O1- z@_W2b!uaupE)kWfa&**k_I~wQYmcv=KCWWh@q6kciDSQIAOj%nPT={|iG)?6kn^#Z zOs^wXf3D7dMV*Mz8g(ci6Rp854U|yzjSfv8aXjtaxsbN_ZuTVZxrQv9`*`3jE^F zT`>H%n#f&=wx0J1vploEKQfIm&XGyQwe+%n*-uvOM z4)?%tO;0`_v6@_4A;YP0Jc)cb>-T=-H!Et+)_hwP2o_^*LWwl@3-a#!p$!TW#)N@6OrJuQ@cQ z?Shy#Gp+bYOO#eWNVUs29_+;#QfuBPq#4Pm*2+sZY_VbVStEAV&D!G%Mj%4t?bs#< zQ<;4ZzzX%RfALva$lLMuWWib=zgTD|kPDfr`j4Zxv5tn^%LLZ)GaQ-$xv);?TT$r8 zY3Q39-C-45_|jkP-Z|sVRj?+e!F=D7r#>e!5|=ej7UVcgVU|C9n49^VhxmvKw76TC z*J7A?a`n->fVBnU-e!TC6eT=Nh2ouPWRNSUXn8m1+Top^*3gqvd$Ve)a<6Otp7SJf z59&?_PIcMAQ#{ccOL4(D>%e9lww^Vx&kC;8yY~vBH4pV14SV5wrR~H~Hya@0CEmG$ zTZX|Y+qAvR95n{Fn?-CP*?B7uSXH~~+$%SK&muw(|9s;QI@p_d;E*|x`ZEE%ZoKqk zHa}_1{g7RNB{{E0-pfX7Uu*F>IA@JjR|c#QMw0;|6o+h!A6aXUY?>APF|W3)fLzAR z(9S)!vp?w0y|~97mbuoS>eQ!CqWEC!U4c94B z6cJZ=9@fo+>=>Oa#wP9XDy!6qRlWJt1D3&F%&yRic3dM%=Ic=m+Q35hTA%un$Fba* zXKRS~ikaNIYsdz5;yGp}SStdfLCRb1nFCqZ&^$tWmS?NHHm|Q3w*un_-taT;o}!Uq z$(rR<9UjeSkraFW!d>36;A?!P`=~XRaPf^ZR$+#_XLewle_e|wEQyu~!A``+<=qw? z_4vIZULqy4Q|tP8gzK?fPuR?>x{j%k=4ADeCG=ZqL{^#k6Sr*Wv6xt6Jgu%qUBmT} z&n<_$EW5%w;H-gp_bfM{T|{_z|l9`Z_yA2Y+%Y`J4Lvgdug!^=5; zNbnGUvRTDk*_`~0&8hxb&n)k&S33mHy^QcmJ6YB`7mSEmb3hd20PE~J-r@;qyO$ht zcF6}8^gfo2h^&f_?^2z``XAhE&z=b1vsO0Zu1HuRT5(!4#9{qBwy1@^Sy4Z%tnbv( z@7N&*wBd}GnK#CbYF5x|M*N-r^2^+KD+gNlZl47?l|Saeq93`8eV#yhRhyt=?EaZi ztB+V8jqrFi=N{9S2-~~p_uebBV~oQ+t7ViJWm%rN#=NUrrAK0d!{@K@i!JMyZ`8~~ zKCJn<&zb`>?0w3Li~UXn5r+~aVP=Mk$_9CO8|^Wc!G4xw8Bgv2vpzN2so?socvdne zk7mqT){fb3by?6ib8t|$jB9j{2w97yD|+;KV*yLfDKj3CA&E6Tdd_-EsgD)Ubbk8Y zT?k2N(PM0ejIvpO!hA-2KMwKLjM*K|#WiE&GsdpkgGn=BTvnF$koVe=R8?3Ymg-8& z_xMIq#p+v>WPqMmKaV-~&I|kQ%UK;t^pNsqH-XzRKCOp%)`N97xo!1eeB9Ia)jYOk z>wb2}N`GQyjdu@OhKb37=MZ%UMpv>{3-t16{@^LCdlapb6>Ue<@ef~1X z?F3hODq*)>%l(zi_%|!*mjmJ~57*dUkq!%6TOQ0c@?mI3M}6h6ini=^mM|s;&!gcu zyV-Ot@mZa4py%yt_eChjWIgXyIUcEVYaM?uOm33Vg074W25g&CdLZGfiTy!g4qBJ| zIqtL`x3eD1#)-uu^;ip&M-$jOR`E|BKA7orw3|A?FRhN7vJc;ujlIGYCk`-!HO!zh*(AC_=W)@ zCZjv1Du^mH+r!dT3?s9rtvMOQp%3i&G{nE?^?c#C;*_Up^_Oo@#{G_0*>Oe$X23ox zrnlFBqz_JB*gSgH+W4mj&vG2=#)PalmDjE?OI+O-%y`dh$GjDbn98RZ!;1~-*m3o5 z6@Xq8w%%()i|i`edj_j{GRV&kX4UlWSG_8cQ+dT+Y}2DpJ#jS>CB%>f2IO5`pG36E zobhtq7RU$QSo;jA5vrq2alr{T9dTucG{%!?l+ZT^%{=pYJ;#3a)hUF{uXu&JShSgS zBQrB<%D3^yy|rx~xWcZ?%k*ZSH9o`0*y9+)Q2xQ^bCqWcv)E$fXE80wvEN9r(|n@A zm-e{Y+n&wzmP{WTu}}Nn?;ys~b#FK(p3zZWT~)2(mwC?+YtNO=8m&w#DZ5$AldHz( zxyO7b0BbzExbjBZeT03hgr0XGD?p6e#e(@b`x!4+Gv4PX2aNCaJ}!|XuiFX|Fk9Kp z7$VDT1y@(IgUmqIlB2_%&#Ls`n>~Td&n@-y`S=qO z8dTRXU+>v|$?mIdQEh$E8n-MIy;{W!y5h->b3UzDiLNn|tT0RY*nX$KXX(SD_dwY+ z1M=hf$3EFR62zQNaApk5BH8Ti{&){DHu_!;JN&LYXX{z>YsbbO1MxaYnG?2q5f5yop?9XTI7n=o@%M`ynuqY^HzUz z?mk!R6NVpU;7ZPEHE4g#PB2EilmX*u6qoGx9gz%Ki<}j%ia#|QO$?8F*pr>|H~zrr ziNG9{K{nb6AWOqLf-AXB{XX{0%x0f&hd>S{1$N}uy^1yV@Q6>wVhX|3INs5M zfytG6*<++6tjAH(-L{5SJM>_YG5jN?#dh~vGNA-*P9QXVa-164eyVBo?_XpUKbw8- z1Nt;8_p3f80fFzZ=m%*MERUXkK;gTYy{`UX+O|fzd)bls_-wyff3oU*2$qr3dgfyR z8PBR_fRXm}G`!nuym8PE|8VVYJL`SL_{fYbbarg}vYmwN_%b&}N#s)uR&vDQgs4vweK@Tqp!Gsdkq{8$rx5;?DV|2WHXE{|1uvaB|S-Q%k> zxby3HN*#5dkHW)GsIUfuu*^B*?(n85eW9#lU!cq-BiEAz?(^#;%U_pS5y2@KHpIYL z!z_4s8W0;ReEQ$_%ZX{n7ph0+5%W|5^V>q}KHG|TST(M!#%%K=@4QGtTm1I-%(H$z zV!-p3y7pxAJonCuhx9%FVFd|zJUcim+!ee2hr9d?CMBaWGxj|B+)q2BXTA51jign3 zH2vwNXN#OSsGsQ^S3MtD>ptaV*Ot@7Jjk?CPoM4+VBth^KUn|U-_@P1dF=ZGs2bk8#zjapIr z4BgJ-QLjj`;u{IvdH1Z|VViduATwa|DW9t+k2?T=thZVii6C!B498JOto5RMW#!S% zdq;WNevuJFHAc^S(ah*)R=?`k6LV8OaFkt* z;M#n-8_eRMyjt^F*_CyxhKNOD<$K-nU9COh8I9>}jUBCWSU$dF7`}Z%<=jWc8-!E& zU_S8SiBKC@vux|Wc*^gyx+P5V}WrOe>&--!g= zwL-Y9AUn#P{o1P@rYh*=+3bG}hOE%aaX#_lPZ{_&beNte9rpq=$k+i`f%oGbSc}!m z@YFdql6u(Lxk@evGy1VTx#4QfI~GIzk0H|Lpr6y4vs`)SU3r05P9x4B&ZKOxAKVj2 z$^qG!9bomG89k2&54|F!z0ciI_v=S`4?}p`1^L_a$zE-XzIva$D(Ta2xrcXb`vhbL z+KJo`eBL*c)c^VOmnY2;-S`fT^NzIs({sNumItvo^BLCfZ6m?rJTd0eCm+unYEb6O zKu=4aH?oZlP9y8Y`j6R1sN;9fhhU=}oM-8e9uKms-g~_tV`HSG=Q^K+JW&6-I-v$#c}PNzdR}^T+M^pn+Ov&pz1J9mTG>w63SRr^o!}efP6_)uvZ_rSntD?r|ik^<3w3 z-c|K?+LMD$4YK6ldGM*Hzd4K!S@rxUO6zyxjbGbA;NF^XdSn-TSs0BZ$98A>IP*7e zWPQOT*kHFRucZc&!w$1t)$}Q|XHI|qf`;ExY?iEJ`BYy{&wLEy?Mt)w`u7gwb$Vwn ze^bUFeRs6g9(S*@mp__B@G|P-u%&Pn9 zZwh-~g@b5$^W+HIuzUYfW6$j;ru}nZb5fPxqbx7X#PFQ*Wy2Y+c(w+3zP-11CDBK= zt~A~&+o<2W_L07IYmHIaa(vId5)i<@JA`|1XAynzb=~*g&K_(3h~+-2k%Z0@h))&l zsmavQ(jILaTmCnvKM1|ARjr;dp5Iq_AOq;a0vRJBdPWB8el}p9S>9FQxn&Kqv)nOP z@3{DLSB~yuCMUA#iQ~Lx&!6Y^_*K2V=9RwBG}QdYXI)=$uMAz-r53Hob^(^mBXelQ zSKm#9iinskGHaUAplPIJ^jnjy`_}y3%Reg-^*Z*jef)j?xR)tb&~pSPdm%+qKHq!(WMjAZ``F9hj{n%&t5x!JWXjR`^Y5^4 zE&HrQBxZoI|AL71uB+viD#pReorzJ}X*_DLa`{O2HF;QG z(|)Wq5p>r@l9V$dA+OJ@k?*UrzC+TU z>|afcm;ZQ4QA~{ElQ|fD>!qG`>D?CzXO%yHd1l3Y z8oyZd)*fm`d}w>poiXjT=Q+n|__?{!aqfEMkC9f%Ms~)*Ug%TR_J6JvT1h^;nZbu1NYEfjw6HcBLnnl0Hl5KYwRjGah`& zTG{xoqZI>JqvEdwx7U##Il4zk{jic5pZPtLmB5O#=0KLT8MCyqj^<{+T|i!#(Gr$j ziyiA1*;KM#?y+7=LV7*>qou}<7vq{18Rs~1pGB{cCQTbhEfX_BBI~T4jF6A! zocG*eB^h!qti!w(j=A{J3|`qU?yI?x5k)b`@vwka(V$f=&T4z*PfoeA&Rh%+TH@yd z_^g)A(40E^o|<==o)uX3jjfI581o+O{$BAl{UZu(UdhhhMCG;bkNn<1p3v`ZDZ6J2 z$MOCf4W30i?sDn3L9&Zg|23;W#iX*;lXb4>_^&S41tcGfQve>ihgJyH+zSy01J>Jo)kHn|Z$5 zF)QeZk!!pU7WdMO>6Mi&-TBz^-KPrgKUdtZEJpIO^KjPG7ShpD$LBeJUf5ah^Lm*^ zkGD~8l=NqxG0(`1QRSm+700!AcaZe6+v*t`n|*AVh3R2c9sPyRc=l{smdUo+ivF9Lc9Fb(**4$)yaS;ix#baG<>(RQDZ!BT-p*F zy63s^w`ZR9;hnt0%>LK6{>)p+@7!kag)VI7xt2L2Q3HR-LPN}C)>d85E;M?f)61y& zW}jZa2~CfeXw;QwkiaP|wXJ8?W(ixK_|6aW*lA^X-B^y8M2`#|GqIycyY|Y`ma!Ht zz)9aH0c*&ZMCuGVfJJu;c6_#T?_xnjUcumwMk|!!#$!FBktyRsfm9rH&|}1`8uqd# zvavF~7#aP|6H;{5mk~Uoqh4$=LQ6d9Hye(|%}*T7jAnCtrr!XR9T-F_jPiQa-&kWj zoU}bTU`P3mL@r@DG_}sifihMzCIfhq(W70kxh7o9bE*`>Mz4j9%UOMIO?>kn>w9)% z-SYIUp1f@h(24N>W$)d3?K-Y3&GXs?)PFc|10^?LDJ_W-$$q1#tF2p#venfu1?pl; zWtwtHVmj@g)c+%YM|T0P?#u%6p^-p6H0q(}w+07iM67+Bme1Hikys#jF8l1g=8A|p z#~kw#u|O9vo_8thr%!oK^=Xf`uOZofUH7OtYHN{a_S{h|=N(+1pLtzgm)HBA^>fdg z=fFNu_o^B3`bj?5>HE@8Na?@!{p(e&ndIwT`Z~VP*VJEh)l={4&+u1`PqVDAlEu90 z-gTw%?u_^vyH{n@eqBS7#6^4+%?dNi6+w1sAAjdlnj2p2pFNYlBmYJ6^_%Wb{-tF| z>Nsyb_qs>FL#t*9lFnD=$p6RRH8#HLzIl(XsMq@M>reeIeL{C6DV`;LhQIXvGTOFm z-rss_6yYxVvwi2fJAL*2a%GQNo#1}I@J4^<-BH6C4upLqpVBW~z<^7#0K$D(zx zwuu{z+|2jDHGQ9srkD}krQ{PU5Jm8L+Yqw+^Lm$jme(wupLj2;vd+F%MxWrT|7&cT z5q{=%&zJr-u88l;SJyjvA3yP*pZ&Y;PG9|ZUtRC>oSgovC3APWFMUNTWdY1S^JVPU zsI-E*7hMBsx@WzESIy`_Eqz|Ik56G;^iIWGzFS^Hx)`rlO@H+&_;a31{;GA>rx`0h z=^wx8pZ@AO<2U|>49^2{9e?v$|JVC?g=^{kzJjjfcZ^c?K7Hly9@^meYiz|U+(nr=z|Gl1C z{ZXFoLH>!Kxj(-4$n}cvmG6F+-p3tCL$CvDg2thl)o1#vdgI3{YQ1`%HG1E}_)cBL zGtWqLzmlXG>Dkgxz0#6QY^=}e%6v-mr}^ZnS|@&IM%xa!V(UJm%Z|y-)VnR+OMzvJMYpv_>A8x$@+^?p;r@mdN&e%2l`B3 zOLwEYo8PT>uCs3oU~W7k(pt^3#6%IY(o-TtiQj`zlhc!y_>QFvyBa{i0&M}I{&60AX*G5%(} z)U12P=Bw}<*OMNM_u~~9$1Sbp6+Xw^YQ)lgjcUHe`Wtu4r!^N|3H{E9dye>7bHZ1R z6{+Jty+>ovJGdj?pWZ2no=e^kG+v1!BlQiFxW|Wbdp>t(>70rfb#Gl~vlGoNd z-Uolvy)yoFrkD*|8`l-udX&5(IegXp@b394%3F`GX-t}BuLP^g9cUHg?~x;29Oqlo zwdTC;>*%We3ZLYk?^gH6%=1sHKHe2SYu}{jj(OsrJ%j4b8mr&KeQOPnWk%px)$Dl& zjlPT$zVB=39``e+yJLJBrDk6J-T&8G%BR)&TIj)ERR<6rghaP=C7U| zUybh?iO0ovMyYo&4(ozElkac*&K1Ugno+Kzx`^&aeA#mND|hYLK%!*(jyx94l1FWe z5K?l5@lO0RvKkezOUu!{*(&`0`8#v#QTs2R58s{FRX&)%&ht3VNB^wx`geZQrx=~> zR3nlV=stZ9x~o0nay_tV{--PRnpacOyuwIl4TMb0k3P>_@t-U5-4@_a>pPmk?Ca`w)-~X?Dm$$Re(!04Eu`tHk_Xbw5 zPW_61(ml*yRbBE|>$WjOzJO2o&U=-3&32*{&|Si{xg+Kg1Y?ev1>eQ^y|qa;sC>if zyT(uWXI*c#E9U*wKi%o6zx*Yy$+pq3QGazONc27F`>C1dFPfuOp60W^GUL3*s6mb2$*YV7w^KUvu+rRnyI=a;FXcW4l=v`N} z%)j(|>R$RfT6=!i>d1Op2l?H4@9*>7_O-^J=J#Cn+o>y#S4saYd4J7SU#uB=rT(A( zcc*5LmE}EH$xkkxtKT2izb`H>FTT9EfAMX7zhD31Y?l|G*XzH&_@=({_pj=Gm-VTK z_1c5_?c4gq<;Ab+?_Xd1wtl*I@!iD>_5Izt!tb|FJ-qmA`{dnv$AkLE)xOx?!@IwH zd{t!rs{Z<@et%fku%tJiTmw1x>u;ae_qXa@-;_Llf1&RGCp8wv@nwDTyNlml{I3^( zQ~&Ol)e_z%AKV1BWZ9e$xH{0KTR5P>6_)*>O*EP0ZO;@~AGxTx2 z`=k2n$2HHd)$ecA&sSaH?#0{n_q!KAulL-&_~7FGn!Atd(|0c3sh>ZtSGnT5lMLVW zf2vviy6*3b8ZCF+WB675#=Ucg52w#weSaU+`?&(2dcD4XS2Ork&FZ&x@0WEiAJqMQ z|9fQ=_qO?9EI+EN{5dJV+(!G0djGwPA77yFFJ0WYxK%pvV*TUmjqU48_4TKZ*D@vH zM#=g~Am7T4D>jpx|LLeeXbSLcZ?zz)momOMP$8P|B%T4 z{rn~7jcdQU&C^SpP4T-&l+y@C@$zQ3ve*2|NP>~h_`_&&NczgQ8aK)tpwDP^ex~qb zcsJ&2wVW*WAmf!yt6tpvo3so&%HtfeZf>K(YrnK5<6RM{5-0VTE2=Vy?vcAdfM;xUG@c zz$hyvEjb@G{C8=d%6)Risxymt4Nm?1FbuEQ5 zlJe@d_AhT9Qz#>=VfE7^y1DT(;h249T8=P`ud>#xp1rzZq`V^$sE~Q~$vOY8wP^&f z2S{3`WXNvD_0MS;{NvLYBpVMhDXrfWHWrtvUa z%oHPFea<)(3sodRYsSC;$S?*qKH( zyqM6XZM4xQnN4|h(`Ch(LQrNg@7r`$Sb-t|%^!N5j5;-%n~&of`vb=VX<71UjEM?8 zE0)#+Bq)2U>sdqydr5` zM%I|wY%ELK=gr6Z+xnG7GF^Z5GUve>$y$AY5DtIS^OoZT;%l-}vIAlu#8a@r*c z^Lk|YpCqigx-2)lHAMbnrlw~qXY-P^W`)xlEUu}Xqx)Xcn1AcBKF!(%q9yf-!)3CYQk$nOdzjrHe3No1{l(z*H+d%3kmlk3`8%hI^dh?J+HyG}j^{Z8jN zZ$0J|M4Qe8-Pm4}B+XtD4;aN7<2c4;oVoQv(pvQ%GsQVc_<$9&VYX=>iky{odhT+g z!DiRq3QNgm2XB?1X6DfL)^pobc0@O7=F~&V_eLUq%1IKJW;|e?n4+|Rnaj#~b&C%a zK?%LHGPrxL%a~@amc#?3s0yOq6s=Oy7qPQ~^!g5{X>?Z@7cbumNJ3gul^vw2C=SMug!7-=8F^;NMY z5A3eGwB5^A#PDpFuGQq$2Ptc$o=1Hc9{vSeRIF*fpBsr-q}G0wl8v5kKlWd&jW~eW z>pA4C@mLyg5>2`?L4YB7mjrD|4(-ipf~Yo@0oS=k!YvjO+#UXYM>> zIo{8BkmTMyduU$IMlvm_ZN^B}<4NLxxS+7@JQ#q4xvrVE8zk)e8M68e(vK0D>zTbO z2?RjOn87%o6uR~qkvY?Obh$MONjWolThYR@b+CI10F;^+yWYdk&T_Nv~{q3+76a zjL1o*CrK*;?Acxt2f&xL#;f~CS`bo3kL=mYS&vqqxSu=>D3jM~WUQ;BQ6=X}_dc@l zJPN?V=6%QKk>TED#}jD}gYQ?}xVt?WTXH>+v3i)ig^0y4KU`b8fM+YoS-sYJ&zZ8! zOg&zwI&YHeqw|_x+5CXLKw6hy+VVWgxZuaMIwLc?zCV);VSO{QER&IpHO5cN;Cd@p zcE2CqGS$(8?-vJPCE99?$mftX_bJWxna}~oGiJp`KI3^y;sEm28oau})rn!5iLtRt z;G3*7>j`W(Fi+4^`HO5kYZ=n-bDR>0Ml(y}ZaJjoyqT`Q)-0`MDKcueUz5|e8TU~P)1nLSIA&ZRhs&j&#dSfQS= zROdeu7|9w}w-zKN!KUV@mr>adB@qEh<8B7eTyABs!X&n%c zndhtXUrFw(tl?VyP+r_#=lUouiyt|ZSAXQYDLHcmWDWvy1GeS-Eo%s#={u-trceP&CMVtWI;wWK7m0Pen*mKzP% zpR-7=Ph@4R5jCFG*qQJGvi#Xo_jw1o$WRrkHEU!qnwv95BL3Ia%5-FSV`FA(z0wGi z_BV{k{DaJwe$Q$F*PN>fjt#+@-0BD|u^jgj7|X_4OX2_$RbM7LP@Is>uW5(RP0V%6juzlvF zz(IsztiCMLGu9TF;|5y)HS6k1Qg&SH$r7-VY$UH9gV}D*0|jI9qfi|djtIgqb2Hyb+P`GUA6TPjX$jk8 z4OVuQM@^)x9U$2}h~rVMzGEsek{svNDKM60Dd~~0=IgnJX&La{b%&cXuQ_Z%%53${ z=VWE9E8_fAR?502jLy21w0wM{_J;72RzB;)B!RE0zG9!s?4^B}Mxf{l290i~V_o%O ztu;6EnC#5KFvk2t-p3$etyI`*@Hx4RxLE(1v1xrvOWLncHj}6E^fMN{He(j=`aV;B zOjy}bA$mQ=)HytGFEDe}=ct+qq%{IgvyVE)N_kQ%khXH^jzzP&jx5imd$m;G)Vd|d z1$SHbUARKailzLLpNSv1kcyxjW(vpiNZ);yutCTBIh?%m~+9*JbI4xRJLvOGN-YTN_hC|xs^ zw0uUha@M>}GFy7K8nGp_Wf@s(L5};doFmM~u(!6J?3Lj;w~^CkMJ?Qa_mZSLJ8o@U zf8TwRwi?E=-`|vGk4QNuKh@Ky#u(ZBD9P(BMLg9tJL^|V%He>YvV~>der%zB7Gg@D zC1cH;xw6)yx<1Q4^{g#tzH_4?a#$;#X*TO;MF}s#O0Yn-$#1z_qa>~Qtj+-CWoaDU zk$@*kXHY$V=(RAk5#l_uMr_a?pahyWj45qp-FuvBz;KKIRWM-~x~ zvwG~V5I9$o8qtaiV(mHXkv^jb&ehvHWM!<((B3XBMY!f_iqA95NfBo!i^)n@i_x$o zf+A(@fU@67%VHd=OoQ2{x)hUGAYLs#0zY8Ah)K+?llCK~*z1(nIr)IO)|IY8sjG9{ z^XguLoMvk*XdYTEJ;>$+K^Daz$kMp77HSE5eHPQn%$B9hJ*vqF1PN%>RaJ)EIFPdT zcG#OqO3L~@rnNK5wx1o-dHoGzk*66wXBJ;9W38TP{!&~JDU3nc06k3(>$F`ay^Uq* z{3D?ZvuJ%w%Tg|SX6#1itFZe$QJCSDibC&~ba7BnBX9%@AZ6E_y7)1gVLo zTs^=8c}&-h+AXDfrRRFf^{=m0?y9;tXzu=X{kdW^u6kkwSo+*~G-e`Gwy53gI?D$O z)CmN_GiB_ulEyhh)6y~&DbLz#?wrJZ_aR^<_Q=kyYsPYxFIlVQdyR7IBbJUH_n6YL zt*$qpfz&yhBm~bFDU(NH!1+IFF1q7o7IP z;`sa18Ad*yKxM5qo*3_CRx#^V((;kF=If1`saz_$jGXaYWHD!2A1lpageUR@ z-u<7>I!K1j^m31dcN6EVQ;ZKLz>}fOVAD(kDcvEM=HbG6%|A~E5l(tNvKa=;0?(*x zX~v9bSy{TOkkcB_k{tQvut3)q7l3gHgM3-f4BT=k8 z`Zjo>#*)J{MKSA%FzLu#Qubc7GaBg;ttf4eoy|Y$iFfPlWur|$DNgzTBS^DaNf=`r zYjipmP>iuwZW>KfeX8W-u$EJM3b80LgOsO}teJl}`eiVEzpM+r$*fHkhw zFV9(4&*anAC)B!c5m_m1lcdfM&hgdtxq+^~T1?t!TM8?r3|rUml5-`$rpVNJ2+vqr z1CXW66LzXyedm?MxXiD;Lg`V7gMx5)B0o`UwAh5sA!V)<%sIRqDkx*L>bE=na#pH5 ztMtz`scdwrJuIsq?TjJOYHmFEOje1jqGSA&)&j}UwLNF)`iJm;?fuS=g|(hNX_j>; z3$^O8ttJ_hO47=28gFvZuO!Xqri=fMQFamwK+vlq$DHkuCs_0P(uOQEK+d|eZRFM2 z5v>_zXUDQ*f*}Y4&^UJ$rfo@5uvs{%y<8fv#YgcB#3ia9pF>7xEN!K!l^4FuexO-y z(&Ly(&1>Rn^_XeN;ekiTI=Q>_9CbAMK4uQg%lhu_T*HFw zyYt$I=FL1&Cqd*QZH+{yA_@!8KxdJ1cBBmNDSnv5Pd)EQ>=y58{A3=Jb0)Ss$60Ak zr8sfThuZ6CWs+FHn8X$p&+)r5{y8n+nsX;h-e&NX>$7#TUPm5aw##{4t{)?cORp?S zdYojtlH&~Tx^p|nbtPxsqvr}tPQO^^c^A6ZB|B$W{=7EwaY>9p#@hSuY+l~_k+$|> zrco0#S@A4wnaD7ga#qSQK~B%apWzhB5+OBRNfP&)wfQ_FS^LRmExSIJiG9gG_I!CP zN&hcNGcrrVvQoq;@id?S*XE}lQ4Tl#tR_5XM^Rp(MztIhutbf{+}0VxmYC2B=5ehq zyLToli51%O!faeETU|S7(R)Q7*{&1ian`*-=kRxuGAhx|WnRUtpa}d2vZuIZrwsQO3IKm*$C} zTdrOqDdYZHNla%~lmi{RTa?4j@m@cN3cC?kfNSMfMO>7xohLYt6y+o&MN+f5D9zYf z8L=P8BLHJqttO8EtU57?B2#$KO?tGk4mPh)j1Vo?0JJ|%gS zb^TaDeNA)D#oC?IYt5DBZS9}QNf9%I>$;nz@h!)4Rl#1p4`o+*#`#w!D-N7V2v-;=sNVwjLl{1G#g*p?(nh6VxH7WFzgqhK#wLvo0KC`S| zD^BY;DnC!Kyw(4wy|UvbxQ4OJeGu6=O_HuUNie5fc&^SrrV;b>Go@xJIlEW))w)+> zmUeyYl$3o2KW#7K=6L(=YEQ=*8p|9%J2#xuF}(6zZ|9Xf7IW3B`iHV!O*6K3fUAQk zKQ4IS8mZfxC9_Z(kA0fhf#l?L0S^FDcW2M+&5~#!Z-X>!)3%e%ZK!6rcKO)vq-8OV ztE<;pU4TRFcUtECHgeWFj&oi)y_1yYh0b(kC9E7OJzL@$^9c{QLqUMTHB^@Ojv zMuZ&4gEkE@kiE4;v(!7-0+Kb^w`j}3Gn=JaWHdB&sXHm&*T zy!B$YYqcO-F}%I`>3Q#zH7}uU>m*4sFZ%HOo?_vFD7H%1eTSsMnuZN8Kq#n+#?$9%f0` zrq3U%an3s{L)luMY$$)3WQQJyx<+L6v$dpbA4%{H$-rkS_5ekbc4IkWP^^gbnAJ(k z0b7JJ*l0Fy%Q$p>v{|g|JQ7y@G6T$MG2`&A4lrM~lJu3#7S~fpD!FduIMBFMB!vv& zJd&ixj%k}MUpHQ}6z9%bmLjO!s=zAL`Q$z4T9L7Ko3wt(1M$&gx~(;~z0|}UN{%8N z+fPyxxW4O-kh#-lukx#c;fpj~Fn=NSw0q%3Ol|GlIf7RZkob&!tE3Ext=DAtH8t9omOChjyM z-1V_Wa+G;;y%5Ry@nHSpn6f8n1#(jPVrC5~dXBcfwr;1Ttel{;TuDj70`yt+X`yz` z7nsq?P8|)pQk?SFlH$AuveLX+685}#p06YdurjMpu(svq4SoT>C}-o!S{ehyWxyBh z?oniTp3&%(Gq{^i@Jq)wvP5^PIxlb@^kn8n^i&5y9zC@-SPoIb9ED^V2$Gbs)d>KM zu=|!>ZBKX}Ny6J0h2*z$)&pzT`4;>n4bat-NFXU#sk#(Eh9p9B{V}2%$B|eEv}$Hh zta)+-NN|53dm?R<=aA!CA=>K;GNPA81$rg3 zr^5GH!_bJFhDpMj3mUa6XYb;$Vo1uMWaC<0e??%gOls{V#oYn+C|P9DvvHIGWWBAw zNyaZ3eRcQK zQjSMR%FE>;Srs&RpVv%UKQp&lr|~~IDpYBJ9^*KYb`QRw z%knsmjkD{5j8i(6mBM-}2W&2rj1so-D~Kxt?M=@e0MM zX$dO}Gq=cL7vs?GdTUqK8fAMUpD@=;jX@GdKVn`a2{}ubq&2&nUK2_2u2Ag5h?1Kz zb&`xaoU{&S+0mqt8QWv!#sTwjr>9sRIGnRWVbv*YPe#F#vLaSGUa=JMdpL_FWMg{O ziloK!>Zg%K{E@4|>(z5-mfA5<(*BXS=aU*&OT0ega}EJJl_xd^B>lal?0KcflZ#m- z$xj?|)iNJfT23RIF(*53;;oAR#hE-7G(LxK$Z;monV7u4krZ&jGGx6;97V>MPt;1O z#+#fm@nmI|PLC#u2S}r~%vZ-V$yw9&rD5G!nAZU0?EMepN{`0-!mt;tGzdNuy&9v5+uFc;}I!egCoqX3Ddavu^oCu_ZiW zIy6A?46U=j%B$26*;3)W%U7s93wG3M<_ieWnso_HmfEnDJ-xIMuaBFlV;ICGR8{f` zpMj*-aAoJx66Aea-_mHUoRX@_8i~DWb|kAmIM0fVmLjytjY58TT@R0Aj5(6_FXoK4 zfz@sO$=Z-&o0YenQOVUh*)e<$0TlD>8M|Yjl-^0sXrGF?a+;@ko9j7VA)=hz zNECbUwNJV5d}SpG3&a)0+p?&sC%ZMKId7YrE3sW=z!*XA{Y)Z(JtlD!SfdOM^OnXO zNg6T7o-B#F)OVs(}y`1bcE(6lQ0veC5Z0gmq^{+S-+60J-q&j``B~ikRu9^m)>eCc z@1rM|%_nRcA2gmMGB9VIEtW>7*9Z@{-)WHb5_*Q!IencZjQt5|Z>pzbi3N0a(@|g+ z&+yx0UIPTM<>c~?I+JKzl`LlJNl(h3GNSZ~_(@XD(aw|A($l1rVPF+zi=o^K>&a2VM81jM!H0WtmBT8BVD`FOtL;+%{eQ)%r z2bOw$KBLi%oxO?=h&_6A2|402vQ)*TveBf*arHI3)!a5MX^m}0y~t^~_!+wH-a+Z2 zRwyfHjiIb_Sty&@$$( zIPu$zrXfMR6E+}JILGzJT)nL_Hv)OiX187GPT@cE#0-u52)sKgHx49>d-Bi01sRDj z5_?onlJJ?;SLHc3A|#FM$xOX#v?;4+T*|F74l0~JpSrzGF27-Eqh8wwB$>PA@Ezu^ z`ILp8L(YoN&e)`7u||x=_T&+zm@RLvt?zYKVn(U4r{>*r$@onVN2TYZ*QDh1>HSX zVP9qcAqhF_mW6p$7*)1IoRwgn#ub+@N$M05M!uJ=oO=x8dN>Q8TXAu3^i+56XW8T= zfJN(RUdz!#;PpWRX6O|Q9M^gQsZ%lv|=F5*f~b>!$b(;p<{H_Q5@@(Ll=8l#oBo4M57+>y*ZPt~bVt^E@SOpLJgM?I_+h(p;Yv zt5a_rPu|Bcj+GDRrI5$mXPDEgkCeI2C<)0fN=6}`ibe91(KzRk<%jp!l3y2O>~}ix zYEFw4^^CEw?Iau9NzPcQo2#@r>sR;jnr%TBvb9I;2_=dUH|zK@Sq1b{dd7-|H7&hD z%7ZZ?)c};6)U4$qV(oP7e4BnckCc5kwY4sbIvUf8q0UsMWx)ef=TaU#i_|_v7mHy; zs-k7Pb;yY^it(fcvvVPJ5)U+A%n~(wAp=^TL{Y9TekMdvoR*9h)^?*Vo;mMu{b)cQbFI^R{!;97tc^4_i`%4R$kxX`WUo!K4;fyI zt&BOk#xn3AHy-8a%+u1IOeg+nG{hV_!6Uu$ip$45Q}fMSmQGUEj`wl>bE_goYb4MU zElz1bjtS^l9it5y1=5<$*lrYFqjT^9v5mA8{HLPa#sXf;#yL8vKy#-tSs!w`z+KPt zh0UhNA-*JkU|yRa3sT0e4(oJowxm~HdtX1TU6P^*gVm6xu_jq`M$Ve!8nMluAc+H# z3ENTh*->G3Y?466#&tB0ET;{M1eK3MxAPjUs|v@Y3Fvq(dQzXev+3^Il#Fcb>|UtZ z>*QyQ)mXWp?KHLW;xW=Ew3a8RBR8#KlCx&hktl>tMh2FJKiK!zYvyt|pzMRPcec;Y zekPGXlE#SII+sOLbp-5n;vD=#vc`Im$CT4>WhCW^_WF>_c}TxcRdcdZ#B@Mu)}*y9 zS7X(Fv6veuki zpD&Q*q+;{Z36M>4!RMqLX@Wf4e5y%`PbsfAG6VZGd(rFTjb!XAFN(aFv!pCgdEdP# zwv*-sKFwmr24h`X7nDI1N5rq4Q_fh0ZDy6#ZN?zqrv8k!Rd_;9!;v$3yOCk1<(xV_ z!%=Z|R9yAcD&^))5lPkm z?T|}*0gdJqCZ{!->-nUFQ#(9!`8?GT_Q;$b(N($DECQ^&RynAgHtYKOD*xQ~pUV^I zSr?6zX`AGF`@K?*0dlj2oVBu(w@FFC!&7aAOYlm5H1dq#mSc=w`-E?4&+BRtoGIxa zk#H&>oMq$61)b`R7UsiRaw0~sHW6J9@GS)0N@$5LJ zgkB?Ot>olKqu5ekg>P98rf&N^lQAz7?xe6&($*-(YjX}+W2Ln-kjW~wvW{~-+-U$*qtWr?O}5ceF#ysGY+EJ^SLkm>?N`x+mU8F>P+nu*r4rlyx8{1%B42 z7k~*~kL%-^oL~gv88^Ia7L`kg$5OwAM<-xE9X9 zXf2XfE*6L^RZ_er$sF0OT6MY)_{zF)ZER*9Rl-&@XXr3Loy%8p?Nhngbgbd0n`n)| z6@F6HDaSPZ{E@br?v2gG{gNVYMaEYh^3IrL{ju0AR;j4ddEXq8u@?Aa&D44NZS@qA zvHEk0kL9pn|J0Ka3v&9Vr-h8Om&IsZ|CD{EJ(?tqdkM}ZLAs1*R<*?S#*{{DBx^o1 zePXwss^ZEs92PsWR_DfoZ{f=F0>aGf)z|oP#IdBMFp{xW))v`0jU)mfZ>$2?LuYd+ zdV-5M2evQd$#G^sAqE|A#SBiBmY|x3=Ez(lr)S);awg1Cnp^1kEQ(Z>`OmUgU4PyM zk+*a)BWcokumlNXjnCXDx6a)CoTcEEndK#IT(gCCX)Mg!EbaPC-25B;J(VTTW|Smt zw8qBCWJc-sW{>j@`82L*##*EKoz+S9FKHa77*c1h^78g|OucfR(T&=0o;k#B*5`F5 zbHI#1$Zt!Pu61OdLIq3mSt(+h8cR#NE-F~c+Tm!~D|4Y&PS&k-)tpMgBYK3w-ra zv%Ctr|D^S=ynmLI&|WZw|30HN$Hti{U0E`;OXpl8kbh=BfKOgRYAUi|ENIbHmAIVd zN{Z}{ujx_9>h!huIvTHX<3Pfgfyrh@SPvwORwy=+8v$I;QL6M9q_;*Ttz44$3SP-h z?0vK2Vcw8}mbpTi_ED^ZuHWZ}rL|bTPg<;OLa$5$6}cudvsYv^Jx}1acy2v>9hd&m%_|)4fl| z(6ltrf3#DdtCm9oB&@N#wJ#?H-ZGxCm-cF6#_b7UmPz~P`s?X^d6eO<$63-D)p`FS z_Kn4KJTzw{k{E!rv2v&`_57&p_la5gdETFxz!*so2k)87GmXA`F|{-s7dEan_WU?t z$}LM#-nozxS;8&!tIzBbKWp!n&;w+xb$72()&powltI!=ragcptR4UjG=Ao=K=;1i zhvABKvbMzTE_gKmWkurZDW9gRn?3tf4v!=&WnZVr`cI8z?M`;}AU77p{ov>MdM{ab zv0Qkj*9V!_=j$VYB&>WOy(V05jh>C3xivvbcZ@T0o~NYUOA22-cP%He9;`3-ZktDv z$C0}JSZz;VAC5G~WsZ_^)o(0A%ug05Hgirn@{`P!xpEre#grJs==EnVn^=G3$iw4> zeG++A$B;2*-}APPggHYx>T%NE#r(|v@?Mea&ykY!IERbUU9LJlAHpmzB}a^PzqigB zoV6E8vrjZJRRp-?&Jj=?Ez24Mcb908I z@f1eYm$EWg^F5jwWpZOd&Kie#)^bwBHo<-5orm-52}|dWUzF+F`_F8w@BN6(mU0RF zl#4HP{l+b2dUDs7o~}FI#Qn%ur8G-&#%z^)pYl@Xnx8E(FK4bP$yTybU=y9CYUY<* z7p{*@h=0w9lJoM)7>yA|n)yqDPHw`BsoHNX%jq$5HP?G#E@__UCjcqRa9rs*%W4_c zzUJc7RczVhKEEq`PU0D(89U)5IW1w;GyG;!hWv^BaMq_tdu1=?`O;xoNz&@M^R=2p z{G6Vvv5IKK&)GbyyT-=jj9ovEq)v#H6Xns1k*s@L)9WD_Tvc_}bS&g&7hxSp5vn9L zO0npSy?L!d%E%$ygPPM@W@nUO29dXONzzvkIE`3bd5lV(ElSOmJgd>LvmR!`%v@I1 zRV+0xY4nE9du02Z{j4Qc9h`)ph*RbxZpqqbLeePXv%l9ouNiVOiy&F2_O$18PH}{p z-srt@{$6qF=!?;U95SoNcD0mzx1(#9}LNn!wU*1i;8JIAQz zbpor?QpEkyG_eC~cn%SeF#2eIPhuw5TVt^EjADN(e>#t#r`+s!4_Kpft0H!e*VOz; zx3bqCcc7)?3u%<uoHD^D(I~r% z2Q{*YYn(&QS~*JB5ri+}bFR{vJtG*aZwBC%Nm-?2nEAuX(lNOu;15-ylD_5eUfG>f z9S@qNq}^+Vz(~oHm(Q(+t}n(c&X>k{dn{}ag!lE6(Vb<$ykvLmfiqXh)w@-N-q)ga zZZ^CqDT}pMOv$+ND9rV-bd6RPu^SC*O|g?yFf2|ebgq^-kJ+}VmhQACutbmXiV za95*p_Kp|V@=NMOX3)>IzN)q1Lr}7{@9Xw z1U;674xm{po=G#Z`2&q*W#5b}EeGUZMv8c`0Tk+b@0uTM&fA{TpXtTr77SOOa0vrn>|Q%~Mm_XG=Z zK<3EhUEo8r4`Q%dZUHYmcHyq`pYEd`Vh9vLpfK z@ADMKC@P0($XeO6*iM!|>nS$M(@4K%og<67zIV11NuWoD6FT{=u{z0Y{L~yI5Kl8c zv-R}I(7ydj34zkGG=E5hfhaR764q|a^NeH7bk6mk96I>|1|4OS*V}X0}c=y zx+^GarMC+MPQ`6-pDQaX>zn37lLZl$%-V^{0#&K9keaT*h->jMKSsnBTBMu7-fvNu5T<8f(qbNs=4LlcLR97qi2x*G7ug zoLzuet=A^o^?rL}?&qt7kegzLMlEaho~q?r%A9HKmC5LHOPT$FDFpl^H|Adg_5!Cugxp z!FSsO@jDDI=kFK`YwdoSp1BlDXbErycq#l%x+X->d?m3!?7-G@E<6=aWF&BF#q#`| zV_3``QpP$-+f3u=b@?cARKsLN$nEGHI?y|*2WY_Q3R702#Y&ku<*7#2lSF7Nvtw@S zS<3#!qg7Ru79>|gSC{u!WG~Fm-u+m69j~9WcCp*pPufOuV-Z)wPbvmM!*Z6PF^Ffj z^<^`;R9wXX8OxaOLbv2qa`T0xH7;x(onz}7(|ktP=vA(djDFsTy@@0y^C+wgnl+vZ z2WUW1{w$ZdKu+k?Rnk~sr zb8E%*w1;G5Wj&%KCs+5{8aK6eWM#o+_8HI-e{w9q8C`Vl)I8?a>l8!lC^yNVG^YJ( z$%ChLotYc=8Cokeb4j#7(%L~cOH1Gc3}M{=$GRoC0@q(F<>^uAdLvgiE~NBX^@y=P zo*x6=Zp=$&5mftTRx82xELIT9m{%LU46C(RwIYDzJFF% zdHpnZvjpy2akuatFXD0J?Ao}5UUem`B_&oIrZ{rZ^or>ETy=~Q&mm=uJhEQgr@+AF zun95UTvrVH9KgLXCvEh|OF7lGBumfBI@P(9)nC?vI8&BsOiwaVWut71?v|8>wVb5Y zD`wy;dLb^i%1hWjsC8-ww5&7Pql<NqKuo7^5Jup{xzb z7YiE{(@RQj6v8vSm@0-sg6#EIE}!lfP?y8VjGP_Jj^h-XjS*H71HiQAlIc}Bl~I-V zF^fsyi=^-s_JWReJ_2dE)j`I1%CVU-)|iw7GGd3a6|uha$UqVqHuqsFHa&+dS&w3_ z?ia|;8{SJN5Ter>g}p(x0;~99t-u=n+h1Q_zopBv8uby#N*SFrJBJ67HO5Zo;D@RZ z=*s3hS>%y~b7t2qK^lkESf^8HBMGDDw|35Y1f{fhA+iDF`FaA!R(jrFS>y>Ngt8-gB8> zX8j2^xaXL9YDbQj`6)KUeywTg>yK8M&cbN~V{d34SzwgS^ym{MZ*d;qE?L;4vwX&} zmY3iw$k8(dRby!_He*Rina??L7kYj)W6UR+;~J$#vz|q#CrYO!!T3P{Vi!*EQPo6rb1zcVIR^(Ik z^bwCFD`jLgY1?NtWbZy5;XKt0S1q~!M$A(hmsolEWn{rTrB@wyWc5tZnz@wf+sXJt z*PrV^Sv=4#n32<%n@NvzOu&+`ov{vdj`65kCX2LAr|eSWn4=o&a#qI51ktZt?5V4d zIeBL_bECi$_pVySw7IJ*QihEQkEKajMxitL_W9DzXC)(9=Ssyf8C4eZb^Y)^vRzrW5sN&y3vj$k}%=88Oqo z5nxaYR zvC%jyM{J3C6ZSizOwS&2R&MD$#waVt2GqS|cGFRr*~cjL`u@|>G?U|bKK9nxb;E~^ z5r^k8XH}Ab&!HyBbHwmIS!94|O5@xql|^Xnb5>^FRpE5RAsO@Y&bxCm*F|AD@;S_t zH95EDtnqk`h{utYu(!!sdy^Odg6>h<%qhz@-OYy0jM)Y-As0j693oHcQ}pbm5e-cf zJA-ffOs}-}M#`yNeHsanGiJ5y=~B9_=&#w}sAE|fSDzx2>p;3KUNlW{zl zMKj5ntB&VjW|DIX&%8cK9;oO0NT*xxlB**=3r};s#t}~r(~vPDjgeClk{BRK;soNi zX$*itjf_^~O0I}_xbhjU(Wh$xw>GwKKEq7eDs!vODvUix>6HMd&S@E9d3?np+{=_k zN343Rm*m$03Hx*0(sK0FoU!INM=v=mm!xx^NGu83!9r9iv=^($S-PIbBP_&D_D?!X zdJ;b|2W?RQj5Q$ZhxMcxtVGwJvHtpb7+rs6EHkIf$&hW1oh6c+)B&(}uLEhk*Q||u z7|mT%c(3R2^j=(@wnJs1wK$0ZFc#&{HL8wYT3$jEkh7kqhd)sCI*u+O4IjDcc3!)Y zGVYS}o`9S#AVK!unFZlp(sqzC?rmVEvRMT^Eot7TG5fW|s>Ark$VK_A;e&vy~`kB!lbM`N0JXe3y^ClT%&s3I= z!-~<`)gs3kyFP*`!_?T4AA_zf{gtNSJ9D752heCMFF%b)sDN zv62r;`DC#QkXI)eG*`+?nLF4|&0o^`;WX#>{=)l}(<-x_)NgtJ(Snk(EI5ONd4;SC zIbB1>TD#1njl9_E%lJLHB3y5L^29l=zd!Xaz3R;=<}7n|u8^|kVp>Ad>J?kSV)*G? znAz7>rNQ=|_64U|SvJp%?ITBHaCbzOi%Y_q^K%T7!WUgnxn8nlS`9{)9gY0|*fX8R zFiFr(px*CkkC~ecfV_rcKQ(6kMGjwlr<9ecyg;FE-XJXo*5$R zO!5?E4c3ZLR}OOAOOp0pE6a&21*Bx=ggwUop1C9@D7(j3r2AQINsq5w*qV9I>mBTv z^$;3()^d8ys&sB&IGW={V-(!Go)}ZQM?sQ$hYfx@FN2jB*}d00i_v(RH6qe@a_f$a zu@5${S=@1RdtaZKa(yCc@kkrv?lB^^yzAF_)C)c4D$Sh6ai!#}bpz){(z3)kSuK8Y z6qb!8)iXHeES#^(%F$J&-T3CL-8e^SPGhZ3*`;dVW=`&b(euR8XeL=J&lnLcXE&B5 zOz^neK{)Dj4ihAEWjF5i&8-;BaIEpWdpRcoZEGZ*BdP0SjZo9M*sfsbSip$Os$l2G zpj>6&z2fpwvl26flv7Xl6Uv-J+T7clMl-R$^Pw5nU(w9|MfQ=jcSUEQzGOOr&RL?E zxU^t?Zd6vr`F7W_*8=b8GcZ{p@$uXU(9(UK4Q`Rd6iLD2b%vMuM0y;|kl18;o|uu2 z?b6+6@=0U;#=bo_L*k2KTON(qIBD6swmmJ+Zs_WLYBbVV)>yufb@y1V?>ltH)!ad2 zFPQBHl_asB-hqgo!60)xoNkxhVSQ^Z*$gW!i`5^k~w}Bb&g8$tM5N&@shKi*=$YD zt+}`+R-&E@*zdOO3L8$m}%?m-s+Px1)iynCsg)y?9geF-Q@mlbEV;=i)d znWT(oLd;pJ#G31_J71CAsgDgZ^W)PeN3WY00oR}Nk&28)50bQX7{WOD=gxR~FM~3ab&t}eM-(>6KdA3=M*O?5>8@$%Z=*snB z?i{;du5LcA;bvz`{B%5_Yee~+&6@`+Ln5TdGIPFH=ZWs0HmPcEk6oYc%MB~^poOt;@0CCOlbs`ggK`&%Sc*0 z_C4lS@~eV`RfE$pgHGOV4fgf3JjLgGcRsECN|M=2j%~5e_fBiF=1aL_Y88r0g_G%- z!%LzG(qu&~Nxxz*Z0=)nBr zY>?LJ^ zGGl+UWBqJLBK?nZ=E^#k;(C%G#1RIi@e@rR&%~MiOcDd+m8H{swVvhXN=!z!i3G1k zTDy?bb)9ob0bS-e%$3jFjET*NtTi0xHiLaYuN`{$P!1+-c(7-{W{P7{J==ta{}aWS<^Y3jJHkY&q7391^soasDhP zq1%#xZ3;PIy5^qQ>(4v?v?f^zW0hU;Oa@_kj%MbZLNHw)UF|HQ`d^aw&-KNG#8VuJ z<(PkuWAyd1k#n&AmN%};%q^~$L6QWbZ&kwZGC6M4SJyqWE`GvoE@RPBnoaOpR(plF zup;U#ARx2G?@1j-%9v?OUmsNJmBwO{chA-5cp<$CVx^1$P33>`{<-?8Gr=`aqt{D% zbNrI*j@iolKCXXiRCyag(uj=7{Ufq+=4tH<@zXy?wv|9dWQ`fC&QYY;V~@!lXdnw# zWCoez4{+g`%_ZX?jRYBE9jfyMS!RlyF`DQ191h4Xnk_my(OTpzUvkzp$s(pQ)BAJk z%ptNiBWZhGPLD}Ul2!L9q|Sn*$AhF%)4JlB!~j|1I&Y3r(qn?R^!Z-W!ld=6mZLR- z&t&<0;3AQJTR@dxVkh)=GO6 zSvp_4=VYF#q{Sm=-2ao!75OO;(pzvCL{1_+wlMC$K}PQSLUYZ&Z2VM)<@zWujx9eW z>jr~WgUnRX7=xvtvHAX-QGzkCa}(Kh*GR^Ex_4WSk#TBWyo1F(F0OH=e2B8O^G>x{ zM$Y0TYupu?#z^tGj#;vtOIIIHpUdArcf8+Cl#Wq_B=hM(=NXIoPOusAcSa|C$!Rci zwnhz(gmO~moT0s9s!LJ`CK=!rC}uvNl_7sP`*?n{=Stc;vPPuztmRe(Tc2|W*5fo9 zBWc||Y+X*v5;IZ;4DFr~IpJF*0e?T%RICFD3A(ntG19EfxwS{ax(_3bl+vb=9jWe| z=0}pF74NfWoYPIsnMWg@hd=WU-_EjhjxvV?9$o7jNTBE?YdemHT^mWBOu{|;`o`$w zj;X%>jA%xgoEG4L_dDX#7OJ^gJ##vH;9U#yYiL*+EiFMP2I4pqhP~!6Q*y>Uh3qCN z0li(%yD`c%&q!LnEJf=gZ@^de3FI_dycxX~$8Z*`$8>$4=AKDp5ixmxY2N1`Vc%7q z)irTV>h%e-_M}cQ1*MX~FjVVb>=g!9r zC|aBx3HZBq(6B<{VmZAMH-_^my2y`W^@(}S1#j05fxLfjZz~&jhBCJnNEmahc@#my zy5H7yr_?y4wc>F?+Vonem$>5;YZUBSqsUphWUY~xCFbUg(VTiZf^0r3XZ5yO>{8Bf z-XE8(-DsZH{6w0WD4Lq{hGts1^^n(v%ZaI`QDy8Oo-1kD9s|j7^dQ@`ze@H^SPs{A zl@K3>Uu-!^`^PVeYbz%5s5*CWeYWlAO5n#jBVv@vW({s^oritio#H!j%N&ETA5-+e z*Uo_CtOtK4yO(YY$=VNGe`Sp;EPD35PFWe_)9dmx#>}kNquI)h zLNfTO9_KU{P;FwYAf0EP_WVD~&eY|C*OdQq-)U|o6y^7t+ukK1Y3oQ*6sCNbu|GGK zHIINL=De`FfX7(u9M>ObD4oC82v%Q`jaZa1atEmOHn|GoDYA*?ENKbjI?Oh4eIBH1 zj}o$LpexTEq$4intXjG>jwFrbicFg+=)@lT)n+A$Re^zwc}PdWSt+2#xG%<$NeTy@ zUtz^zbJ{Uz&yi%>mPAC?z1JR3RuUHCeqXF!+MTTii6^eR>#YU3^)CWlTvuQ+|rC`oIf1b~Q5`bIXaDQ$88{(d=0ZI)j~%qU;o_gBD=3IkZu){)%YU=iGWQ21VU? z8hJ1@n%6y=90F)m``jC`;TVl1R)^I;XO+xP>%gnAqeA(T^eE&rR}Ane0BO6?7_8A9 zQDxB+DRbS-_L-M6Ru-hwX_RJd_%F6@#LRL*j{Hp8!=F0Cmtw$_0}?79qV^TMrs73Z)OB(gyH&Px2!>1WX_`@ zLE36IlV6FkCh9R{xrIhy26GNwl@A%wq_yhhc%P4>jMbC%>{(_?lZC|IA8K8`5jj;K z{nCiEk55rRUeD%!k8@m~J9odG=O`IfpvNnVMXS@;IP(dQB#n-J8k+Pri&|q=?i|-2 zbMkF>ub#=)_bk6ETLvzyTtVst@bD~XX-bWtS7~u1NDu=*x;yR=5lu~-o5zv z;*E=sE-vf)or~A%_c!Y2A65kv2nf_6&)Q?K;qZ-wBHBZ0Y#@2s%qh9%4t;5$f`Y-BV|D{*#^;#?D zSJ(QeeqzqQsySlL$G>t9|5Ls1-o=;o_utjO^&S1UU)DSBKfdOh+qJ%`wf(XrNsh1a ze!Yvko?pFFl0V-*_3frZKiSrIlzq3Z&zjDk)a%QU{VW^OE;f-Q%})FId^-HlEMw&cEKQ4O{!N z{_=O*>#`4|^GPc0mo=x4>hG7^_%G`-&(*&>7oXO@`W9; z-RQ}z;mX3&Z>yew*6@!@m(jb+k_y87aYK>^o4x<3bRPV-#=W~C6^M>ad{_GSLVXVF z^gG_W`0tPZ2I^m>%XGE>v_5t7$>-jxYkpJrfjW(xk6SFYnfG-;_Rm@fcOP zqmN31?{9egb$$J?e*S+-|9?_H)3s?W{-{3B-|O442j1CjQ zURt+dc%K#KqQ7wc2b*5QOCFYvijRJF@tf^#xIe69mOJv)*!F*ZecDQ zZq)6OdvLZB%;UzBs~_CsS>e{oqo6VOE`Cvn_)*0m=s~0P?FE0uJ+5LNE9XWJu^Kd* zJacRGz0&31l_vhzO(S6-pI`h_={0&jV)kpLn~yeqhi4P{5)TWFA8lGr9psfKx(O%e zeOL&H{nhpt%N_OlwL)q#F(a#ftv>Z&i)tR#eH~~m&hfOOHMop!&rGDzde4-F;>4UY zgEq5X^iVJ zJp+epQ$d;Ejds(4@CMRLryT2j*cSFobJpLq@5{rmd* z>w1545AqlfFaEJIg3^D>7+D9pJaXwnpP#*qwRQ%gFQ1h6quTP$ra>d~ST)o+y}h1G zqxH43CSWt&dSElvHtQNP;jl32hozrXDu@x^*}U-ArMqbG=k+RC38U(q8F{a+K#ZvO z5lM~+OtxBCKr$pFZet(HT{3p%_+GBNd%o_I{V0}pWJI2w_z~S>wcjocd$+QEceYjT z_;Fuvv8JzV!`yqd0IY`Y5j33)No%@g;x(vrK3~$QttcO&Y6|zJTp*~8&R=ev=Cbr# zmT_mpYjW9o9~C@h#ECpVElZ;MLoWRC;(x9?L7N-%@6{Etue){auQtj5vfTr@zVTi^ zzWC3ZmmzX(yCYi)!?I=kvZTPE{MZk)?7Z0NWpCBCYJH@(pixH%kmW14Y*D=-1_*|rmcV6ez)C? zY=)CkiK6}fJEga(4N;Lkboc4jUDqY=7K@>GFMk+BNwe!~K)q{HNy?Tv|xUdqYZXLW=It|i;v&t)?)6!%zGN0G~%km}s zYfkcBWgq{(K8Y;)YF@Z_v;K2U-_@x1RC{LRhBNu|hu%NUdav$0(D8%P`HzcR{CubP z`?ynjzvc(cY1a3H(qyga>c+~fW5|SSP~$<1(chn6{At5w*Z}DL@QJ3Qb6=L8(}hC+ z2wE@nh0VaZZ$EkO&oBO4T~nX6v{9qcXS(b96Gv74+3BHD-v>JVx0PFYqwr0Y%Mr_0 z9W@U*t<&V?W-KQn1GZsU-(oHBaHH`WVOrDo7H~CdQ7%!>9yXpL zlm5={3TeS^*v4<_CqLhjVxkBs@#n=#kvE@=52S9ZpHA16x7$v)4x zEvuj=Gr#VfIlGa6T6j5P`WvNrM_l>M)Uo}evi_r=`(N+p)_xRp_swFv?-sxPU_-0! zcRf{qhhKB%+N`72={1+=xKgJvHa@>uxci_m`EtYGFYEiSid~Z%d2PD~?&=>l%>HJ} zh>$BMyT=_FKj8|0D)a`~N8BCR^u1yjx9T%D>a$~SA=MuG_{HK61b&(k*fmRb=8%0> z-tgTn^kM;GA5_KL->+x%)#c&B_^De7i`H!WQFb(ZgfIqV%$U2Mu!lBup za(`nU#FY;!=kaNMLcQAPKJ`uIO+KybKdPU9eWi}0*K_yO(HHpauxQX2jrgRv;zz}z zmA3|0t=;>$5dOS>6%KuxU6A$TS!G1Ule@tbw6hnsC+QwKMGy7PCgNxr$ofbZ|}cSLQc zdBk3O;T`L%;4(a#ZW5i_YAu7)fS(UHcJOekERvJs74%9rrJg5M=s{od9^f)vP3)-Y zyo7etP@i$$&yq%crV7LVu1X%cyJsnP=NjT$rOzLfkJgTw&S>m&ab_B)Yl|z-0DsxJ zO&w;=Mq8q~Snd?7Rrd$H7T2{oTT8a@gecTvvA`2JX@fMYVUh z300esS3g%#)|*cxP;DenVu?q^oZSDjr0uRceo~(QohSLb?rPn0328h1eWy@;#d^?N z=Y-8UjZX??=`2;g4sE564|IO7bdo+mxOHnRnuxtzmQ|=j>bttasQvfKqO7O)>eHPY zob?-y<@eEPOSe_Wn@7HmefLlI9(JATxaZU8qP6#w?q1DQ=67=)x&gs(^@W=!z~B!) z?GrP`6BdqqojNQy*Fl-6)8{YfxrXR2-JSHZihn3yr@Hs7jb?g&#R4GpKugB|MXTvFB!q~2$w!RXU^4-1`fo$GJ{DjGiTIcRy$Z#iW4 zh8dGTF71C*aUD4f_b1)I_&@76SaV}6Co9qW{QG+UgDtZ?vg9$}LG}(W(q}dt`Hp8N z0=!vVKsY_0_tZGOBJXosK5wl73Z?h^58%quVSZ``z!?k2X-_`q?7--AVYKUp?^V?Q zR{dA(-;v-xX9q_A<++WQHtnXjdDL!l81(r6vHqdwoRLE>k@`l71c(xOmHm()F}z!+ zC*V){Vd9KBloxU_p9)nYzLm8eZf21{XE#ZqmC;1 z(_1CidFkj6XPZ$+{KcjP%3Z@q6hHR9Mxi!3G; zeDhVAYjW1?3?O#AQ#L{#kX*Dfdt*iB`|lHA$FbSau}|PxsgdghS9JTmO}F2A%(m45 zf?n_QAH1?>FS3D^zeuxPBcJ)U(Dv7*qw2zgSyL;A2Xi6=IgZ~H;-c@?JnHDpz|r#& zso$-?firlAt9w4!xlWJju}k1bTc!8es=eGSGn;$O3c11m zvW>w!e~csP(z{(T@vX%cjxN1t2cun0KnSKh1tS21h$vXRMdt2i^B})<%sOA ziU1ukUKL5MnvMjWX*S1;9~EEL9$I#QbD|kLuzp*7nA3EWy@2hzf9bMvBL7_2uDyw7 z*`PS5>GM20h=%o>f}?|DIgdH0?} z9~w-R`h&7QdJB);SU+2T1`7xA=?!7OOC$Yj+beoP%eRHjcn5sKi0j-lpX>8SI30=}Rp05+q55oPNt9=n zg^V%f$WiwB5WTXu99hU(^T8@qY1dhTqlFwXB`AN?Cynme9+F#yUScra(*cs9k!ITa z%!ssm)ndPY)p|IRw0q5%w9KQAD zr!&v-b{ZV z9H(cca&xO9C}&dMsGQqdkI!*xmVN4k8+85D2{*jHMxo-^FH{@~;~BM`bKQBeC0gre ziE%Qj&n4@wD4&<0GbKMP3sGkj&t=p}mFjXG_jA#QqU)pi@K`d8J`>ING1e(>)R>O` zsAsX_4thz;U#pDAYo!gp+>jKszluEz*H3Bx)wm8v0oUg)63)DNZmYCY&Cza0x&+64 zxo?&gD0f6H9sSm`K6Gv{r~Nw5!Cqe~_k0~QB%>ztWMc9(uhc$_kDq+<7hC7dk@tRj z^WOMi>G9plzrI)h^u&XapX{SUq4nC)C;dK+*6?iYr8G`*RxnkXe=6MsbHP;3&toS6 zI@;MhGZQqF?h^V#zTGM~p!c_R|FDynpJ*i~yK^=6uG2}f=Kbbp9kAE_xq^5=AX)qL_I>`dS+_mPntC#b3ti~l)xk>OwG ztVlKkc)L(cSpISK0N$z7H^yfcoaPwjB&TbeYh=px^-Rc_d4F8%OZEJ#dM>Z9_wD-G z&te*@K+QUg>hIL7{MQZF6-!bdqAvjt0J77!+Gi?!Uu@^RO`hz_&dwv+eD%2^gfAMPmbzZ@LrTpY(0()m1Ye1gz_&9=04T*ctmJ{PP)Cl=3@ z{^K<6gTJ3QBjZ}=+m(5IziOc$lunZ?v~I6_+`7H@2#R9Y*i_8s)rw2u?=$+pz14qy zU6~XrKOfZ2vop9X}MinU0K$E>6D{d8W2%;L=T zh3w>IK=+Z=_kQE!M4*GG|8N>llu4$YQ?K8z>XObVRHp#i{(UumwFESto-R%)oHhRS z;wtoGaU!x$fz@}OhV!Txin$0Kj+`h#e7qiFm6|>FWS4%(w{Q>kD zj7YA%a^F<_lO1aGwtQawF!U7ijLBx=?1j^rDB2D8dA;-FdKWd)M|DN|U&hmt@0LZN z)9(CI-{UFWeyt(_&YBo4gPyVnWfhzz_uHC_gO@+8yd3SOdWm)ud%j-(?`_(xK1J#2 z8dF}S#o{$rF%?dAWnU=rtZ7L7dh0Aiw}}(!^a7pH-+!(S0d=Aqz3-M6QGDtB{OI<0 z3L8&j-~>ZZT{|}|YeZ~%2C&*=pFR<`9*Rr4EaJR1a z-L@NfJX!pQVIi&SVc4cF3uA55!972oN^- zxn|fRyoTOcJ>!8hR2~+8xGZ1uUD=S){Z75gY2sX0-Rg73@Xq6if-Azc=H2+mlN?68 zeOl4ml~A6C)~5uiTT57cRi5yw6S4ODDbQ}X$hrfcytR47aZb>2%8C&jUiz1vvI0K4 zTB&CTzfln*C`N>5e!Q}Y#^-&t2c0K&n-QI>QO{pBSUYvVUuiOX9JFKN^eM?kUUn7k`!oMt=!m3;KrxG(;)&k}O(_N@K(2z%~= zHK-dGnWJSK)qJzJu6rI)s5wkF3MEtGEX&)4ysu5WLd99u9xLngK0jz5uv!5u2it(> z@Ut!Bk;T6cPgYaDGr6-^JzWip) zA|Cwa>E}0OhNauDSG|WPK)`i;PS&5-?Ult?v)7na`4!GdTu;k?y>#-jqEIwdoP<0I z&+9>ht=pWmLgpI|g!b}IWzb>!oNGuORGR%keP8$flO53CRYS66jcnyc`I))y<8#WX zJsoW2X=W?x14pmtT75^Ud*)&MK6SR1GUsdFk*lFY`<+8az5Y1ouq#GsZUVZZ+kH+O zxH;N)akp5*2llf7qxb< zOZ@Yybc~-jtJSmXbj@dN@AAu~U#?}&&o%CB_&zh(D7~Vw|8h!`sm`!FXx8PAwmB!$ z2fHBe@|*ezwhepu!(%qhsrl{=|HBi8!b$jWcb(btpw?d8`}KPF3s2rfulc9NR?r3b zjlN^8W+cy*CBOIN{kQ6hs@$6i9gO=~VBD^0zEd$7CzI<0sqV01=kaM=-e(T2=d1pU zjeyx}fA~A4-OgsycjB`us8L$a-YT8f9x)=ww@aJZ2PSJk|9@W^uIC^-zVs)l9`MYc znQ1>)5i?S`!q*j_@+tRW_>&)2>;Vc~)*XLXJ1zYBajI5(ho`g7DWrv?T#f8&HpF^; zHRi8bcjeH@IfL!kSflEJ?f9D`Q+VFJ`=Hn9dT8%(BaeL*wyzp(8`yVh!HG^kJLRZ} z9$J2WEq6_HW-#i?vbJ8Op$buztsca zT*_&EzZ&oN=T@NSuWqp^EN0aCqtEu}v(*eZ7nIE+a@M#soD4b7x7S&TuxPW8HNy1k zSJ(6RwNEsh69}nsVm-~!sZ!EsrPIoZIbp27seg~2M1rz{uj)0jV^oe_uDpxm#1HBf zp5n>xzV2AzVZYm)O?k7VJ$w=iA2pt*xyD1CMjAYG5;V@5dX)yl+fSqS9;3;tuoHs* z?$$HsH^>xfH`$etKi``pTe-kDtmXqWPyRLK&I$FZdIf zik{$NMuE)#Rwz&QT6=)d)Hh1c$&WwW?t?qyREkGc?V%Hw(}JYu`)B;9@8#iE7s3Lr zVlPz3c<#lkPb3_>?w_4q_tbTy(f5jf|FZPy&bH3Pon|kmvV&;!x?95UcOIrYaM5TG z6|LUyy}!RbIpz7%+viJXzb>7nnh7hX4*Febv6(i!o?0gzg>)P8WZK`<@9&oWzwqQ; z?9%^gvx-rtVM;nt04rgCG`lAHEb^nm`Se#fso9*uXY|k7c~us0&p`Z%{f;-hfbu1J zM&g0d=+42n&&9XBTl2MI9h@aQo{VC&JyqQSrBCsZ)4T&#kEf^Gil1AnU#opNa1QqM z?D_WZ3aP)?o>i#W6Bcg7)=3g~>K*qVcOpHgD_@rN^fL^>dd@oF`XgeGITZR_*wgd! zlPllbB$7ut@+VJs{=}8bH#hBuS)&DLU?Z?%$7U4#h1X7TlhfLb571c>FW2``yWf1m zBj~S!RsZVZPxbZf+V@~R{)df=z>~=Ul5JrxLq89Nr&Rr^J`H2JN{8EHx~WB zxAm>iTYl)W5%lToHvy%@Ki;f84P-{7L1TQlXA{6;keB0XovwAmOSYOo+3ErW+iuNn( zXZW`AB>v31_3m#gn&eE{t1N(ioSVhb{2A{7dbHWqgL?fq~fRcsz1iIW$L`H%rP@QiNBYAFSs&GZ>GX{KD>FBn-y?iu|Ekl- zfjdz1fi1O8zjyJE#adwPJVn{(Z3+ji-8%8jdz5w78#!?pKc8g>vfumOW+POE{;B>B z;~u5`ZGGaOw%XBWPd@Q>S@zFL{)@FAsk1NIn?&9Qwtukprx=qkOOYNvc(Cl<3|V92W5}se~z=@od5YgXTj0eCk^Jgg?FomP*wS{EBy3s zdg1WO#9M>czkt&`;b%P$j{UKp70PlRgc$?56|ncR_!_wua)U-;t~0U`GBb?$w~x<7 z)X5JT)4Pv%fR0E#X2v<$0tV8#$b*4AI}F72%=xsdvD51GUV1Z(tFU?PIYA?DYzzcO zK5~NNysP89s~>8=gDNv*TX_D%I~7O1vtj0}@27Gq=sUT$tMq;4BIrBZ1uUQS{loIY zR2B8)2eRnw`?>$Pqw2DHWcVwmCwII^7Z#jad{`NCaR2_r|F`+|%lZWQ@>hm9@h{7l zlMCw3t0Q0jY~>ca^2z?>_aC3TJ?6_#@4J__8{;_}1$NN9W$kf+d6Q4k(+St=CwlvE zt6V36<&@!#t`%BWDyY)>+B7HawY z?;QKlQ~2!k6tXu)+;u)Xf7a_2ksVQ<<})BW^`#l#(Q7g$bQR7hew?0v^kenu71=#& zFK_t^SjwCigi|yIud!q6_f?vIij#|@yt;I(99h9*kI%!$yPTXc$?CXv-Js)hJqMI+ z9bfUdb^NM|=xP;WCg}GI#Uf@5Kk7MuD7N)Q#UIx8BTwj)?X30RCr`-J$iz$T)tqwT zth%%2=<@sP^or-`G~FzmAOREVO!vKF&^mLL?BJ*Mo8rc=%ch*cgkyht@qZV;<{Uq| zSjcbs??11&lf6AepzNEtnq#v&di><;+oyh8pVCvnkDATXTeBfkCw+Od@+7At$J6IO zC}zAWgK~<2yt47@^?8EMG1KpQM2+fnI?(xg=nQVcINq)L&D({~_cqiUqsG(w<&_Ot znT5H?%0%!1Jqlv~ocDddav)$fXAg2l ze(!5&8~N2%i3iK?m(=&_|5ce0o&ifIK=+dznUQBFGeYmbbo`Uj@OP?Gd3Vxrq4S*M zupaNTAO6eAKkyCglp!lJcSwCw+U+MX+%1Oj_2YbB>-oChl07#(v+DW!PZt%ZZ_+>e zcctxQwC_FEW$fWzy+%$@C)th~uJg~$VQ!apbFF4I$KK1QfA1wvjF)cr+1#wSvm)sB z$}iAhP69u58n|phUwcP{bo)l>Bs(AGOm@pX&ICWs1gD>7?m+*3v7+}}&L_vhQLe&W zYxC)IsnFz=qbU2Kx;qt-k&Cc*!B~2n3Vvj>&y~&QbPvapcZ!?7Q{EliHt$AnR}O7W zKZWO4={bA^);;R@o2BEN+(TuNN;~_6^}K>l>vx`c+?kP&w(hFS%G!KWyOF=G>s*!> z=;uk@t52{ynLb(0W78+c+>5$*VJdKJxY$d@YuG>c({053g?*f2^bhK{BS-Qy=SWh-DKZMewFsEzphZddpSk>r}`JD$9AAolqX`}96b=dn*Auo3$dlJow(W|JqO zUxYpLBW54_E03Cta$yg)p5^QDY@IiZ=jC}M@6~^G{K38(b)}&l1zMX=)oQ@+HNOo? z>%1PFsNAf8T{1iekiKm{w~`DWPhI8&!QLgz^Fh4FhW*3zNYNwseBJri^%r=9`lFoZ z;M7<#5k13%*DZPMh9awZJOPjl2pLoM+&w!PKXsR)-|QfJzj9+~C2*mt@r ztNm*Ig{=0B*l*OV>N(q-Y2v-?@LTczpVy3kv-Rwe&DME>oY3RH^W-Tw@m2auCm$N@ z_unb4S6vfUf3WDM`E(vV5g7fQPc%WpT7R#~-<>|wL1=zD7lQV#G2(Ha3D|h|u~i+r z5q_xM2(N57itc|{tmJO})5%mL&u0JkzFs4HIK^6o-fMh`HL>@BNOI-d9~L@)R{uEb zlKjS_!g5af{%v{6FAJHCy3`5bFb|$oA~|WueD$hL@NG`)0JPX^B(@UC$An) z!R$QV(|LxKcB{i<=1lmk_bVT7y}v4FxIeXrJPSOAd^i!QvmMV>2Q#@8J+swkspd`lK{<4$e82t8#^>tMzc5mG6k9pL#Nbmp`x)F&R950TNkN)wIwZC2#Oa@8a)MV?_qe-p)^NQ^IubRuo z+u!Zp(SPF{rTdSs`RvvGsl*$z$McZE*k;>T6Qe2+n?pnQb5Y=a2pK zoKnWV#YC@`DwAOJ>)Wp5yY(H6o_Wa1l$&i_RashJSDr;D#m*YdQ(IvZoY&1Rd7ior zTV`)NJ>+^mx6VlC9cCk(Fbg{&3+{cI;}c%*3|Hkd_6cJSQO|bZqzYg4$RR#EIYebD z&~2W8dGE>2%$a|j((UmHYufv3jbHVeYmpbHDl{{XH%kAoQ}mOlk?IXQkiRHh=gIVr z`?$ZCw-}F}t%uuwW3-T{^4ImxZ3-r_~{VrCv|&dxf^Gi>%b5XF)6>+l;GIlN`jpZ3`bmww)t|*H+#Zc(A!6I!d#}hKYdmLZ7*7CF> zy6c<2EKPs2{^@*sUhP>2%DbrrOR8=D`` zd5%-e<5qDTw0k|tgl9t1eeJxoPP^pvVPo{24M*9J#?v6lYv{@HdPd~`RX9r?@Y}lE z%VIS=wcDTk{%7{^%zMu48TY6iXZAcRIXzCSmZs0oJ9C8*O+S^N9(%QCP1o~#ck{{1HJ9ZcUP`lA?mIg}KKPd+O?#2IJxjk@kWG&xM*H=`>mgsZ3y-8{< z|D@2EYWQyomoH21{mSWazC)jE%&8?X?KkTkoI_78`}Z5R6PFsj_1xBP>y!7lzw)}J zj2s*W4rY%$oW9?Keb47pKAqWVo=`Vqw$3z0`y4Z#%0Q11=8V~^9)r>N`+p6u$>{u{ z{!>Sv`>nN4QdLN6@7*m9ROAV}QT3hk1JO%#n&o+&9%UKRQ1)k?8{OaOQ_4Vyxm)1WN8z&=8 z_Xt^jxW@Q|1acgIs!#K-t9bUkV%aK`_v910l?8;E&;iKK zu+QpevVwGPlLZ_j!H??ibP1{(>Sx=hILV5bbJXioB$}e(#2GzHH7}{%{ro$H5oO z9fV_LXrDomFBqA9djr`>`vY-)?2vppb()Tp?y7~75Gia~QUufojoI7}& zIOSasKOAPe!ui^U+HXDXGMrh>_tpCS8C6^lX0NA}AhY#e{ei!(46)AK)oJAV3HL1NJE)td2~jK&bOY@YYGEIhqjoE3iTdU$$wJ#hA< z^?E$(a;^n+9(=56?(^VA`8~VFPF~(JBJvW}GC0U_&gJnez})##RP&_KuT_2iiFryf(O=jYaFPE6xGc`6^zSEh>|Rk{JcDeUEZ5_Y14 z+uFqrUxKq=)}8V+Ku}drPa|gJ#LT~|s^$w%5PScwxxV>Y?Zz{@e_U67v#xThV+rbf#7faD=ZZ9g*FM@D<> z#Qi=y;@QO|{hiMO9CLf$Uw`*|i@Bb9s>rxBQXeM)9=k1_&(6k+w>M6JZ=av~H}Yz# zE6#e1yqZ2%zuw5qEAy+$gsAuR#**1Pp7+;J3HhKH*MZT0Jw~HvX!5hUy${SLF! z=l!vtvb#-2P3{b}UbQB}FZ7(L#%S^$JO|eVYu~GJeo7PdG^@7%8qc-6wI5B z*>@`^(hM4Y&ND9O9@yvVJQkh(##pJfvSYeWk~;R=j2iTG?zhn%M%LH8fQpsIEM7vF zRc#^PF|v)h7x36;c60{*P&ITtKT>-C&UU_uFno>^*Qn2N;)>RKeSK9iB0C4ji11ru z_}hi8oT~Csediqe=j-QBw>$?~lFoyWnfRvu(ILdnN&LrU^?h?<W!j?CQCpKr@NOjH&3 zZT?yj{Ip_t&JMJG&TE+@f!_4D@-yr!8q`1Qy|q8<9r5?`GlY`jjm9|@^S*u(rVM?j zcV?d9P*Q?NFYBElIx(*crBrxsmEV1PXGnFh=Iis$z~73I&+&Ep#QATHI(Ao3-$5BX zIIPE@2C}ayFlc9qD?FT#=rU#w6>~DPd*SxlKlI9&a9`uQuIk{7=QGd9m_@%jv*Su-4-HvGyoOAl z{b_GYO_caQH1K8Cz_Wr`=cl#OGCw_&{4^tajq|K`W`0UtiP;e?&S4cJJB`_GLurYL zxWR^wr-n!6vYpUf`@5&wwj=huAMm$|lv54@>Z#+jNFLL<2YTNhz30RuvlcnG`(~m3JWDiu1&4Y5~dK#&9Czw=MamJ*mQ+PLSfSv8@?dFJR@ zOxb)S<{P_n{3qAQpW@D;V}^eN^z_#IH+1l2*TKO!?3mwg>l+ECF*gab?*^{<@>Bug z`b<g>Ld*1;SeChfp6;2LOY{D0k}7(I~eDQoBN z)Vdu07w#NcW8W%2&;IBtP)%!jCrlBiqqC8zAa_*rv$F!EI`a0p9UkaK=V0n0;X2Vx zz$r@Z8t;ein!22)Mo|;Q?~z(_))LPPyTmqoN|^jgT?JHA)$``C;MiL_VfC{;X^r#4 zIqF$7mBFv|__|ouYjp^7(&BkUgLAsaP=AT5kD4MAyH=$F!zqZGV!LsHPBNc@srqb| z-ADLPMCNPmRPm;J+sDR*;V=1R{3Regx+C3jvvpWKPlhv(^!X}dU9EAJ$#w9G<1A^j z$sI*h_zIDp_`a@p{=UR|qBn8<;3&SbwfCuFFniz4e_rXC%%vx)qlaHUdhRXFbl5+9 zZQNaI?t&kLOd($}YUisIxj`BCXis|G5^Lu!o%+Z$LKC^?`h3v~dz_oGgXg|(?kTT< zsD0eko}pWBD!B&quCKoe-IMAzkNe- zcVA9BGSJ8b;^*4Z_n(yLe52qS_WX5W=;WQaOTsI{EEPWC?zsD$k$zH~ zhQY6|=o;J)>>AwA^KcqECzy-zo@d#wi5ei=2VTdu*_$H->sv3+bNu9foHV! zbDxGOoAGJr<3CrT&I3cLv((Wc%;bt!I^W?O8GUG>_?%=Pn&)=RVVt`_WR=Ik__R08 z827}I*3&vrK2ZLJ?wCwwKj^AHCyjD4L>R*ZF`8Y~>~EI4cJlRls%um(t+hO&WbCK)IjTZae#_}Gy- zYM<>)KoA-H&U%sOhEZ7*>hxBGlB;qo%o-Y4_|SP~TTC9sj32IF9G&Cf-?} zY-Mom(WCGo{z3fF=GuGGo^H#Ra;0Ql=^vb%Y3XRa2)%tJ2=rb&jM}Y-a8Fqqey9U! z&g*hvy9+%wl#v0rEAr9We=4`bv%;hkd@i9t-_on;prmsWCH$a#C(cJ*!{KjQzY;gh z!J(Vwxn4Co9+$P_5#|xqNqi++s^hpzgvz(29*G9x+WNz_e;4-H)|ZtOwrDUtfmxUPrCPa2`#|}?4`4pT85wo<)v2?y z{nYW8$skvSr#}=dC6ec+R5~6{5e|~)y(3`AJ&!Gx@w`$!kFD*@je03uGFcn9-gA8? zVlPiV`mJar+n!f6F1Vsp? zf^=}m9l6~ioHds@q{E^YagaWubA2=t^bgKY;(Tln=4=nmZ-YiD#){ zPdgMMrcd2eW+|@Iqyh-msV=%RGm)OoJ8E3aIy<9SenwT!Ge#J7*U%@>O5*kY1r(s_1>cw|9Wd^BRd1R( za(x~pb8J=Xc54kiWkx7dpvVT@r4vkn4jp{iW(==|=Y3t7IcNMW;#o`rgx$b+*qcxz zy5}T#$1m#daa#Xn3rSpKaFW&GBvEa=T{_!04>@Ue+|<+LqxJ&2=kiP|BRwl2>cecQ z%UmcND5LdlWq@RexKQz2$KH=%%bYvr^sVbzcu|SxZwkse3pl;u)|qogM1NJBv-=&o zVL?9>J@E4*EZ@{m^gCVmQ)Sc1x;Z7BkFoJ1tAWd!Uq;ojb&J&Td&;kk@Sbx7N9msr z!cj~5DLY_vy(lAgSd&{aosxaT#Aj!OVEj{kClF4zF*E$=9XPF+PaevQKO%O%0#F)OGOgz;#b1=W=(!=%q7&lh`(OGK#=<=( zxds{{X927elWWFOBc0CRx~G0mEXSv2RBx8q??=7c47}Y8@_s0XtM`1}48`4LEy~AM zknA`ZmGlp(q%&>IDBe|^zM&6KNvoOmRL?dKnRi9?EX1)I6o1mi>Rm<8C;G6$fht1O zg*80W&JQX&+3g6w&WXZICH4#xlo4J}%(up!Rrb6-ia4Dq?k`>(tF4CC9g{;ZSrxq` zDwN^!+bMVKx}G!D_#BZzI~C4!`SD24V2IXCr=D*7ZC!plsusdX;M4nJ(szVPSAyG# zfYw0ZCztf>-wE$e#WUbAFLVVs`>wts7Yt6qEF)^2H4{0dGxb706K5;Gdq;{9H7%d~ zExigJGrAD!$xzFgS5i0kZ*}oxwP~k}5#I9;bMO99;`uot9rlg>R@ZYjg(PE?{u$#5 zWCcQR3G1-tr-yu;SifE=cud4(##N2r8mVyU+JCZ9vP|v_+ye%mUS>XxB4FgUUA)Ps zr=E~dK6;G$@wo^c^>+A8>V2cbanvAxnHuC-X#qw#J_}qWyCvEs51E^B>G<3;>vy4? zx$vBv#5lSGjuO16C?0TOsxs^>X9vwc=@U+pTHakn_?^NXI3M5W`*;Y`D}|0|2g$1@ zV&h-=m-2|&3!B)`<>M|eCJ(Oy&xrbCyOqW`2CvhY%p>!U_Q>Wcp5NL}9~t{-Mx_3w zA~o@o23}>YF>?rn~G9CV@{`^w2&|uW=a^PqBlkz;` zHo7)CHTfXwdBj+1;os}kJZlk~-c$C;?5T5lEi=C3wfI@TD9*qGJvKTFmbb&e+v&i| zRiXEes?_y71#sC%-cyGWdS3IJW7PKb!QB(VXbt3n?CpJ4s?~Tx9v2Mr*ke74vo$pi zPZ|cTFc7*SspNRyv-@oD$gb-HWYci~`g3an^+>n~|6PRl2W$VV69?9}HOV2+{)f_a zF;KqDD34yoEBeiXb32$bQcsm?c*yioN9w-5?noWl9`BV%zaqREc_4RP96OvN?)pN< zrfwc+BSuq8gp0eD&ZNuzL;r_)H0L$+?$@eIdUoKGg}5emk6QX_*3xk(nT5>t>4MiO zir}6D1mcP=1C(SXsb#$bC5hp$hYt^19&bwcbJHkn@H!we4*gmBZEWOXKkTDMTB;)7U+I+=%Wo zMq)S0vpuVUvqb4Y^w2s`UQusPLhFbsVXH@{iZ|Ww6>Owu9l@jfjsdd~w7d(7jWrt? zs`SwAPIgxY`C71RX6~^s1J$6`?xwhPY@UC-*Q?1p!7*rVtKOcsXMYC0RU6_Rc$KVn z@O4(aWBvyxn9f)9kVpEYXO>Dh-NNZT;>uhRU6ZaCo<~1eOjpgj#IC*@DhYZF^`^_k z(ZrsO_|BLKvMMt{yfG9OyDPli5#sG-s`1_q2PVT{t$`p?&yYIaQJWmlcz!G%j*7G4-IWuLQ=Y zj~nAX_Q5rkm^t1(yiDlDV~5?x*?RKObNcHe`)U1wI0|r>Ol9R$9shvbfaT? zK3c|al-AFcOT1Ow_B#~-wO@QxYa)Ih#|uJ_p5s~T1C&23p2VJw`3P zRwiEPG5WmNZ^y0zyFbV+->Bz{=W_*m0q~{XF3-xI7f$zn$w}cdQ-|s)@vGPR_(HwA z@vig%UDUNMNIm)Iqen*%OlF_UIrroIQ3bM{Cz!YC z10VAwN8Xrc=wy{{Z!RL5FY1Ar^YEeV_1cGHd|#g=lEbiJC9ZoWwnrDtVAUVuu%>I! zteXDuP3hLX<^hLjGd^ZZ|8_>_b5!niKG2I|-S3dOCFjS1v<{phXdm>E2Omfl0;hOe zbZWX3@r=VXrWF)x-3NLm)2$cxB2q)WsE?e=K00AmrxWJ9ezS9E27|$qr)W0In18&F z#m*3!7U}oONIdX7`d?nEhmhLx$>oWt8!!tt)-lQETFHq(dEmLv`yx-Af4r|KTD`Nk z`jakC^p?6;YyVv|WjYogs}J1Knv5=THl{Dxk@t1U0LcmODW*HibPc_p%XC$-o_rDy zAJ6d=)i_DDkMD}=8osT-vy7EaX-Z=l*luOPCOWD`f4Re(BwO@-_oG*O>bO~(hdpM@>_MsP&L*{#2 zDUZ0LiVZZ>*qL(;1FC;!UgzoU{JSyTs_u5YuUFv~{7!!(ILw#`9Cg6u)U+=MX^!*l z^fG6g#Oyw9`y9+oQ1vtW^Te4T$}@+rMjDlsF~4kdkNq;;W9(I)%R=eEF{1md(hA|U zZUf5uyfp3t(`oG^|GaiMJ7YNh;!bhWOr1=Vd-ZkcE4$)3o?z`Q3qZh?p;x+u6;}U->PDHQM&|H>TbAk05^UU12t`Apy z%GfpbVk%Y49qz>DA)Dwnc-$#UN@`zyolE@?%Vpl0B!zK*CG{I;wL8FW>(93Li=QjIY>2|-l3?{mq1y4;YWUeBJmV@P zvNJ)=dr3ih;JV)|jf;k8e!85jyvpbzTa_*{?!1o9w}qt}`t-yzYln0E`P~TbIXH}j z{@;G*F3f_v`*&p?C3Sgk+pyNbv^KZ~kJ16jBnReI=KecRiZR|%XTH|=&|uc}=f3{S zhH02dJC7meJ+R-jRa0s{f_ui>c;hZGw%)DA6bE;q6E|D;2^_-wVp{!ykxyBwHtmkI@f#oU6jprWc)&ubY;s>mG z!UM5lA~Kod)xw_9z1f@OoRQ51Zw^^A=Z&A_Gu;K&#U;F#6d!o4m+$FaBHr%l)p)+& z=*o12weRdZ6j!~hp9-H>c9M+=f6G7NkLms9By7IBBSzv$*~z-+Cj5cjUe8{XGr~$P zlsIiaV)9?AHq>z*YBmFNqWJL7Vn1Qs1BoZab)L7yPYC{~5*C40?^xFG^jKY9T5| zqLfY>Pe%@S6uV}w3bSOMp?iSm?Q$~U+6U!t5bskXc~h^X8hT!*c5IYc9iQvPf>%(m zR}jq9Y*3t8;RZS1w z7_7b54g=9Wc7xaSY@TaTV}iL)x8!8q(OW~PWIEqGIGk(AE_Rd{W?t4i*Xcuobx{MQ z<^vmoqd0$!%yvWHVQK{3J-pt3wyfojt`N_^q$^S*$d2Su<6Qn4C)0Jz-`%shB~0-f zht&se`~4t+^C@$2?CyEJ844;SyeIjIdp4g5eeiAi&d|!gDvX+G-KoM*^+!K~wbMh7 z68TyR3n#)8>DlAJtC?P(?krs2R&Q!t*UAgEDr%mI>QVDtm71ry0<6S(V{Br`YSG+; zOrv)Zw&&QlEBL5)HM;Q&el9f9selH!QT`me7{(;;`mS-Zti{_AKs-v!zpnku;TF=Y zDov|I5zQCz^FI2UwV=kdPAs~IzY{ZA*L(6wJdSP0o|Q?R)GjK1LMpZE(ru{kQ%6EO zK^tL)3VejG>uKK9n26;(BfqZWy64aZU%~ax1kmgO8hoWj-g4GWFO?_@ep;^~I!o}C zo_`qOi;zE^^Jcz+lLaPS$MoSg97_7fQqs+ELG~4C&*{+0jB~1tzZ=ccBer9AKCzdGECK@a7&dWUgft*`y2=mIc;sC6>O^HpExnxd8!B^$%5sxgpLg+_>rNA=CLtp7! zI6L0bxv8JcoD_Ek(IM2bkURSK!Yu|<*%Yr~yPCI6#ntd9ka@@dkGjul)qO54sEXD+ ze5w+{TiB1&E8>2$Uz5&FMGIquCX7Rj1Vz<54a8WvWFe z$&RY*$=TEgtf%&(vwO0|doZ2p>9FS5-#<7X=+#t3TkqrVOLVrAmwVfH(rFHgsu z5w&~O+>iJ5Q?P8+rFZY5q|;T8H*39QBly;d&`*Wiz%yvWgS9VjI(IVqJF_E`*t{=f z|J0;>d$KYbZyfRiqCQN2%u!k1IV#lpjNxF(b}OcOIL$Z%!}Hkg`3M+BX>_l0i{p6D z;a9Z6GMIU2%c&{S@%Tnsgw?3fV0KG9gLQt~PJXy-@RfQlT=JFUo{#?2kgK{U>2kSq z1do6rjmdD-XGT8y%cGvCZRLHZc)jd;vhr>o-m>nvC-e-)k54%0oVu&o zOL}+VE6mxT7P>E%6MK_`cQ6|lZILRoXLl{;DEDQ6Mro5K4`;TbK%!r3iW^2`JnzDRoYgmw9|m|(d#ol zAJaREvxWX~n9#X$Iy{Fx?;S&@blq|6-HIC2N$Qj!8|)GJuM`!Yjx^Xl_XFpw$3u1> z`B8D0CSV_a;+o13`KDc7%r8Z+xu*Z({(7$OG2bXENs(pJpY7SDyv{i-F8K4}T=5(- zg9Clg!N<-F9*_5J**=|HY+8?34z|B4Y~PM4NQ3 zM|5*}YnE+I^`_!Eiae8F=%fCl@bBG4`_c>V=tMZav{PbImuLGklT4rLD(-*yqrPI# z(F?`&bO}@8@&>v3)bS|yg8I96^lz}O5C4m7=~dicLP;9F$z}CTf^)D3&fBi*%vh%i z&AV~l$9>Kbvsl>h!q*w!N6+=}4Wx2&(tJFss<&00+|{S6FCZ`?vZHukaay!zU^-=h zYh9ed_3gF)DiP8<5Iv^|-xsP~aAbNga?{J6SUNG6EEScV&W<-n&t=n`=WYC;@9&q# z^Ayqb^n<+bUx+8g)o<#o{Z7~WR8jow(W9f9x*D}5qIS&YZMV#2w)v@IZp*VBwdZEB z&(&FBCm^1v-TGo~t^HkSgoBV_;udf(G#dmCj<81d$c$ZhLgtsa^aG==bW)4rbwAa+ zL8X=2?#MEKC7%QlB3NMSCtt?dFW@<9rF7EW6X%7I)V0#%;MsX*?;Nl;NWAXn3v86= zN{o#?xbR|7Nj?9bkQ|c~f7I83Ul2|;)wLM+k>X#$6O)sP-e+3?*T{Dn+X7Z$Gbk93 zx~ZM$TZbK^;4&CVpCd-hUc^*-XBbi2J)>>R-VsvSZA-*P4P=Vf_xjUWoFj0JIC}3w z_iGhGJO`JL(8;}EU+09^1|z96MW5`m)hmWJxJud}C?it0ns=Q$_7$2y^pu@AYWM01 zr^6k0?S#>xdyjff%Y05Yf27K8Z12f&a$otQ`$@A>$>iF3hCPkq#&-XF@<-w+oCG&u z#!&XVJS?8s)B5wYVl2Hx>E!A+-!f|g_w8G4-}+L|-B;y@Z1O-?j<`-g5b_7{ zR`gQrh+jExxK^@=FAlqccl9iC4R*;eqo)3@`Bmy=c$nK~SyYl~Y=w&t*=PI7R zA=F#-9+QQVl`N+=jq+^lGSiUlwvNg$guw1J{({|k?E`hUjp0OPaxRoRsvLD5nD2R7 zr-o?~FON`$GX1txU{a%dxc2WQ4%cX8?g)LH%#?tkv>9Nn*MVZZeCYxlQFxW2a8wOj zPg9L#XM=rBe2#Zm!E2FBJohvd?~RLCiHmA@n#L5`Ut$U^dPh_fnNz;23ZA{#HQV_4 zICnnT=Z#zozv^@f?H$Ev`Xrw!%6ro+Uk5YDM_?j!#-qrwW1QZI^)=iaFlpGzBVC6* z=1&eIHcVw(uYr~GU#=M^td8P);_&E!pX%@auSf6vhjQNY+HBiBKU2*MBI# z-K@9F&EO|a_vp16;s~Cxp8Eiv5BdzudIDW^?Hkohj6l;sse<9cK;XvslhWNp2R##( z@ic9SH}gIE?7?JP-Tq#V?@m19HqLz47adAg(J;&^< zx6n`CvJInnZld@iZo(8q`ii+~V*9G%Gran=5KZ*ObxQGct>`UhzDOqLC{5)MHBN;`RNc@8kd_$NfHp4p8ONtVLcI}Bjd!<9{x&CWc2(g`5y{_x# z^ak=yS0mqrZKk2rS*LjrIp?=J4}*6sFYoY#5#rxfA^PeO@5qS{)2^>1rKsg<9sn~9t&ILT&lGnrkRlgzQ@h~M)}WqJ}gJNWbGoJ?#? zBTnK_`rVFm;8!|(&{i|UBo-KxU;{+SUUfdDSIo_M_4E2? zgXHr?p{A$2j?MU%U=uhl;2Jme_h7ogbN%cQGp%CBT%5Oh*4Zi+@03{VXU|1q*h#B# zTrZj5(Cu2hENc{ws$qIAz)f=G9*gfnZqF*5`w@XbQH|Stx8d-pr}x#~=US7U}j=*i3(dm)b6 zcCJJ;M(?JE&VC!ehTS;RT{oMG%U0T2=hCTC1&ym+*457GY@I!d_M>-Y`FmGTmYunK zug#vS#Qes=pRwCVT1Vx1f5#l2FX&95TC{9}?ryrJ@L71C9@!R^4F5EE`>B&KXNd~o zOX(G-g2`%&a0-!YVeGom*wGk zFp77SGr}`aZ)>i6JQVkFnXB7{1fC;Ka=-svwQce{>UkUD8~ba2E}3a~h_>~ZoktOS zxAgrdIt^6B?aHT?&Fei^$@@R3Au?N)Pv$l`_M^CcqKNGNGX9REYRLKVZzPrE|95*4 zJ+l;Ka0>RMcX;n&W{o|z%}?feINqSP!pMCAUQ1^{tK4ns9H83}!{8{WG|cP8X@?3D z4pDx#vjx?3x!CuCtDoA-ah;_PR8={v_qrgT-h*=Dx%#N7mf?iid~8%zA7X_&6H|xQ83t?Toyvtjx`JG|!k<_ofp~9i`nJ-lBU$%mEkOn30F3 zHZcCNFdo&zHh!l%GL6XQA!uf8q@L&5#BbLR;UXh`pQ`v?f0jmlN%w= zAAOhH@jw%<@$@ZX+T^jY{Ji4mbK&1}m1g$hoG>4`A}r&@yI+3a)KLP@fl_L7U?F04 zuX4omdsT$EkM_ZQyE;~r7oL*(LAB8CQhE?kGtx`Sq$ayosJOfmcX3~rCw-s<20DL^ zpLA0vmP+M$DV_I@UOAMHK=OPTnyp zG9Ti*!};K7oPHwWTg{w%wh%b(qi#IjCHhYMtRT_DWy zG``#YEtw0FKh5bGbjkLQ8{d5tk7zxehBr32Fi(5<{!h~P&ps<7I`)veD=RB6Q?)sG z#=N>Q<X<)6MUlBRU+9iN zUP(>zNBuw1e|_!OitOhVkuU50@wnRaPjtucN?kJF12=0-1%9n)?FkHh%=hc)8uz~& z`aU~C;{WgKC*gkao&HAN(=lTHGIx1Vca9T6msf10%lgf6Psp_Yi~9#vabiAS*Czyo z!(puW+T+9{^Rt`+h0IfpX*i&onDMy~$ya?}EMY63(`mbyMayTiqz6VT|zu+xBtKsqKY$xsk?qp<=dW&!-^rG?IDxY=F z8hSU?OX7ZD5Jkqb+3}okGU#vPo^Vh9$J`JmkL2^|FT=gfGxBS$mKdk!Ew0a8HT0fz zfe(zY0>-04dB0R~?kSG*8?TvrubY_X%rSa1_ny(4x#KUP1HDB#n;kq4hyH}-2!WE6RBhC!Kmwuy3U8ybx^pBgkbYEN0+-UA$KtnLRHgCj@g>fVp!Q7<_qo`7&DujO6Qzk2w0=t5U0ZQ(c=( zudhRzU(Df{+;3XFxn9&aScT^%fZKg37`UCt1J}!bc(!gC?XFSM&u#{RK0_^%{#UeV z>XV+PYIV)Gric%f%6Vj_5DF6zz{{3R4YPmLc{%jISw)Jlx`o5DL9 zpVclNjT~_v-BTUUsPAJsXNn!P)86%XM@|~*IX$^-T(shmUcSD*Lnqo?eaFwE4rs29 zTKGukh*{aNZ7M#O^e$9o0?nST&HV#s0Pp;_@-u+znlar|PcoV!mHxb^aPO<<_l^3_ zYWZQkDU|5iPCm=iG3DKnTlNZ|AMbTUD=6dx^k_y<44KZxJRv3*C3_@1Jy zx7;P4IWBtp*bXyyUjUq@^>go(sOzn|RAQ*%e6K%U_a^5^)#SGR@2MgyH5=E~Jta7{ zaiCI1#K!5efB4!teojng235XdC?~74@9uojNQlU6;%zP8r9Pq?ep|>rbA)9aDOL+xwt<5> z@D6t(Yxv~okx_G8{+c6uksX`&6qj#{|2o$+vjE3EQ#d6Qfb2d7n^#QxgyG$=3Z{B0|0-qLd)>G6Y-p?uh+mqHBQiJr&%C~ zsbvQxUqs8mwPE+PPa25z&PKk%xecn>8p?K~vqz}6Tf}bG#XK91&u8k|L-SZ2&ErB< zm#ioGWv=)kNaiZURum8X`*p53rudCs_LFh%;hA?dW{1HIeR!s7a_T<9IvUUCifGQQ z%Exu6#7%4KyNbh4^x+*c(fx}K{j6{dTqD6Tf;&(>Cnm$Qzt;D0L)-HQ>)_o}4aw`% zJ;S6WYu<}1>YO#Ujwb8aQsn2~dHDJwqgzg2-v!;d1Le$vYJ1!rrTc6!a>pLgQAh0g z2%a&Bz8&#(&>sMGb9tly~H!9z2l#vyMXF`dQacC>mBDU z-Db>arOzPVeRRFA4$F=jBOIG5qvN`3jPFAH)Jf%M_guy`M*JhVkZN|aE3D$|z~SMI zjc{%-ZI3kBB@^O_;^d2LItv8iNkpAS8zElftm4_%^sF;S&)U#;9;t%EmLgv7Ke=V(wZMDf%5X<~9{%TZGCW-1B0$e!vdI8$Hf3UHKNeMRhzI{+Ns_4NAQ!K2&> z>hIpszrwaY{BN>V?ho8itWAzMzRYnvYL+*IFe>tP5W$`!F87t0h~v{K+jHE7E1`GW zRhTjSMqv`L;~({vC!>LLwt9eC*!O{4)nDn)KrGDtD=}-Z7qish6jnjruKh24?JP7o zhbQpB<6SpetgoPi*RJf*pYx{M{=BT}N_0)Oxh9-BFy3d6f$?5NiN|~F6U{wKo~clE zJRR94XFT=rF;hOY%9C}UP?4U?HtR^&U#Jt|d5Z6&CNh(X|BtKIoEq*yW*pDoP!3=gMEz)JCClu1_1q@=H$d)< z!%p`)GWXg?MCORYZKpe(1}&aZ0#OseZa;^Fy$HCO_Df#*Sh!+36cw9C`gpFsn3qSm zi|4*oo#(Yazt`)~0@wACvq+d$f_na!g?MJa-sQrGs0n4~@Yt`nDis_Y`i{o!4lHzlc90EDjY9A-bwIZ58sqmAw>OlYi+j>oq+mOd00ig_xh3Aon1; z->>QQ?$g1U!qkX;Mft~i_h24oGSBsR=zI0KYo}VmTIxQXQMFwDs->&tuob$?U@P{& zrdl$M)AMZFQGJSdSUmbUnD>^}jO$by;VN(r_%A4iec(%deaK&)>p6Tc5X-4B+EESB zu4~3Y*AMzE)7KU|x|w9jeQ9+6{;JH3S*>{tY|e-{4yNy^o&kE2fzQqQgQd(fl_{pV z61}_V+->H_6hJ0nd+yErgzcQWioc5LI4Ir_W;p?Ptn404Rr|Io?%xQ}pX=&G^)vdd zIflnssWa_+>K&B++gJ&pOr_=vfa~{tQ?)!i*AT8KZP(2U$!;i+(opO!kEIJ8y8g$2&0J9`!Pv<0F$? z{!9{e!1$h`YkpIVJpVjqbTwtVHXnninj4zAE2y z6HX6WHoakqFlN8fbMrgaX!Yw>S=ZWGodgZ#f{8!RET&r={JKAY4dm_zG-=8C5mwVEXLcqvv@~6SaS4%QFKYt}wXu>Tv6*Jht;oT%9q8 zp2PW~$ljwLlzXN_%RO?s2;5^#FB!4C))P-!6^RNY`@!fS+bod`YzCA5P>eGNh}t?_ zJ6Q^y=b0`3sEBO0wC^k#vpto^CxQ8Z5xI%*)98(VD!R+qj)Rv9cXzLo?5fK$A~v04 zF|&m3(Gknh|5wXJLf?y#m3#2`{ewy4e7;litk}UE{->SrWU8nvI9}a@Tw{Ig-W!!i zv|c*1VV14)l}G6t#{>7RzUQv&`_l8aOH|%dO#6+{g`(?f3Ht60xuMvFuw5b<_%@Pz zjpLMF1BT~u+&`NW0fy0y>v&BU3=UQttK0gMxjS?tpyu&+iiyKKp8h^`L$;53#~I&4 zDV#c2H}&_obFgRKc)lW1(@DWRiHy*r)>w0c0K>QD7l zOKLv{<+@|r$FghK#uH4V-S*+yA}F2KSa@VnU2zV%a03+VwtEJL)6>Hmo_E%Go56D- z6u%~UUCzScdrTgoOW;8Ba+v+Pu1Fs!4mZ8RWyI~D9+t25*15gg3A&mD=wIO5vUf_9%c%Wxv2AA3V;*e7HoTi7V&^Hn3r?nWy&rWLe;rN`G`l$`2-%@$S-N+f z_)YA#OEu#6h8|@)1J@X4lF+Jp!B8ktil`CpgOh!gq|3c@!{;p#}vfr1JXXN+jXMT97 zhOM6J45A#1AIL$pbu=kEwYs?}!f@z$W<8x;32r?(r0>Rkpokd`|End#V~;87TX1Re zJ!f`APB=JSGwZ5oyC%*qGTf@X&OHO>%RC#eA9(O2?wUn=Z+66PCaUpMpVMpnFEQfr zD#YWc8r~JEuj<1bBl+{s$F(DLk9XM0*}^kGPtBk23e}(MgN_zzeX%+3D!k1|4{etZ`n^}aGjCcVFFTNqpd1|P2*vz=CF$C9T#63yD#lElWj{WH8)%$%#%nAB;}LE4pi6k^X$YL^GI4pnR&>f#by;UOoDW*6z6N zC#a5&+fnyEiMls>Y*Yzju6w<8W?rjUq|X`mY~*Td;zWMxA1KmbI@OJKt~>SmZ}sW^ z+1h<-?EM92KP3KsLoz*k^W7&Tjr( zeRZ6AOe)`lYcD(32KS&69FalNRY5%(ou@dh7nTl|Gl%r^VD5NF_VnjlU2k6}f?N_m;IEZ2 z;;GImWOSup)%9WYZ`2v-&Pm=q&%(X6KNp=4O(NajX7K6ozF*GZ7vlc-59wbUGjx`B zh7RY0{E+j}R@iHeWqJp-9i7axOhsjIlvUs;QFFX5zbagTybonMbIcx@ zi*f82+*c{N7M;51il&}-{p&@+ql#dUDYeFZDS`B*uM3MfRA1?9^A&mnPz|kt2P)|l zAdWqg=Y(g#Z`iK~OYzs>oc`YA5!(gpkMtaKjrfUbcNCnS87J{RWcE2va9@v){Y%Tb ze~IWFRms-3ny8;}#|8pQQ~?o=K6eb0$C!QYa}jLzTH===ruQQvHNx#wuV5ALU1Ke$WS zJ3aMM4Q@ViOz%Y`ny_vq!tFJPn@QHQ4j*wSOq86UDg$@MyeK z&AF+zdOAbAZaBABrDhMBqnde5nI>BfKsF2_GR?X9!A5gm?FmNGqZ~YcDl~h}Nnq@h zR17jocA9!R2-zjooM%UPVAB*>& zV!ZCVi5>@brH-s}ne}YkUP8bP}+4TGv41paKKl^A+3+Jh75~vQ{Ik zu}y{mvXfU2Y_AHh#uaETLRZ4}+P?}rMDO&X92eVtOec0TyOa4ybVqWYjWJoUO`8buGPmgMs50qbSE6?<%Nci(2 zT_mzh^zU|_Ja>csUI4P;;oeD^$bL}RH902Ez+3v$9z373TZ(LObRwPS$D_H_Gf9}l z4UZ?ggv&4D-_%~wg6cey*9`vMM$Bd9-%*)tr=TVOo>m$Izw^AjXXRD_-CKEHb-p^6 z9JA0yT>e;bIVz7Wu9J-)7uUVV)wuSy(}C*2qvFGr z7~V&4qCSiUtpu&Ej@82@HC$33bH*R&j+$hPZlbI4+Q(q#)PVOM^WeH?*Ib1uf~bJ4 zqCJp3ko|FyjRVAanRkobIP`TpO9ZVwYc{gyqxN*_4%j9~^vtTv5vfBm512ZxCqiA( zBTRkpG)ksSxw`0{%Kehnu~Up}5G@l=3+HlOJr(=K)xD>R&Y7d{GaHksQq&|p7p2Z4 z*`ed^Qm%Dh*SfANeWq;n)1xcU$#$Sm+~T9+zRVSOlmeq>OYSI;ey{wN&AE?{@;>4C>`DjupYIbMl( zjA@vykK~l}9^REJyihNX&ypQN@yff>pE*BF(Y#x2O87%jiAK-D^7bs?5i!=Oy0FK2 zx5Ij`<2j=D6E4kbrc-{vHyyXcbTZkD>AS);y*XeRuk}XxldT^-%3~S5!^I7PU+TL& zgN|R~E$(e5Q)HJrSLTX#dcV)s4`%A8PB?trtKv5y>Kg6W%Z#5phbp)0H*;*;XrJ zi*t*|i?wf#Fv<-2b?qc!M#Fdd*cTI_qlP(w&-K-=;&bxvE8^Xr_|Wq1+lSnXzbD%* z`B{>4k6z*B?-j=3=a{^qObxDW922SM)ji{QnrS*F_pur-Pwa$&w6jb$3V$%qek=DM zE}Y?Whguozo2;s&*6-qrQ*_{$KkC`%QH{c_NH^k|wK(8Hn<}&A*QO9gMD3f_l zb4OzuJhUv^cZF#$J$DRx1?Hwg42SG+$exr#mMt)5EOWcu=QBfNx#!q{ z$JhD@&5oapxl>HMw1<@*Gcw4j`s@zl13mNI^XaLnveoiJ`J3_%L-Si5&5s(Kna5l& z@Vx%v=sd@+{rp}>;T>QeO!%wuObveY0*|@$*{ON5y){HpWBY+rz&qj|?m(zB#9rI` zDQx%A8fQ(0zvy;1wsJ%*2JF1TDwld;t@QOYP2eRk252}l;Cc-=T&Og<; zH-){iv208vjt&KC5@@@y&2QCPYF(9S+1r|-v#E@4T|KAdM4oHssC-= z`QY)eJFnX@*9qOOkIUEfv%;S}Gv`V9$z$s-arpI7T;@#hQ!!=U(_Z1)Ka{xaIPQrf zoCRi)M3%U%uN}b`MQ7@cV*&}4MqCVR(ORY09MwlA>)g<%Cy>;vqmQ)_o2R(vnTzl} zr%IFkc~iA_RWpf%={d|DhGU>uQa?xMcvj9VRm8-uw*5^qH6O{@A9IYgE?IUe}O0O#7WsIKM!^Mp^GfHE)w-cnD(yJwVMS6bxiM>b6|ez z1~lgT$6?y=Z1)uhzSsq6Cd}MF>V!9i^H-`W(%~C8BTj?*?Dyra5Z~R=GpS83iq^zx zD|+z?=J$*~-&NSu4j+j+;_nMrLDl2;45EWep9FTPnS)=pnAIxC?}a>aJ+KRpa@>Y* z1low-L{>XTJYU}P{y_YH6lCLVg{j~(t#xNlHU7C%hs~LoDaB74??2qCtKwEQ7Y5(( z?mML(!*7{fZ&Bqi;`F@tuXl|&N_*22lcj2;$9tZZ5`#MJ>I-u!QLvMD=PoDwerDS6 z8up>#_am13L=gD{rCT~%^|RTzYOVw4;aPdlxKqyD*LvIvIu3Bulst3ibdGQa#?{A8 zr&VL=QI*6!az~8CS!gOKQ;*Z)lVHZupAb$JCk{tcdlK-Dz{P(M{-{w>fg!$I&*OZe zuy8`$o3>Y&3!EmhR&PqDdnS1d>Yz97kdfAipQ}y=vhS4h^hdpNu<+0`?&x2G-$y&g z1fBM=elPqEn4}dECG~42@V+SuNbREC)hm999(Zpz06neVoh*EsNd~5;8L2VdKTdpi zrx|YS_!rA2V}H~-_r&a(TJQa6HJ|zUCxnyJYmu%8k-?H<)~91ncRkOn zCo6rV|D!trl`uF4sv=I4{}iWz@3RMx{WkIaTY4^zm4l+QfBg>j@~Ie4{Yo;41HC)^ z{kg6;9No+7=%%N}QJ%Wdbye#h`l;L3>3N%K1etuR4v(YD9xys#OFwjyo@&ts8$)=V7VBU#4fqgRa@{p!?#tbUk{ zZwk+-A0VODTKX7kHogeWz1Bj+$5-VUvVkzzKk70Zm4 znfFXPP(JUJ?O6&j8}t#gdsdE$VvP^&oUhmil1gHWYENJ4olbG(nG&nv_ixJiS z*n#fVL3h+OZ>lzQM_S!ZiEi-U$Rm5z@03uA*Sl9vjQSq)+zp7|;G0f^WC~2n$5Zn} zsHV?-N1cmQ;9)BJ!rUFP65lP|6aPYWdgo>lr|EtCo$&rtSAmf;tA{%Q9S+<9;(1h^ z%%1Ca=TQ{(`nz}ZufUzmCw@z>a_6#VP7Ln7%-p-Jf?hl9Y^dY-6zNu2rkxEu-Xk5h zLcBavVrGprS3v1d2TeZ;$JFuzof*U7C&X}iAimURO!a}sOgYMjPVC_hk?z?M(^n^^ zN3Uf&p9&rmF?|}l9n+2Xx*MKH`bVuKGUvpTD3Y1uxdOFgLRIwGnkbC#{`F zrPG`K_7rD{t?$M=n4VKxTovjO4{u@HA8JM&*{Ry2oj3y}zB4T_=LZto(NJJ1WRx$( zRZdH}MAJisVJd#+oy6d`nn>d8Hh6xVu9}%#(N%D4)fIfMx?k#WZ>1LwrEr=3hD@q4 z2fZ#nd|TRv>p?Z9dyGcbIiHR8Y{k5stPZ`q%{#9P)n5tMC@gT24dL>C3YpKO3O>}M zXed2<+0k?UCQQRqE?1bw31C+X-9O9<;+28vUQhA1w$Fs_u@`L^|h}$H#Tg(7C#& zWOBufpRK!!z6SC~`g!0aR3d{%aOPqvtg}5fK<(>lOv*%|iI|Sk_*I!6f%<5*G2gLO z!0o8LpoooAD|_fiKDjFSq&GK#o^}E(oFQWKT*PLU#N6Y|ly4vBN^I|&=96Ov>&VgG4`zoV3m%Yh45uGdeI= zvFn&wAHlD|ISwjNVDA)hdphaFn)ZA=_xI`@td85}*qo@0+hbSd(5{1PoOIS0Rmpb7 zE7_i-@o`bzJFd7AbJnQ8_j8NKgxA5VPmYB|)sZe^_TqRJRq7u-GJ}Oo*$L6S*FT8P zcl&uF{l-DdzYkB8$a&mbc6C>dg3c^SR(qi*i3=i_e_c6Edp z8QwqVjaiB5V{k<5X@xOR-k%MkHu>b-T!_~FN5)J4J9>5N<#q=G4!-P9h+ZTzPHO4A zitT;g{`8$)&oj}78a=*1?hR*-?hKpCImulQ$|K44ca%qm63%9-OX5x$>&O0_ zy7PBA`-t8BSR>!A*NpMR`8qcYWS1W&yS$*tWiGR= znk2Kl-Ma!hon0Om=lvbQTn43^yGF*)ZAEf-D)@d*WG2!Q+qu8N!{Oy9f<*6#w{%_- z)A8=$B19+sygUyDu-$(~CeBO~CZ*V)UH=4q6h{}#KC}_VS0RdnW1{$#g6@q&bc4xI zvgd0yXw38Rz0XCBZ}Poq)_J91d|l{!S@O+OM<_2beYV^4Qx4QGH|nE$*>aQ`_0u|~QQxCG zP~Wq3qA|62I?%Xopo}STgQtxBP#)>QwG(+Zg`}~cVK@Lo zH#v@9>O#>fz-~K5ux1>+o)`Kb`BxvQ9gq9RiNI_Zfor$Xcyu8Q#V_Ok$@)p`@BrKG zlr#_+?D+WD?jt!T1q}s0-NxlHDJ|IaaA|*trP(j!46%GiNptm@1oG9(##pFXQ0*fN4PFMH91}3_S!#m6}wOl^vY!CwbDU1 zFP|;nj@>~IBf5{?#&aLlVJ?>y5ziD2IOAqS-_cDox@k_bn}(T4W*!gZV%?T|$UfGZLH9f& zqjZnnI0fb(S+_Csz?01ch8oom6o>a!K_RlP>%FOP2=wdz_wJFMluGr zL+$IkRNI;Bx`=B~4~N6219t3uS{)bbMg3-t;w{BwHecT>NT~VqaZx<&=jBW=XMz1; zHHNo@zi?%&>z&>A1tOo6pMpEa4WZh7tl<2n*aet|nOxQ5O!9kk=-Kv$;hd?1)`K$L za*k6vt-LE&c%kWOyej4g2B*0zp8ypgwu;=3+*Q-H-b4T)xPoi(+s_ z?I}kw7n#%azz@Fd*3}o>dSr{EPn|n9G3vv*dd&-nl=l?1*f{B`Ve*h^4KNT*{cWCI z_dJBF!9wV1sU!G3{rq_A?6H{l>}4LvR1y3hxH~qaeNbm)3ZSQI*DA;lnr;^RRC7W7-*t-jDh^SOP9RYU7^0VILG*g1IB4qv^JGo*ftCTqECQV0<<9 zu2Q)+#@pWB^nLJq@8h&J?72N=p>EHioGpCR$=T^xBYkxEjt*a9*2yrE=#0FgjFO1$ zZUPWzj(t2l!$qb!C6O9;Dp+py>nr+O5VMKD`-;;qnt@~g0-5B6LqNBtEpyFd2_tp5x%cUKX6xA z%}M%dOET`hMjj`kkJeWH@S^rR_;!TN$HM4?!oB_VwSx6}k1!g^L4|RYp0j$DYmwGi z`c6mqjwb?w^C!9j*bjU&70?<;YL$nQ~PAiPT zMW!reaqRX)VSG|G!o~!h(c>7^`;&D%(Vab)Nxm<#gJrk8ocCb*2wh+;vPUlYs+vtX zQ2wz{4(f>C*Q5io{gkg^${D|Vrjgua5o_uDYTzd5CEl~0{NP%tGI|3l>>I|7@8g;N z%>FO9@m$vkf z)GRNRd<|UhNQ1klsA5)HNAlxfe4e9#arTknC}Cq`%~C)msAlhhJ9claeXqQbeABw$ zK{<8&jBJp6s^0-~rRaF%B+%9VO4p^w5hreBn77vct}FPpajNR9626V^AYU;iO05#E zqc*u{GW=)y&9{6bV)tCXff-8A$<0u3vbq);ID_$1TgOFeon%{Bj(l)Ti1*yx;nwc& zHOJ|wVeY@#$z4V5tNO5VlI&!v^991095Rpn{&6Dr<-)o)X!M}F?kqb|A3bxHQz z8p$ye%}7p1>-!*i`Wj9KQJ;*`Tj3MUV?xxJ0l2G3#cVq29qnZJlU7fnMtNT<@O6D` zmbhl0;Jg+Rk((*3^O3vvQw7>D3+;U;?|sG0FZBV({x|*C8?NhqbiA-nO4NQ)v}vb}?1_SPjV^?f>_V`k8lB;$;_@AR*1cj;mzhWPlx@U0=yOJEA)Z6r zI=F8t<{s#inNZ&9;kcY?9h*&Y_^}JpTdV)7uh9R{0VC2fd4%s2!Bpn#b9J(tJvzPeV2>Z4}|CRc2MJ-abDv9$JVSDDcV!lAlIY%NuL6^ zs$+M)^Ozg|E9LBCuUN~qkE4OG^VU3s%{14gU2l~LS2O88{$^b6D>3n%ss6{i;2Z(X ze4P<=L-*k?^*f|~z${9p?=ja8O&eZKHyAoa`nGotolsPC?1DnOK3~P}y2E`DyT<(r zzaHxKD(+okFQak&KwM-?bs0~IcU8u5dT~`|+K1p*#DB9RlIwwXa>TQ`^Vi6Jp!|*r zV&L>@VVle!W8OQSY>A%5I_VgIlHYN%8&L}1X z#q;pix@R&T8P2HXcShM|I^`jDwJydt5qnWQ@2fdr8)W0qrZQM#dvK89&^{@LHqOn6 z)phT>I}VKHUfD=a-Pc=^gY<0Mc_Z4jCqN_z8Qtrnp7`OtkJLp1$2I4uWAYqYgGJBl zBGmfY@0fGI6{dSS2Im-4`aaf_KDG)O-`ir;ca(WwD=f3-)Qj-FsOB<7H&NO?C$>M< zoFm@#wBDDxOWj`(a}{7j$(PTIGh4%hakHlh&5s^ooKaM0vdX@t(^Nm3ei|!@+~?{n z@|6DW^jUtb$Jy`uT3RyCjOXz)oGZL3Yd81xd^E)G$}4&IQE^}9in}`&`AxTzglpZT z=hMMi7Ui9v>U_14p0hw#8Ihi;to3Qw6ynA#;W0}%oZH7!{i6DaCz}aqwP)3g`}pYX z^Gfau=-20!LDtB1-#YzV#xI)4fg&kBr`L*)xS*aZN~8LPX2E*i8(>FYQzl^63#Q$_9 za#~je*TnC|yYZ$oNzAHoMfI~9MlEuj2;HEzK8dh9$ zljGrej)N1Y>Ff1Gs;t)hzG!IRh`RcVlJy-3(N^jBS%~B4d*ChHe)vkR7EJ$#P>jFt zwXVOe+!Rk&ARG=K&cL_2O7HjEJDeWGyV&oC)9wiF|dnXCC1=2^V)ZOeYUojln1DS@_9%HWX8d z)$S4YlzC5}M?H_b0LEO)_aQBMC3Q({8T^bGUl-}`qN&-Z;!43quMV~ z95vn^+&0Qn@npKhH`Qx)^z*{^f4BC}M~{yA^jV2t#@$auc49bO_nz{^O=XI9hqp|B zPHQA`&-cjlot`hjeaKnuph?W%6RXEPd!^hj;qUxExJ)-V{C!=x`$E{JACnpp{im^i z0i?gx>+Qo$7GfU&?pe4E-t(HtP!)?ah3^4&pIO3i&@Q`!7Hmfiw4HB4))@-Rv?8CX z%%c2us>(!6rxxmIor&-<#w4({@CxQnZl#PHbPw^t%tjq@pH6X$c$9ab~tE}_@- z)4XHL2&yA}nRGF{)aQmiBgT407;J>t?O09JCpLes$Cyo(I;8hJFrTf}XKEdizc-)h z!P?SwnUw<98Jf)UYBDG&W+iQ>kT5Ax1u(VjB%MW#;8#4N_Ds+ z9rTZ>u9@lb=Z?skunR&9PN@Y!yatrJ_tsd*3Nl7nQ|D z9TM*>e#6ZYzgtxIu{cpZhxd8S501kba;>KATVo#ryH}s+??mr09@?mdX9XU{fuo8T zPW}8!ZkD19FviZ(jh5fvcO&>9=C%C~Wu?(DlF?kJF$P01qb)7LPHLw*JxPL~x zuI`|>lRP{mb%lNE8jSnF=Q=g7OErh<x9u2TKb#x!qcG^52S#|x5U+F@{)MI zgn9Qvy{l)k1ybL4Ml5wxRQS_HnLK-h{NWjYs@T(VgyoFsuxKMIr=)?Jwm#YO>A>`7 z3l)@UMF+NWPH3W{10TeT(N@b#-Y?QtDWKH=l3O84YU@>*NHlMYrawpM+qcrq>l1Gg=Q)?V3e#e za2NR{n+pCW1%ylzz8>F)-5jsym~B4v9CME2DkFbfo%}JXm7BuV-qGy(KsOP3QT2Vk zV}Z!t$8XpP?kLzc@0Zx#6dt4Vi#{6k`vZLtVW|@Ge}OuBG1oQGg4*E|eT6nnosybj zJZHPSf)nA_#XHq?$p`8iJFC}UkW2l+(JMy>*|K+#p&uxu_e z%^MdXIee|HkHnrvHWE@RiJee(gIM2tc7!#wYFVJM5RKHn$rth0ZO`8O3o9NaBS8PmXjqiP8`1$p%=q*PJdwI>sz6oJ!;{#;-`12Us>N__MV>1X0H23J_@j2xro{u8Y zYAt5oJPzC7+BKr#o48;-jf(!8*NV&!rF}oriO|({ym?G%d{M(=I8VlwRO$x`r$f5KUrq|Br2P5)=iMwpy@AbWK&A5*qq_>E9Z5KQB9RCU1qfj1BD?1?nq;}4{Dob6p>sB|f&*qdx0Q z4W?)5iTnQEz)89wZiBMktBns2ckJx1{aaBJT^Ws-zNhH_Q1$)Sir_Cwou5i7wWxT; zpL9ofD$QoGj(AD&yPj`&P49D1uKP;Pf}tZW^K3$pU<~JU5|Gi>hI-zS7@qTJIS1`= z4~B`{{VvUX-!T=X_KsiExy9jN9|$+8VDtNPguQDgR3B^w)v z{#NJPbvQW0cG=y%r#tj-gso4M(=lh#h`y_T)2sSu_tXb2+uCHt=f#NbBR6M+dLcDU z`xz6{cU5Wpyi_q^5$j?L)OM)yd?D_T6-+vfspssMz4G)P<1i1VK~Md@T--l3UDLaX zvx|PCuoIl*o)9CD1#Zdp%{F@bP3kJn{4PIpjvlv(^`57oDqc`TozBwSDlr##EK&KMA|*ZZ z_)wl4Mc*5G%zcR{dN&ov$@%D?zpBSyC}MkmG5X*GJ-6LH{6{^r%@Fzf66v|Z3+14^ zDmJJ`#J{V%6)b68ca^)E{u7Un84}6Jmvf#b_h`rQ2c^2hF5*6Koa%Rrv7NDhPW!l6 zv=4W5CMyA@>|yXE2{4VD>bXAN9w9BZQa;yn-{^66R%VaGjvk?7f}cFDTl-9y5N;1u zAoqGXRig)O6}lVn#~H)Bg}bobpA8`vv&sGWiHdv(C>JgVmzwsB3i*kbyQ_yBSFsjjzIcm`ib1kFcU7Q*@X zM2OCrDX*0&lJh+-x^=w%=S;5J6Bl7B{-^r;|Lf5^57x2#tOLw}?bxJaY_}16uC8Ki z_mMeSN3WA`XRy1w?PN%wDXRb2n>`e3JkBi}V%7r+8H&|U>3ipOH#VYgi$~wkr}u8u zHAI}#^ZFk8#`HUm);*#*BWNM;-!z%vU%EkHS^>d*SuY z8Evj8(4F~Kk=paw=yzDxbJ&>1q*(IHwnsR6km<%;yf2>nRNKL@RXEVt7r*?GJnD|^ zbe>i<={4%)-gB&co~6KhJX4dMRWSB*q&WvcXgE=eR^B#H~RB@`AD{H zRgu@%StXwJe<_df_r)PX-jOw%u_0>tH$|kMC0Z7FA>BH$ah9_Dsa82rL^sbAm!y9%>)%fx$W03w?5^MtkEP%nog8 zkLDb$B656Gdp1?QA`iKjvM)ihrLiR0CcYG@sDy+jk5qAz+vu1`j`5`^<%nqar zo;r#j3%IiQeRlHOiB{^wszH&a`(P z_5!ClFPvQ{dQL`s)D;|2px3)DsoZ33ojoL={CDMKd?Eh+RNXo-cF&MtYvyN1Je$c= zZ-q`y4lKT{$k({OqN`B3yi{>=uDUO+2NmZlU32)Tme)sx55(BsEm8lTA|w$ERV9#W ze5YqM9;ebWkNW;TVeJGabD=nE6W3&ybe9>0#DBWUh|}bY-yY)qMp6Dg*LP4tBf`?z z2{S?)>$#?UoxT7n?^O@Dw*6K$Ny8Jol1w}vO{JM0C zZEdx&|26oH>pJsjUX1fTwsV$%tzYwQjzx<@uIybz^x; z^&Wo9HJ0bzCtB* zQH+L7!~f&?qch=&?ue_gA>R8AKuLBa_R+c5`iPX^IWTQ!Y4GfxWe}N}4Kd{y`HrIp zayUvp%u(V@4IF#+$d;lWIIdNXxk_Wb@$B6=4!r}8f$CASG&;|=glF6m^QF(g zS|7SbL{F49y2nrg?KXK;VmDbJK5aVQDQ)DnCHQkd5&519JbN&&@yY*JhZ%3VjfYMZ0G0Hd10UBnRz7U z+lW0yx0O8lRxR0-aM?kyXqcJ zKakjGe~#GcXze3*@1x=*fZaY?Th}1|#_nvQbj?JlDN-}1vc6uXY5!GU!9Z$V88O4^Jv0@^r-5X}W^zg!Wtw%?^}HrI|4^7)_J=V(_2*lm3rwJME!r;W9N>ct(9Q=clQfhkjT$Mn6s z!^v^&uvc|V<%^6rrUoAm%~U-=Gjng)zU2H5l{zpxMW!Qh@`*MQPdf}iG8hKQZI$I- z(a=1(>7f)gd__zTL4*EAKY@QX)aG?D05V0od+C}bAN)c*0u^spx!;+iXJ64-rgqah zlun6nc%Bu1TihG2fya9ck6j%Rm(!O-7H`C~`CiK_QfsbxMUC>qc8zEU)~8?(wrpUD}=^#-vvLQkhafom#+{gg7Q&A6MHl}DA3D)?)C^-vD|N8%EH zSKmr7f_Uy*b#lGd=l6OYu8(zn`2ArLObem%{g?8(&`@eE13&a--7PNZb#;H&@I$YP zm^2GPz@#6Y@wpr4!XWo*uo7+Mo!nnJWj@cvmXcMrYKc!6};A z>qDeJ*K_z@pqm+!oCO}UPpQTx3LySnsvw@c8t+ykn+bgMzYMR^ucQX7+WbB8Bgbkc zfG`i(Dm3gNbHh1Q!$ubOtV}f!qP6{`J+kASag*jeNpSnQVm5Wbz%%_?ugdQL7YEZn zKGT0c*E2W?bmM-ZljF>Cf9*&8KhIxZ`?b#H`4XXt&)bUSsN2*Nx63o=E{ONIQXX+t z`L#|4bEW9{;`?zvxFc}ohexj>Q(!M^T;;xAMTPP^{f+D<9970;t}@aC=yTFe5N^*& z)@9nPvybw5vQl43J=@cAxR=z38}oyQ3iu%^AXATw;H!$1SEZAAesEhSKQ4l&6Ifv_ zu9dfXHnID2MN+!6JR#vLMOUUL@c%Cl<0%sqVA_t{5lye^5#m166o}ev{5X3QYtaIU zww~6op=WWIw%0WxcFkyT1GIfH!K?6slP8Q=z1*=H48qh~zf)Vi$r@uDt5bPNrtaEf zAFDY}D2nIAIZ&GGXgz#SLuEPWCas>V%Hp0^=cDy3)(=DZd_2cNh?3a$8l)#=%wlD4 zG54t4BsSE=kE1SLQl{nTenTqEj&epH z{vWo1V+!XJnPt=^Ii2U%{y#C6%uSgH597J3XEJw+uieRuRvEm7S328;HNlbE{PUW$ zh+s!>8S<0(|B-v5Ypsrx>Qc!BK?I$*oBH5uW>D6M@7YP{>8ahcd}cb0n-k=jG-q^e z>QRaM-xrQ;Wt?i4BR)N0fjTDOFdv)gAK~XV)8|C|M`7=v9cT9?-ANL!%*_n%H#&Q- zwJ@JH-o=h?e!9~_eLcgKj-TP^UWLgc#vT|azA|ZktNi|3tz{nX!PMd7U?%Pei~K6= zLxa5&?Gx>&d+dv>r=dO8wdg)W6SV7upO9@~OgUrL2q)mRUPGtlY5nZz^853<6Wq544{>V_5J41~MY0gpr2Q`P8GVzG$iTuR4t4>jS^5dMB znBdTAG5M}zg2R~L0PAe;8^`gpa4$C>Z|6k4KbBot>fNiooa@S_kquxax(hQR!23td{pmzAeC@in-#sQtmP%g!Sg&X zAx@*EOnrzCl;e>RJ{Mxw_5Kevy#a-SOwuO}wFAEjdwQ8H%*>KM>N)hjo5Pc1y7K>8 zuY6d(yC`F%s);H>O)B1jnghBF+TzF=mpNy&Mgblc&)u1-*p93HN0UF z+lS)4D&BHB2aNT$r>(B=95=R4Il0+4S?6>^!ln>AW)Y7`CZV4kM*(F1g3){P&_iyf z4V!>xSnEh%RU4`Mm>ij7Ms`PV$7-5<~E@7J!Jb02X%9d97f z*?l^5?r}daYV+Oz|41wvA2^kL{N$JPE_l8p7E{B-gML-lW`oWf?R(;9*e}mWCUtM^ z&m}L#qnP&-Z*@x6J}UUDRl&bps_9_xnzTdQx8Chk_k2z}CW5=qpO8FHJ|9GPT(Q$l z3fBtOLJa}Q^v(yjd8Yi-Gxa>p^56*5Z}WqBqYb*3 zjnj5R2xZEveJeM`%UyGKoJMQ${8+R^(B4je1@pb{%J0fO;Dz`;uL`G8oQk`;2T{9U z*O|Xt%_1CAV3&OgtT#!5EA~3!!g5AhcTh}gI;RT%$usaStb=fR>d+F~?jI(~lVj4= zOqR)Jr%j=g=$sK7NA6qk4m!@@Any63dKKt&&S* zHJ*5v@?*2?vM2huD=M~Ow+^{d$v4-e~Z2Hj_{&U|5@JpkAJI1_nvePW>9#eodI+b;`3RZzQFh`y&7(Epa}j@ zk$-WFX5K{o%4_9S_;Ft;TOBxFZXCl2h)fT}IOw6VySv8m{9Fm}n*GTcrGG1=wmuW? z1Kw~=B&<>VKuDs)*m)xLJXE`yb7cJ{aGTX0x)g5f3OSi#TH_&S1mk3#b(H1=)qM=O z+~Gy&i0s;ocN&B7`5 z?F(sh?8_lbbcDCM$F`@pdcCVSS#QB5#mxH96Wh4Ww6Ayvct47Es^DX$Y&{8c8E49Z z?Wkbh7pj?!Vr36JhK@bW1EW6EyQutluVXt>vrm;C%Np76W=}?;SIqNI;Mi71VA+73h2+~7p#$gWzIRw?GcE;df9;?7SqIoTF;vm(a zp=&R*uI;Rj-!zK$9kCNvAH%~vt+tqlOc}Kw@A)^895hmy;pC(;67P3!{Fm{EPc@_uzQ>s920#w2W)o2BgNTD^!a|q z9gUb8`-Z8;L~qWsBi!u?z0}%0tLm=4exV4?-N2nbxV_!Ilgdb5pYy`31=O183yPnk z&PJKO;we6X_mPdh>1K^AXEy2?_QpAiAw8M=jzOn!-s^w%0nU55`&`tl-70vGarco~7Y5jS+{ATe<;qAlQglj4zI9mxX z>bq1esc6PV*loq|Ge=y8J({?&di5~;k3{!NI$y3_1``?T;qt48-Vws@m#M^Hc)Oq? zDm+tXlv&8M^M+X6cU*E7F6yMracw3R zeVvGUyX$7rZK!|tnC@%w=XBRNdvp>8rdI*eQMGKlY+wmy*1g*=^2$XssCu-6YuE<8 z#GeR}bq+cDYzEhOS+uZ|4N{ZLu6DY^ z=&d1gd*Yzou}p}_e3Cl^ox${>@p}JR$MI8A_-`NGCCE{|HzMvEgNH9a52tcr)sMav zYK**eOdkETpiCK3Q5aa=vbt#;{INHV(p^>jq7Xwq)#yF+>q?|uCB79 zPoDK+?Hm0`_fJmeAwzXXPG6yau=Xz%j_G~lWDgv#PM5o@<)GxA5X>%-o8|W#T{yoL z`sUQ@9AUEN^PLRrt_^Iv4qta!j;Or~Q5yyV+KJfst@g@qJnQd$ ztbR-aQr)GH_%nxW8WyNYO9aG9D<{A+0GIKdB;cav>MNKE|!`PY&ib* z+)>6H!LeT_;x%s3lT*k&YXpp45ockB>s@`F`*q;wQ#T2Z{JdywOwY~hq1xfh5Iy_l z+J7m=qNbRaGtrw#Y7v2b_uzT(Yt)r>xw-e(ekgNI(lZo=HKH`RLuQ@X zIY*oyvHF?*y_eG^NWI%^gNamk#Kw*5jMa0vMlY%72*#un@ZR%uGgy_dofAO2Z*&$ffuwR>Liwy={n`?NR3K3aDtFJd2daj{h=-fLiaRa}5*$HtGh zLtQ=8QDXWfF}lwd%||!|a|%me-{e%_Af0Z9Li0xRpi^>P6-|_toUp@vBfPFKTq60l zA~&<9nCgJ$LT|%*xq8OgD@EU?n;3OwqbMiQFA?Xc=GM_$9N6B_HR;);j*2EjH^hk6 z%N(tvZrM&VemBC+OXj^Nc%xh7gK@lvI0I4jYJNQ?8jl@2?tuHHa!K?H$8>As*A8QP z`UmG?I*5k}x5$oI-*@4IajK3)^;Q$HLe9+YzbbYT*>CFWmnCY)BooK(WZ)6!w-j&x zyTolGzN??)Be+rEHh4=?Il*(w_1V<(b2iMwsLn}A!CP40FSzgEq(Rdkk$!n2J$;nM zJ??LGuN#H2X7&DmxA$(lab8)rCU0FpzXRI_O0JD9m2I6HD4;2dI#?8`6ltk46NQ9j z$&xIJQi+mJ@0ZU}l@0ISO-cX`)cy6 zZS%C42DdfVxfWebhTUO_urH^|VJZ>qdD5jAW=>2q$LiS`;Z0)Rj^gj>Oq7(fdf#Bt zQPar$=JU|^$5z|BH%!7dv$`uO#4z!?Pgh;BcmDtlo5I7kuzg35YlUzau{SsOzqx`q zn98`thN-l>0dC5+;^SeHt(DwSBnCwU9WbIQo_%-q>@$7;bSI=^vb7YL3Hd2xyj)H1 zoXmX|(G{*o)h%|ouGY@nNZ z6)RTi-qT{Y#WXe;Es-v5c#)w^5U0fIvacEM_i@tnT-WeOcK3xCGSSO;e?FFOYkT_r zX+Qq5tWT4b5USP44*wtNytq@Tf{-OeH_aO8e=B9qq!R!I1DwU zRX4&O53!CV9>#LGmOD{7HX2CF9pHLLHhklr@%op{7eqZ6^D<8|6Iw-uYq1+P$_bD2 zOz2)__cH%7d9ri{8CwC$*yeBrfVZ^hp0qB&V~Foi{a9i?R-A7AyY+vqy4=5{^~YcI zEZ7q7zo%S(^PpT0geEcWmkzVG%!Arlp zF`pdQckUsq{aY#ORLZcYH??f|F+}vqM$Z+U?Eb@XoWU{fSrPXwx&AeA{Y!dRWri(2 z$BujldS1K~AMA0@#f^K?V>S2<-J!OHbNsoiCY~JOX8PdUcMF_3Hc5^lea4A^qM?$9 zLY|4U6j2q!za)EwjaCYV* zQ>8rr$-(&@-HY5++lj`ko>`tNLkcFlU2l7{jnz{=H;Z>0-smF3V1%I+DBMxP91aBJD(ic2eaeyGOJc zg*&p~^hrUzoMfA^%w$9MfVNw%wv(6N5nCICC&koos*Jli6`NBJa=}ynwV?g zWzw%9um5M3@;#}yXOFEHAhD9+h`#J!&TwYBces~T&N3NBDeVo8X&{r;Jff#C zXJ$x7GC2k0n82K$YXm%gaOYd;IVyRmSSVFJ_y=_h=yX5m$eTLLeQ>yvbq}KV^frNq zaQqL6P4g+q2#1~X?<9u(aOt1LY3O#cF6}4S`xl9eb#}eT>^kC>bszAYl`<{Xhx{6T zL%s3E#D6lt$R9bw<;mn zb|v~S`nV>P_Bx$jrxSL2nmQfw-)!wRWtFclJ=~9*A0N4`tv1`HALX#S_onPGTHnKD zY5h2?GAtY|x3$W2ej|g$yEm|Bd~`H9G^eAN4p;3!5O%&pFQSAxM@gT}X08*>N)YxJJH9&*VEDJH}Hl9-JEH5mlC@ z=Qth4TR+phgUaAx2hCn(*)#cw1_mkxUiNU3Zx`*v{i(cF9)=z|y zpt%sE;c-^~+;NILJ{UDVqWd{~shm7V4e|D>;xc zj52F3OLZWAQ&-Uhiio7|s)isCNo+jOUG^a1b-G=mq`Xy@D*Z4^PVwh7GtfbH)A?gq z2Fd*9nwzeIoE{Z~h)RuSTkeu^PiMJXUy>_k8 zf%o<555hH;IIz#|0C4!jY%^Ks-8P@j?tqsPHvlaUm5X#+KAU%A%^7~fXnDjT$F)8p zFhlE11pvwj*bbY?J&CP?KKc-oIbjQpCrNY?tNnJLHSiv>?(}3^R%N0ypx){V#4kAy z)p|?+2DVYavEttGm1oO4*ZcY5dFHOiT^U(?W#m#~1)yeK?DUopQHbj>Moll;~O)@}8+K2HWavy}&bQM*ArF2d_~B>7C}uPb3s&u^zD?aD0{>t{+$6@)&Y2DKQ?{qyFin|If zFMT8opVj=zY}#GGSuxPXx$}Re_kbr_&cf}bKO}XW%;>B>x~?qijCiSd!9OOi7T(|M zeiym!_mb9e&kb^_HWh()Zu9ZxM$6>!G>N@`lI{|g7xmr!7F-btD}mFH-5ovUnXTk% zztRu8S>8x9aG+_>9+$oYzg%YbT-F+@JYXqkc^@f(ZZj>3Qyo zy2Q@)mzF+P#&^unp68uw9~N_uv`eyyMtZJjWOS_|j;{h<0mcmcpwQ538C@I( zUs~6E&t65@t8>tT>uy!k#OE)`HW|rvA5HK*u5O#pjPvwy9OFAW!@E|)dwi$IcV-{o zam2*lCp>vgnliQ-oF9hhp?VS=otm>!^9IH2xX@}UuKa=>yh@!JP_xM%fsfqRzxF?K zkDcHHSCXzmcPRQRz*F|bGaS|7%*VP{97`+=KNPkco^0kq5zFG!v(r6w__=p?*H%u0 zwi3}xSiqWo7;9oMf$mn*w!I!cYnIa5aTpAk@qX}JHKXfS$xp*)!vlP^ubR-)EYL}x z`Y#jqsk9_cY3~wWb9d?Ag8K;SM$-o6*0Iq?ZVT0~g-~p7 z)>_#4mFz+?s-7i_jg4<@w%3KjD}pyuMes$PdqFe$+QGc&zT%?$ie#pmVUzp1zVw@Y z#qfAY9`0?49trOrDkEgQvJ*VJgDmU5UoL%%K4i^?hG|Q!~<8yk*ys50jtKdy>3w_Ym)54VG`pCSTWY z%Pxkfos8v{U6?~(7V?KXhujpBGb?^2KMxNPi@Uw_M==an2Z!}s)%<}?*q_8Y!<@^m zsb(u!Z^uu@EpzOkTJr7Jx-0kYF_%S-xvunXdmclYZ~a?E9@ID_Qjvy*r-vB)d3 z$QfB=kAOHw*_U-kGMlm&cqeHcFT{u89z<8(3AGnA9|G66bOg)<{J~BpF$(t)BnK+a zgsJSNyIK9{jAD@)MZ^myS>Yi{Cu4WG%XMfOHc=~bJ%Z9BD6@~Ckk21zCW5lEA3@0)bIW+GF%O@$r{{lj z%>azW-ErET3A&%x?K1HJ@-$~-m%%K4Uft^n{nydGA!f0@!)F7-wPofy?mJ26jglev zK2Lp*>gbn1?3aCe(6H**%xo(gspK=-bA}LpQ)VG#V$=w>#R#MMOIw_xy=-Nj)Y5gN&n>Vo_uk@i*}cSGW-Sh&>nsfvXAI zH`I^WY8>VWSZZp^w`B*Nxlvl`A&wnU89wi4#^Nnxb`JYV zQeFO5_db(&1C@gGU0T*W!y-RRe`WiMop$~kRfil+t{s*;IxpmicvRL##W{H)Q~|uw zy~;TT3yV8k6<;FinR$1&;HSZYM=Y`4{XEyN46CdTx8R?OS=SyVcAM-ZSL|jB-uJbO zczCzp^RnL&Tf8MpMr_eNoX{_VpS1Qk&^`WqYt^k#W4mj8`j*%=nRfVuc#}M$HY;cI z-0mGVV%kgUAjZB?{-V>bkiqyY7;mSKI3QdNph{JweETx{wqTBCPRB zuUR=gT1iA3ZwlA&lj~`eOYS|6;bB&P%!M`s3d`-pziC)m#ODRoZ)%l=8^hn&)DGTled@bDT<%%@UD7By6)v>vfo(Ua;H(Q ziT8(A==v=meO*UoEs&brM`AY758nUROl3n?2s_P;!>jDN;B&2>r-hrKXBg+#6~Vci zv_VF^j7JWwv+eTmd2{a8t7HXmo~knlGs>?Ef6Iw`khKrKBX$y9l;9)L>-vq3<`|B2 z5QgwcIh-sNrS$o4Kv<$H)?TkzrYlhKX32)^4IT>9amNe9R9 z&gZ#59_on|5u)l(@ilHG6}o9`DpC4?hyW)mA)KjIyfynyvyLfj5dBOtfmmjfm3Bfl8a(?vzz!f86vzI_bM?>M?cp=~Y?BF~(f_gTqR%Kxggu1+!?GG?v$z2hqK} z+Mkie()n_)&YgXAE`2?X>RVFsHc|&0cqT{;#d=y)x7}{w%T(x+t?Ipug2l4$!8=*x zr%8!kmX7$HI59cY_;F|TenK@});lBWXw^EabXRor=X(CxzFnu|*sh+tujlBa7mS*j z&OS6Hhb9aCmEM!H!Q<5peGlvU@wakYXTj6W#=CF0$a&dhsCra4HS%O-!>Y@Q#vwDd zZ#e1sR?7zIW4%r{h1;JKhRF3;k=neYJuRH?PgdTt@b*?{WjB~W?Cmr!K<7=(5yz;$ zO~3)c%&$?TA#ar<%wWd6ys$ z))DMvye4vNF4(JVX9H`9X9Ju(+x)mAmA&tz>=Ctjnf^7Vo%zJvbY2w}*tI$AgtRQ= zTQ$tP&rqSTqg<75H6Pgb@guD_7lnUjJafzT+w+Vgp6d9RXU;)!mpgh$@lMFZ<@NGC zbDr~4cxUWmQ|`gucb_3^?X;*aXmJtYe5jQIK5#oBBC9TA^8mI#>G`$}Gu8_4nUIn8 zQ22xW5T$&YkO-eCI|gI-VKW(xb*|yvYA%s;RrXM&e}MH!BBC|QxAuFpfN;=FKe)@9 zN9Q%4&ZlE}rRNx)jyOIj2hWUY><4DXkfT7uY^q>H;o0W8pYc_IJ6Mfj-;UCz#y$HU zWXwc*B7c}xoR9T?u9weMK)nY_=r-7}`S(C!eqg1UA9dY*xe5&Dfmea?=i6tw5*6>% zan_1Yue#63&$FTTC$2(sl256prsz7(dN9&!hkB4q^m@!?R=qNEI$FMTO``*_*ODii%v&_;0+i(Ib zckPAdeDY~6cdOCZ3q_fC7yA;|-4C@Ym3c_7;|vBqYn(@HwcgdH^h4XIl9>ouD{X8Q z=F;+PR)fzHL;0-nLi@fpy#i=f6+l?*h^L~Ztx3UlUTvNxv8q94B1UsOCimZwnGON8>x9Z?6PLSkL#u}>s4=-&7oubk-ZQYj{NA`Nh`6A;yVxnZ)Zm1v7&4hwd?Q4;HIL^UIZRZ!|QC@>9F2158LfAF8wR9XH+dRr&w!#OkUtKF}UExWSE=JIfpjyqKcpS z?_zZHW!uyHCBK$=6lcQI@fFcT*zvl}6s&Wo$ag1?ik+;<42!Gu9IDfjLq+xN7|u(@ zuZ<^$*Es3<+GhmkXbv#!nxAx>cYFTJd6E%}+?Gdk|6uQilDka8^Q7l%oO31D2-SY% zwruPh`Oxo@#zAcl-Zr`h8VUBAE>Sno<{`Ce9@Z1QEP z^yif0buL{c_)@8Fqt=i|Q=b3i;QX%pEpA;9YkNc=>Dsm-#&9d)02Br*pM>D?=i7=o zkWB_PQFh`(fiQQ?M4zVHHyWPt9GTfLCh$xZ5YJH?w=T@mJAxSznc(goQL+p8Pv4Q` z@0LCg#|;JVZ?)P7ghy2JzHIkhaq(X#ggb)cOuyO|o1vVS%^Q1u7ei|KOc^vqn)`k6ZjM=kd3DlY4IZ|Z?DybT#UTp6G zbyQ3&>pkx2)$jBh-G7#Kt)0Y8%rZdz@Td~q+})8@AN!dY3f}15B7RAQ9DS2vJe`Fs zHVcX9BeiB5Lb@|Y%&(_Md8?Li9sEZyPE06cJnjd+;TUjY`pCLYEF(MDTT*KbAMqTZ zudMebAwG$!!n_D8eEWdC#EcLjC5t&0l1jkE&<1KaihyLqBV2bnSV9^dZ`9*IVoES%je~ z%z@vOR{w#}%btH&{BQKH_bFiI*K7#Zm3S0bpo%2i<+bcw@CnYCm zC&V&SiuGl8e|?}AOV5^C+-xa!<1lvXy?0Ov!zPdUj^~BQvFF>UJUl$QxMBSRU(_m_ z^THwA+uqpCOr@@eCsNb*-f^rC?bN+4-ssU|F+MZBvCO5vUA+V!&e&d;U3Q0LtR5=L zBy1mMmxnv@7~NJ(P#-h8$-*XEyX^Od>VXnSf0C?pf2!jmcbj-79w+^=&PpSMwV}O;9n%KsDWmRnnTSQ(0+e2>QXIiVx zvu%f2dzs#Chi*M3vgxx;@0}fCklw~*t$LS|M^dz3sCV+~^iIsPee63aCVTq*DKQY@ z`6wX4K-LqQpDg{4^voEN*;Ag1P5J=U`$v7JcY_bRt8+UKS!5m(amkv8Opj-C?Ur%F zp{e_AJJ@#?(kt8Nn?XgrqAj(%Hf+mUWBIZca#TxgOt-w78FD^pA>Iul>?ceEO&Jv% ze({Z11gbYGpDSR|@35YZKVrv;?4X#S|2dZ`Y;+lqw`RyO&dYKyW|Y8pVlL0MqaYR@ zJ6+o9<3#H5tm7Tf4=W=5-PSL*UJ`LkcsZ(AJ0n^z@{DE+J=u=JU96U%4PMr)D4B~n zIhi8%G*Q1{I)t|t9)y#vN539;PFPUx=S&mg_PfbC+u~xy!w%b1b*&{9 zndm00<*o7w(ZJ6i9C>%?&&l$`eefjnol0AcrRFzl=Y5Bs)6*-KEGhH!EyXME3D1t) zXP!Q+b1-us&mJ7s^nhUc1JXagts16-@|&gqlwt^5fSLR(tP;Zy_Fz55%HII?Q~>cp#>Y=^l4p{TKGl6 z!eQu!bxi7mOb$xT#;qA*tHDvWpk&8_W0Y50;j&*i=zO79!e+bD9VWP|yen3*HgS!?vDNU8qw9l#Z?RGG7{?drdY>{>@|3RZ#%LxZmU~W z(8mtDubEk&7e@fi%#qAI$R$MI_)-=drJEnW7uSX6Xbw6FwwyCiMqn4PlsMiwCGLV^ zKXEdqS)IyG^}&Dat#&LgGM3>5tnTdJiX!4%sm!6L!7^14wO!`w)GrQu6WGV>pUvQ98vyY9pA~a8rRF}Zun*Dp5sqLh7=aO);{=@+?A}XSIS%A ztk`iN?s-p&5bG5^Q0^&LDxU9|Qn?CZF>}DNs7A-Sl(Sok$#1361*5jbEvvBd*J9eo zVsD37cLyr>#LrfHU5M*DarYjtc?Qk4PM)1)jO@C{Yv$L}A-mQ3m?7*BjPF>h+I^>y zs7>nKAm-f-!b&q-<)*wk_Fh{*k^OE_4y(7`cPVlCY`@tz@QL^Z*{j5H(EZ@n?62@D z=^$p)uHy;DK(wFr01obRPyvS(JVbHGjg2g;eBX#o@tN6W@q$=*)(yYV`n950I{#i| z{vFZCRgLAU*teCDoFzEy|2N5R3|`XunOJWaE!G>~GUJQNudjq^Shb_+R8B@WbQqN za}@4L`gY68ZM{J`y>?2J=R2}nAZX1wg4@D(sgAH0%9l(3CT!E|;ght!V13y)3HwYn z=1%fRnFleG$~X<&AHC%A!MQz7bDH8bQDI3&H<5K#V6ywdhnyD2t+nP#uC~FRW{i3N zZt5O?)DJodl?&u-d%sCKm|(AY7R?*HVw-bs;|F?-H7Dbh{3`kyyK@PdB2-qAn}RJb zGp8csmYU4EPgRL}R7^g3o-w!6`{^Bxv(LAfstKIamYd4?F|~Wx$-%lw%ddmCw1@}g zt}1Rjn{>6i_s*PU?@Vlzv5e>RAo-A3?~-k|8Lo$8x$SL&^=8I=l6XkXw(0suCf`~8 ze^wTkt`Jer-gbZ>eowV7(Ml>TsrRK`cwJWg+yS#-ez4O*U4?_n?d$=V3*9K#mnU21 z?l+cQv=`MXgEYps-cJE`5`N$`NS>50g67xmR(4-_d#azlpF-FC=B@dWCl~BvOWN6* ztTq-qE8EktkMYbAYIEG*Dm*&6G!R=y2Y~@&xA6?o=^RsJ?$N!$J7`9Z6EzHU>whC= z9aZfdNi`*zAN)JXb7ZF<)WVCJ*N(z+W{*2AK7)?9W8Hfy$JmFl#Nf)U$`Q7Gj6+i^ ziM3{BC~@4oPce79t)9QFjws~aR8@0xU*junbsIA`yBLX8ik@nxwQ*N zQRwT+h?6sd_O_R7^kea7`x4k+EbA@3#&I0~M%S!$4`TMj70_CqPPEzV9LvgaH66iK zyV`ep)V>SKXEIhM_0}1)+^E)*5Zyixiis0~=sIt;_tx3etR(mAP1RxKLwP*C|H%7y zY$so1j5(JPmzG7?8jmU1KC)#apqHF$R~eU_qjTq|Z0{&O$<9sgIOcVgZkC&aoV{UR zocE!)wZY5?y7f@YSVs=~-c4P9o~`~I(Zkvk#Ewq#?B0jwHa-rT$rPenAI!V7%H0#} zo*=sIygfnoxiI&rqvZH+f%BG21kQ(?glDkNb+)ycGdWE)ZzdD3N6FD1-Eq7l{+B^~ zL>B7`$1)x>j(EJk8rhx+?X%|Ejw{ynyS>8kl`4PGaqpvYFX7mUl7MZ(18RA@p?k4te|0}(RooY_7=ieXFT0)+o_dml|M+q$}cjyF5&DxJ?)-rp$ z{a4N?ifLClz8VLh+7JNYzxLfBz)@}CG9iCP2 zWBs3_N?px)tC*YjgWHnl_DiZcmr@*xnL%fVHU03o?7umz@`>z%VGMR$;b(T>DL9V? z&m=RUUnM^6o`m!nbTvM`jDOhv=tlF8~X_yY%mg-SZ4<0NpC`J|lPla3A&? z^e$_MtpapbWF0u0n18PD?5n_O*=dd4EA18ME+!|#`lL*n%VOWdT}$#^d+(Ie{$JPp zgyY!)_Kb9NJ=Oy=PO2r=lWi{f`Xy-{#`2BC)^G1C;AI4MoY4&X%7((z+H>we72IW6 z#L{MyKY*r!HKrRIp68C%Ev)Ra#*tob>{CU~6nYI7J8JX8s(-GdsYpPh4?&j*Ler%^;rd?HzYgO(-n?)*?IgTt2XZ74MV|$qsG@! z*v#XHQPp58t$rD(Z(~xd5%2(1&6>?`$)EgLXb1Up3VN%*jBjvHM;|g0^6pXOG{8z? zPguGgdgfRM-96wqFchnllW+~D>4ufP)804y^zf31s1i@Tu0Gn1sAlbDT2v3SY?vXR zis8b+TU>7n&1BL%Ot#XGBNl~ixBgPcqR3OApMWd+!7l2gGseyx;Ce;R(k&kw?0Wwa z-(>Q*a~(69Y&I~Sca!bCRTjUu$|YGW^ORL-FPpO3jV6Wef2fMl=?CnwcP#t%yw$T2Ri(>kuoY)K+Fpn6TCxu28ySyrJb41F z4}GVS(-Twm4w9f{TR5iQy)|U`LU0N64^S9+xsd_ZcD9P=>!Z06KI*U{e_J?ynYacV zgeYX@AU`GhY;5xG=tu}pMpMaXM%xHh&6 z8$$D~gaov@#}f z-FJ)OCLVv;dV z-YdE0*kA8lG8yY+Pl5EzygSxU4=2H&8)CiGsHeqx%T_?RchzqD$9A-{R`uP{$PM@< zsy)#yjCNE$7`QEa8D|{UNr3-WoivyGMA@_8ZP5pAztEKPtKl{e#2sm@c3QMi^ol(5!*RuNloL98I(5WEX?jC(v{OAi& zV~=m$Bdb*T#&JyTOUP0GSoTh>!~{!@0v@T)!ERBxOzq~5&MGD5L%V#OnkAK zctjZ^7?1n)4DX)djkOx9Dq;_Vzg&j5_kqH?PO8_Z z<7{i|;WCqy^kGk1)&RJ}70r;ghg`4O&-D$t=Ha?lx1RI*I>l7H>&N?ZUeOoKX6S@? zTQSR_EcLR=kn#kKn1iM{-Az$WhRD=MGs2%_(=6~8~Ig2f@6F=Cob$ zJFDodf@mCQW&YOHlha`sjKPm@iB+&CtF^w;cN}8a{CJY$U9)NH+U(m+?saW_o&V(Q ze|nYh$l0l}*262J?$Nc3|5Klt*kl=5zn|ilM1hFsP+h}Sa$ZVS81L)VxHjEeE~H=j zT~Pxcuk>t^(-OHcj|Jbg1_&yHUrdMZR^zsfrm}#%yOJ|^1(3SsHz|Y17HUm=9fiMl zS*9}285py%;%E?{yxxuY_$Y5VH&>#M8!Di)L$XaJgO8~CS^eL4Bkn54$@oZ)J(l}w zXFf8l?uu-vaXUU1eI!T9yc%40BzK!k*O6J<MRAn%r<#iB)2h1<^&x- zu*fy@xRrd^r&@cd`r1@9aYz3XIp2|m-Vif(EeGAy$ax}Diae*_zgH5AekBdhl?tzP z1$0010ErmJad;ZUG5I^sBAz88U%tAb?_ga&UZrm9EHpgF=DUKo$O;}k!#t{WFTt$f zO^@?21rM7I`|$lT+Ily^-c`zI$h&+0Wn+$L37!#j*4$D?hjTH?8POs58eJ7_XDlvfpJ_WkBFBFUD=8?KeQ6|JRIgb)GyYmA;>5yp&UDi*d6kc_u!^@KX{ zTJJj?$;0TmJxf>&9U4j=K?WchRE`kR$&!pI>x8>vHjYJ>3?|1TsiR@NaFyDQt`d<; zx`qcrVMLF_m8jTZzWD!|&1@)ZDvoDn<2mG5WX}^^{5(PW<{9Pg0(f1u0E~Fa)TcxF z7*jtlbkj|$t~hfC!03MeN7-ms>Bg)J^&1VGJ~_L3{cHWwnS?4es&`Ps%l-?;Rl~^# z;JY}h_jp;41NB`EKP_tb)q{v-9c?$#9nWd4xie&26~$J*Ra{sXu#fO`_tq?VNw0fn zjp>p0=_Bpl5ej`fcag+8Srr_|tz(qqT>x9$avf~nP)W)6>s>2**UFQ{+OH-?0gAU3 zZC_JFvh3b4J&IeKjP-?Mw3P_k((&NU*Tfs>QbuPe_S`9ZK(X!iN^JEUsGb8gn;fXCNq4|T(QWvKeoFt(JfdaAw$`mKXT-P22EoM6 zVHZ5kocMuktL^R1(l^QKqSL)Su&!IujOZM>C!OL|Qsvkogq)@D&3-RS{Y;j5at1XS zFlANxb=_e%UDuJDzO%>T?(9L&P+MR60aJx#r8)EBR*5h|Cq-mhJcHH?!Y;W@brHRA;Mud&0E4UuU*(SG}jc zPgkS&)ODSAL%+;}m``Pdk=(vdG~2R@aaZp+&hHV&MUFVSY8-o=y)$s&yz9yKdJ^h~ zoC7_?iZqV`U*-L}H`u+wlX`;@C8WawJ#@B`HFJ~@6u17JYX|5NGR{WYSd9bmia|&dDZ1h0;tN*Z3Zl7x2#YWDjV|lXUy7a6b2Vo^v7-{q<%W(R zx=0okJsXID=U&5TCnzaD>VID4{Rg6Jw(_Z>E_D}el$ETibe6uzEIs0jn<<8Vd%y3$ zyGI>n>BsGS+sPFi!->E#{y-p%omPpTgV5))sj%`p+Wj5f4`i`^?H*WR`0+ELHTKT7 z2AKQ7U(!9oV&7T%ldj-%<8CFMvCOPI`HbE@`*c`lxUzjgEOVU|0uF6!TR+mw#n!p) z4^P%djdQ$CdN`30!Zib7+^=VZ^m-ciDy=iAW|zBdgu@3wc&%#B3gKLbof3$XDVFcjVar0I20GKGxPR}>m3~R0eiiavm#LZVVZtU|&_9@ziJ52@`hN-xY=DGa5 zAH|D_mZOi8uS(5K*|+bSJ~f=&`PG@(+|_5xSH$=2k@C}{XBfp%*;w~)$|!F23A5&L zwGZ8*X3bb*?{IfT|CfxS_ipM{=Z^Qxnk7f{@nKT1@9ygwnI%tyXy(We(WrCo0&)K;5J21%;0@w0FmxHJVyaH_w z&yRjSb${T%HCcW1(1U;Y9CMMjGcfxYP`^bcNr`OKK=US;6uu|O&hhb{jknm@c*b(Ry|fF&T>}!aTf7W6d(|3DsCfYRTzfy{vol|0DfP_4$MJ zDtnUVT#z+AMqx&a<_!PKS^ry)$u#vo=ogEa%DS%e{(aC{Gjczt$Wrb5px3I|;#DOY zJgN$*pJjJ}KPunDIeEb>ymuYFJ)8sL{(5EZ+?H(d zw>pcwy~$B*ltAWZ&e>x>kG^-^;`0hd)e0O;`KErHXPS}R<~*BM4E;Z1efU+ir)REA zmcMt&3vY~wAA8=g>y2w)BR>>v$aS#x->h<%TmnAwDxnrm;vJ)56!z%?`}z9hCefeH z(elGk&igMjs&9+K;Db_q-t#mTGf%^IE24h*f;Xfrm_28Ya2k|JI6B6s?>2eU%t>WaVDs7jG3sL9xr)#NDMo>niMt9vMrqLX>zWX2Nf-j_FxP zrzh(Odm0>sz0cS7_isBM2VsT`t+V&OAVaBS(SaEh^O(`~tVuse`<=Tl zM_6Q{Fh|?{xijd~XpJNKNACSb@&`diM(+@j=FmeQ(fM+1T+r5-Z2wEbc8TA(BfHR{ z#o7CVPml?k)wq>pr^#w2qHX;R)Y55*h&DA^_Ili#ApgWwFS*_pwa=WHJ_%bXe)!@bJ_D}Z|A4)i0-^A4 z_rFFd&Ov5vl! zcyAGGyrT}+oZItb+=3Iqb2pnFk?9%Hv&o32XRdw7by?~SS*?4?GQrKmR!@grtbdJZ ztTjl7f7F_YJL$r>9ch76qtBt@p+jR?zf7#eJSA+Vdo$6s2^AY#z9(A@dx4kN`K1x* zhNp+tlC5-`0fG{l)xVwravCBv5p%TWw<iv8>C1#HT`} zQRmDfbE0n(qrjUa3xwo;v3u7q>f#a$M_)e=^RBLv(w<0 z9Vlvh9BRiHy2-_`!pHrxoxY~KIU|H4H<66w>h@d`%G*c8K$CX(c~yBP78pTALgEc#Kuhca;9=c!Gg2 z?)ggibT%H@O+=}Qd{7zd7&iH*Zwsyr%ccs38bh)#9JR)dU(=c2D(flFgW*vnzPY=r zAo%p#dS^Ful`Fb$o*Q&eMSrHQv1`zatwBfR@Q!f4mSTsXq12$K#d)jaF=x>0z9@$vZ%>6$viInYzIK4!u-hR1-G03-u|)S)hfTy0-pP%)An_G;J|t37qPpZEc(#}I zlj~@EKJ{thArUDgM!2b1^pJ;4i|DpOAoGy6Ck@f;S7IJ#g<_(8RxGd(#KX&-iO~4y zQH>Q3Ow+G7V;cUwI}ye7*F#;2u-!<^}hfIgV<#U9`IfnXc8quj>@{o{pR3H)v8G0)-ieW!n^ZK-Qy zcbEPnA-u$J?Fo{DmGRp-^y#ZmMANmcX1A5=Y1b9-kb8#>^YqWi>cXm9WQC5r1)q$^*M-!&RuMM5dw^=#3mJPTcgz7iM^|l8!xGqE(X-4GuIspY ziE(OnTon)BqOz>sQ>feN(_p6~T8M?FFP=Rp5I9M34nEz+RpR(DJ`JwhSfQ=*o2CCu zot5b8@mSS|Ms=CNfwxCY(6zDj3P+eBEWv|#tgt1AH5!IR$T?#%H> zxT0@Ow%(3_gZ0{a6Gf*7FP1wv2^p-}Zs)6(7Q196M1$b{U7tRU{cF&+%tz|(d6{1i zGoHh4PwH&b>LxG}vhG}AkoidOpZ9}iX4gSxr-MZFu;w7(FF3`JMTeR<#;(z!>*uZM zjYSVT3+Y+XyG^#qY_p`<>Cd)0dd--H90%XI>JUUzLp$7kJnqsv+Mv&tJHoAse-S5* zUamRkv{wksr$T@(`oUAmeFSno9}$+?R-2~`^^}Z#b8b4KwvqF`dq79>ypW8&#+R%! zLcn6Ml%pa!j&FTTZ2ARZdKh;^)94u?*V@?+QISMf|I*ysP3L%iqth z+Jnj29PI2~ACX^kmangQ`qXT?k_MLP7I}BSmoLu-Hpj6%Dd(xS;LH@~>b2b>iJHEY z%17-LJCzb^bXJq~ysU6UX9V{-SWheWA2pg}i|*b_(2_5V5H8x@aix}Swu)NS_KdMRu=$273(ik)T633C0s>k+x9?rY7_aU|&W z^E?xZOsV?O7mAF&tor4e2C}6(rWYC05rcfFjMVj|-|S~mlw7)vkq4Kaq@N7!w)YtT z+kvk$De{OOO|SK3-S^9-Z}j`45FNZ_+^{qCn(&Eg3sR{?#E0C~&l7QMD$PrVd|ns??UC;U2FY%s zCrF_GD1AO2sw*$qQ89bh#h zvP`kr*zvssi%RVPexsE)b{*f*b=lttjWR4YmE!DDk5y+aDE-D(+hc}Pm3vnIUeW(? zjjrvH4_{+$F>N>sm$7{#=^)gcGs-2)ZgZIe+mSUw)d}bL`Sw|?w)YNYXNrrcMOvu7lT$itSSHIp*v1B4gMR8U^%sr@xscXH~WjE2D*>9E( z>tGV~jvRliZf3`y>XlHUSA=zXfv{`&S-nq~G~S{kHi1cc+&Jb!cEw~&Q@dH`T6b;w z^w?xuUqMA_f}gt>}KJFT@>tpQg}_7nM0j1aVdC{;H~|T$Nig=QbxPm~)%? zkvRvJ*>#J|l3=ssNx>Y@kBNRe^W(XYiwCzXZ;n_tti;+g`yOU2uL{d>4Wj4nsmC5) zfyurH27a8s>8!~8?dCI4{TJ-xcH-0SFHmynqvCq9M~IpS&adkK`1Z|sd`~Lf**EE| z=GLQxa&{hH)11Lx|5thsJ8913Ik~;`2i=jHKIUG`C)@n2w>;2Y&}x3vovDWGc7M_Be#9l~ z=*|1>KA5k0$~Ze`Mo@E(B6zjo=RJPYYsF?&D|S&Bv!!R3==)+YTgi%*erC(8gTah5 z^w!VhN{-#sY{q-i((&dW_iZwd!-CpMyB`iaj9Lky7ch#)vi7mTl44c&WS8MJkEf1F zZYdH;Z?sSKxqowT=N^;H3}{hVd5%e<1=3doT%q8FcX?DyXI2h+QQU|^)_EfI@{P<7 z_=WR6uBVkgy0Q;z(ow$O2)&NO+ao+DG%_P&7SLmr$UOD#&*h);d~lCa-6kiHnUSM2 zJy+!P%pzAvnOCFD^Ng0Dz+6VVwz z%j3+!Bi@KNiU-PhaCPE}t|=&^EnJx^I*01>bR5VgyS2nNpY-$e44)ePgdGj8rWnq! z!*H)JSp2>@bd50&srMYaMBDf}S0Y{lpJsgsJIc-o_->A=_gxCWQm+P! z`nT{?v2Wh>ik<2|+^_q1AltYuezB%ie|hO+;R}Ra(!a*?P1!L##Pwv$a$Ug~mTj+F z_MGiC`~&8Jo?XY#dyQ_-zYd(vHtXq9;uvNgYfCrv<2@)2M>5$T!~N(olCi{5%~<<{ zRGU6c`CQmzY%$s$G4SWg3xR*Q_ZaVJOUxO&js8uYA{^pdy^b9xvVy+nuBtg^ldlg8 z0X5`DIS!Logpyg4HRULKaPq#F%<0H_BC|d;?k}V=lh?->^Q^tZF)KZeZ8MQJqGN`Q z$9OqiH8YM|X)R#~b9N%wRD5wq|C1fEBaXWvMA~~<*1H1Nic@cjELh{wdl^u-}&x5i>Fz>nrA0->$c9aPEBOAS2-?n&pubR*kZ0|KT-Gy zcz{EUYtO-}hdw3fZ+SJ>VWz-K>KrLzD1D!T$R+8V`ed9sB9e4tLe;aT=ZK5*O~>LY z!@Q7e=|C>=7(Bw7QO7;lt(@Ipu)fZ;N8dmJ$riSbLDD61ECxxX!p_nkH6J*hh$FqG z&L&@!oNia*!b-?2B-b_H<63&gT{y@sxBrNjusDgAN zHGg@i9KpQXfn)U3%m~~2)~>@|$d`t_@Hq2_zR$sj$#;0IS}%X6psr=iMCr; zMeyv=wUdZP)*Xg3TWN6`9A;bv9OLBVytW!(?=0LklzC|=5smy+QVQA4ku^Cpmm#8! z+M3T~-ctINb!Kahirc#*GD7q)vjTifYQLy?K{s(U$2!aI(!Yy&5TV)A`(t-ecv0{N z*gX8?=pCV`8>8z;nf=F6CR%D>|^IJ}j?^9RS>RZpq!h5fG*#;@!6 z8~Wuc!Fx(okc{$Am`e#~SZ`r!4yYp|&x8C_az4DHl2L61&hLoVK)vmH>|~JhMIw^HG7IZcjWYViFCFJG?%(bw$jHzv!m#B?51lbo0@H9?0ipuv3h)5J)65m z_3qihxE+_9e-{TU8Sw8l@rDgq_FHL@?Z!h)&XN)p>u6^YK}T zk&2$jzH^z^QV)r~4fiEx4hKQ8AvPYhWxVnSz2XeOy#vG%op-evdoaDxwH=pqe<*vE zd%`z)+vR>soo)Z!(g#`qYv!Zt#%;FukJ4!nfyYIW(>%C?bU!jwi zu}i=H>Y>>T2xAo&})U0J32fHBG{YWx$?~B(` z8*V;KEepNHB1-bZKCa8$ydMs*%`9N`_f8z}2+soZfNHr7vcRgM_?^*cNho#T;D22{kz0$c-5+4t5YoN{IB)HHR4+2t#2pq zgZ+V5G&@m5hZ+ap%PqaKDvy@O*p)4v!6@C<<83|5wbrYv$2;YdztVdoBE`GR@0*NY z-Y@TMcl6xy=rEin(l^7rP0l(1q%-@dR$6wqV&oAQo@%)~y zx2w+t!s)(OpS7p&X;;6ouaI9w>EXRF%5Q`S_Mk=+@vC&)-qW=hZ;-p2X2)Z_`Vacf z%4!R0EzslH$BF)F%nF|Iv#264{8x&}cxCxse-nq~Su}L}u=ojNFA~W@_2)bujj{7~ zY`{_I+8ZB%?SYn^SXnF5*?}q37UizqcPR)9r zIUjySbCJ18t`ohowq#A{Y6!3Mtn=u?>^zF}kYT>P)a>?LY{$_vj_W(-*2i(4_RDc^aT(Q2=rTFv>B9JHMUh7+e3%eT}};ydxjlYpdsVJ$vaIV_nL1hwa?;2oGnkc`p_tW^ZS| z^I^aE8fT=#zhL?wg!{TW zk9E~HkD6A-idl$dWV}3IvlV46%pOb0X6gIH4CUW;#)Vqe^&L8g%u?U6mV;7-hC}W- zdKTT@$U5LTMv}G7z74A&t6!{wUIWQHV6I_Xi4DZR-D1wiVltnwndP_RfXEv3u((+ZrV@6x`DU|Bls<_&-(3WG3u3{a_$i=cE{t-cD ze@m)8!&AJP_zkwztD$|z?g!3ihB~r9UN==P?oIYM@f>octa>}I@1@3?@#cNhql>?e z-$(a9vYP7kk~}MX|FE_G-(0n;GV>Z$t1^d;>QtT+2 zd^>-gAAhwrh9Bac$-dNViy3-HGdA{CMS1&^W+`(N`^}h~ku{CHoyj_lH8{pJw1BX| z-LssBXNfP**lcS=sVg5Jxl;MIM>$m37-#o0#=7=Vo2M^grOfjXK8t4h2ie9O>Csy~ zMk{p|4t8}jIFtva7Ez1?Ndnof-DQzD&Gza;`Qz2&fZt35o zY7-@P2a~t@i(ST^XvEBa$ny?|i+fl%(ACcfl~VUMl%Byn{Iqw7dV=eF}2TPr@1 zSM^h3xc-Z}*+*J4UD=JQ=ee54ly#7iL`MiM56fF-CVQtD+wq*g;d$HF%=xUD*2-b8 zc%kk?jw0*7U+jCO;iZ(bv>efR?6tJ^Krd)sQhyDr<=;M2=dCojCXM}M{-o8Dy?oIW z=w;@*n-^)FMep-0Mg1`jn3H_S@*#U3W51m{Op2_2Co9$IJY^^;|>kNAd6?>Zb5nqN?F=H#SNXPxyLbKQOpV;Yqu9^cNK z=E0nZZDN;EbE)3LcYU44l(iP`m0lZ+Zq(^9mLAWn9!2(@d6UO8vV6F{Srg;fRfze{ zO>0MFB@l6;8*Hqic(fk3to1SHB6vHL>T_%{H&jxmMoKit0){6ne_zr7-)lZ*rWmgcHR~ z>?1jE?rIO?wwMd?%%|e7j3RrC?d@b}5~BF0J8>RpWy{MF;a zsCypgHIf_yGuATSGWt9+CmkzcB<-25?-weh)TVy}-sF%7sd3@}i21-0@8GlB;&)<2CwG|$?ETc+CKlE8< zEi?I+{(7MwqFww=&%LN#XKvd@+Ye#H&S;JXduprpf;(CD>yedTg7*@aWK?daaYaL* z12p~M>ah#XL>4uisbs#TUA~Z_V&+MnnO(D+r)I}KeT*L&2v}K1OLznaaxIEypXV`; zBmW@s;UgjzYjCba!6)i$ciwE*bw5O^$vvR+2P}6_c63LN85L(yhWGhGuR4>~Dmkkn zwv}H;J-Ti;-#KTshaNmsH4~Q{AFIfZeP0Hbqa49#I-i+el=*^Y2=?+fvW+kpdz57O zJQ0hDoUP~?z>%zCwwT!ysjCrU{?SXz_Og%QJV!8;p0Z*Hn`ukQTr#Ke$mN;?uWv-G z+{fKkGUCLZeLYS*k2tY&-W(@puRZul^v|*P?h(sgzjd5pMA%%$%#!`f@c;VA&2P3@ zyJmk3Dz&ha_<{EI_QW|~q_GU1$tcF$%U)j2#er$&2nYKf*gLRK&uDf9=a=yME^5}W zwz)gYHyYEI8q3#O=gRJLD|&|B(oxOD?2H^q&rdu-MvN75I9J^R)HBvIwXciwoT>Kk zZY29k&m?-6MZZr*4m$~-2_K#rTJ~*;afTtWuYO#*Q@3#7U=|7SxY7WXw^Jsatd9*y1 zWv36UaJP)})>o*C!}8r*`hPU5ewNiETgq9cbQoyI%q%qfc+M2ZT9)JJIZ1@y{4;0U z^f@=5Ip-O5Q~Z-o5gtS0{PgDJIqF?eKyybIk1XdI0UlXcOPP67dx&27a@}&vNqZLD zY_s4l?kh6)HFn=>ES)XvF7;?@bX7XeII^Rfb~X` zvvIs$^88cH*3fKVoIckxv}HG+ijQVr5uVGc*++A}%+xtJ%u9DJCx?c}1Q9}54|~Lt zDM#eV862*;b3}@qs$st+uf=UuRiBUZn2*-S*dK!I3#!cBgZ!;V=3eqH*iC>LYWvCz z^w_~^ta+E-J;%~jg1+XQ;Y@VzTxrjqdFiq2xi|C4$8blE=&kfBX*R?N&xqGLrwYBs z447R4$hOHNYJIg- z0X!Sg*x9uOuRr4UU2mJ8-bPk1UgZOg4t>g=C@*GD^U=9cj@vU19@}hD={SgWMK3Kg z{&R-_dzOq{pLO#bKd*HUHFhu4`bcDgaiQ)8p0lNY{R)wf-P8dKe}uV6hGOytE(bBCU8mFGFDtrCrmc8oB2JMQ>PcJij? zHq6N@Y>aPaOnH1uYwa}_3qmZK5$)dSJiXCN`zq0TVn$E*^;_1^bQQ8wg9^ty^T?K2=EJ$`EaZ!6zB9hgISBuzTj^O_Y3o1qTynLJ_g!KnQFfndeGO)1 z+sg4~V9xVt^?K&*P)CY-b>qR~+F8~-?XguP@{=E@F=XvUK|np)(f{LJ20W%i{m5Ew zt__IjOZQCY;h8!&?u^z*I57-&%(~*`w6?YGMLA|&nROmLTh^Kdcl~HS`qAb6k-CxM zD)>1s#eNT;g>Ah@9WNtNX2mGa%Fb}-XHhTjdmwjZIe*j-nh{>9t3MnKy(xa{y-0|O z9=G=nU1M2g&4fIrS>f#rXtoUK@;;lPUmys+Y+pY~ z^PRElEN7l`(ppk*Rr*~~K}Sckyek*SFotI|7Gtq7uY(+AU$T$bJV%Ugmzt|*ns4rt z{*zb^^KNIKlftOzUzWW{w4avge3Di_dWCqGis&?8FNJKcs5Xd9O2)U3?L5aeG$5)B zUdVznA75yk|D+N1Y8d^MJsX|DOiav{mQ~MrDOk>~?95Zyxx8-^!2`QDk(bAaxt1Jn z@r7)uvn-j3DD-dC1(xg)H2PQSs_yuhHF@i^)^@Tc;BiGSaL+=Q%7>YbpSP(jMO z&F}wf{pIftEoJQ7^62qT%l?GV50vrvwDr{{f7Y?HH}v_A^Lbn5IlT7A8jJeb+p28% zP-Fg~?)XYR&ud|9SEIV2|H+N;YxndS`G)xWAM{;6NZ1 zA>Q%4XFjz-R07$GOh5O>&Y#`vA70&ar+)ru769vj%}42a+gOMCwe2*6$hNWVSkYX1 zEHqNH!8c@Ej5jnz*O%+;~jai(*v=zR6V!O__|adrCZe!u@3u`TQv zwIj^p$@UA2#VSDr40Zi^>LCi|!+u5AEqHL5^GCK3^UX8sURsmM!lqiqbI#o-Sif`Z z<&1L5uIf%`5Cy8w>v2}jxE5$X(mEtXZnik_7MPn%P3bLVbq}LOyjXA(-O7;Y~hTrJBq!-Y2 zJ&(;GS{M5_lDS3?cl0W{ozkHXZb$9CM>P8daGl3OHP|8=#9W|P*sB7A=kyNFrK`LW zuIc4RUw1MSeYNrT>DShEeLq6yrjq0G{@-8dUB+vy`}hYX!pOcFBJ9l4NBaCLOP>q9 z8+uo_#MkcXxykEg$J~c0@8W%y%PYQnb7CjhHxf_XILf<9h7|-WVA5Gwc=@)x&iY`N zU;30k6aGB@WO;x`5X`Z`=*<7Y-1F3RFr($Nj@%UDzD{U_Mcvok!k(=NvCM!K-3K2e zZ023DcwYkqfvdo2jX0QA%^&ebiK+PPj}w2Xk084UOUn`6*2VgIvK7;+9va>YVTGF7 zZH*n)v0KQ%DU6+tWe zllTtQIgw|`-F*H0?#hv8<+R=MQJ?Dy_IdpG$HJcR<47Go3SJ9Vu)a>m(rmC~y%Cld zJSyx8whTlqFa1hmjTHh<%Nhrm5hL$))jQmPI(`^o>m%soDkvxJ)__F=PjtHZ zR*zw)&U1oQ;kRO$&@$e)&a$d|#m@JjTNSwEeqqHnQ^bNhxn_%Zh%Lt663K`egRNps zjrA6v8nm1J;eFySd&T7u>pE5I)ZKP;f*}~zEPVqjrr4?n^LpJ&~Brn|=o zkJ-2Puc24PpKR-3hV&5uzjz*KSZDS3yEM||9)L2`iF)LTqR>~%GhxiWT}lWduliG6 z5oUG^Rb$RKb{)XqW&XX_f+4@kgJ<>fs(oy(Hub2L>rGM1V zcj@O``WDIFXP%%7;_rN=M=x~@{-yUPCllt0=FLB*&xtZ+K8-iBr)OUlV{$It>1F4X z@^4G6?l|7CBXRi4-|8E8wEVwoeAhKjnaSPO>*33AoL6vTZVdT6*ZRMgh11xl%oZ6W zu(GojV7qztUV5Cp@Vj~zf0?=dMn?soc%b9aCO{-M)$av+dQk}XUn@E%{3YIV9F(dANr=Z139se1~1S>LuffwQ3AcE5eBVVcQDw zQ?Q$OL-u)4O|g~uu0H0bBCepuJ}?-ov9l!$g#95Of(&n;wWakF4$0m84896$I9w3V z8>~dK%OP?d0nr06!9Wp zQ9k3kj{Q>kYkuvhYw3zsYt~LMH~GFqf4#%wC;QjOGQu!f@2OWedkvd|9fM6?(0P78 z*Yr+#cUV|IgAQ2QG4OXuzrI7hQam!+BDOS)S$6I3Xxbm&I^%Oo_=3yeHT+pI|L-(D zU=WLQQ|No7BbJx`UcdN9VC0UT_t@FGF``~I$thr+3|+2VH^&$pu^x^_*>Qy~YPa=h zvJdb~12-IJp2#zS20j7v2QMU!y_v50Qr9FB9VkPCvD!?m^@ybGW_K{;)X|14)+duAh?f_Zt4(>BRuW{!!?o8Tw0VL&YnHGQagJ8|HMoiCmusXya zJLACDz~5&=EK#-gTJ87s*W@wdLFcjTKJzRi$d1Hp2)X4R&1Z!^doJuCaVuFgYmw}! z4NqY1;Hx-Zj25!IZ?kRpwzRI>mX}O4GeB&*@5y|MC?GjvJj*PjpOBUHP}@VjVo#DU z<-@#8M-rt6_wZDBLion3!p!$N%37)CY-zoj33Lw+AA8d5;TUQnm_e}B%!cu*&_D$!Z96PUBaj(D-;_;MioW zKE6D*)K|QJfHTnCTGxmU27A4&D{#e*GVD58jo}S}v-(vZ;X8k%Z(>u?%DZXR zx~Yg{k5tdnLORZ43%RG&m{l4r&kWN4dL&>6STc?PGpy-o%YJp75r8HzjRo^@SlhSh zTr4QBU(B z(^x%CnFZuu!6I4V&_wXBSxr4!L`!(?2aUetd^}=3^y~NaYUG=lWv*!b#bbB$C~_Tw zVWPx16Q0VVE4sJ$l=jL@WRkmBo8&R8Tp$N5gEQY5`{GAe(+UV`{CAz_FqS79xtSed zF;26zPL6s6+rmCErr$`X`&z%KDy2S12XQkt_!~&%NTLxQ&C+iMZHMR0fMds5T&?)6 ze5kNjtX_eUEg_E%uP=l@x`Dn-cMB_nCyj0hcRR25lw*Kny5W`P$gDHw>&2sPzfNku z9N8fHL@wSp8a;O2^=*n9{lvMa*`m=U02}rnLKqf?^@xhryxNtBV})#2 zL)J2U6l|L<7Hl7-&|bi<-ou_SaZOhyt_J?t(;{pt`XE-;e+M$a9NZ1-7`YDldJ&mJ zA%u_d4p1NYmowP2GQ5Vvj`^&@c}L?((dbA>WPq*-E9I`Fm`zY~2TP1fK<*d8|ELV;($3o(DvMT$ITe70Vu>BVc}641`ieG(jfw066uU8&H@4=EU7PimRTTf1zA@C{ z+B3~QLwR0}f-^!9y%EE^xSq~M%|Y8UzEHA>j$F_u{6vq2&r;u6Ubow&liDT6O6t86 zw}caRPkgPlls(<;qsAx^vUGStbEDHnXHUMXYs8$;Lwox@dZr&s}>i(T#}pO}2= zsKvdKK6@j6A(aVJQ=8=Ppt?AtaC&iP|r95=98_LIaX9@J3`QU4bGQFV`aT1UzzAY ztYl=#xFaZ6_3Fv7rETFoqK|P_SS>8z?g6H3pU7;)BQ6|oL zMn71DAChN?g~?WkEMAl=^6z*B-GOJw{Rm4{dY$jrIpD};S7-krDoHh5b6`$NxqE=bQK^4R!_BHW+vmZ_-HGjR4x`ZEY zyi!f`vlt1=lb^XIw12K^d@650P;I~8S&T6c@MA7iGvTVsVz;H<^1eDJM{Zr?#652cJI=6br)DvtjIjwlAgbK)Hn41CjDe$D#)&NfOK)^lGXQMc1KkaODcjVr zY;XwP0l3Ka2UVH~ZbsNpl_uYi{+x6ovl<nHp zklzGC!deZngyKR!J9h3SHx)$LdpV=~x35J#Qrx4X>!j#%M8la(|G96Wh`HChKgC#w zLhRfjRx@lFStb#`IJyD@AEFL7@a1dM>4x|oUJD3i zMvp0e|8eQR>Ai1DQ^SsYt7Vqd zJj$KwKGrDFAD+y8GBLSlW^Q|_mkc;|J;pzXG4W29_kXBt_g-kjPX?Pi+I6|&P2DxV zgH_q!HO0>8-iJ1RU$3p|@pbig;T1;j@OQer^nVwhf(}%C3(N`bu_Da#|CX*rPry~( ziTm(bLa*A;XQr~|zgM643tfYpbdH7VKGCsL{5UFTzs;-B;>uzNSyR( z+WWoK_hTi5E4J_6_e7iZ4u$V&^Z2SxiVRP z*OL{%TmN-JX3PXWSNq-b_g@$K&{$b%z#V%odVYB&<9WVg*OYxCTg8gVH-a+6XE{Db zDt}|(rrom)waq_wY!@wIxSNkWeRbNOY|9D_^XJ;)vA4;rZ@t7kmMzO)G zBS_8+qMo0Jqj@E*om}y-^XWF%z7Nm-IG-c(yZ39{c~diD_)0#DSL-pz=Z>!kMvvG1 zd%Acw55IT$Exms}zW-XmPqCr(r;Kr7 zhO&otYB5JrV5(QW)FK1r-Sx3vajCYrDHejgC@8~YZt=Dx$vJNCKO(tG3+@>^eF9R0D1W=mFgFKzjA zSh<#Y!c*~T(fW4MNO`vgkCtcnWIlR!-v&%(q}YHVYljnI|6=dCyrRFKdrr2d^*5FI zY>iYj&T%_CZqID#hIWpT`rrUvKDT}c@3VHsPre2=v3{>V?DH_*gROWy=eR@tKE{s9 zGn4B~p1JjvK+H8^kzVbf`=-#*qGveMQGo+H<#(3Z9nl8&9RLC3a+!aaiL~>D_jEIP zEMI6XdH;$qWN`JE#CPHAX3vJ#r^IgFa&NTPKE`F;yP#vfh?Kwxm<6+-)KEGYJ-Zy?n`BpgQtbUHF zU&orzt{?T00_N;gDPmSDWT*5>I;H_u9_j;FHd{%-=B8 z1Nc33#dfSHz8h9^lt7-PzUr`1obGO9wneOy`qjrNhJu1M`+HFh7C9qimGGIUJp+B; z&HR2uy*@pN%wE$yKv`rJ%<^00PPwBDe4I{9tPzjX=bQC6$^FQxF-E8;b>CoezvzfF z`}>jk6(eVMOfCIm-OHJsv%Vvkj6Uvky>e6!osv6|IXtTwK*T;*X48KZt4P12nD4W` zBXy8egmc|9`~55DgUidh5BY<>6InE7FrEk0M)ArlX98VP&mVlYH6esCoBf<~G!3Q4 zpKU`(WG4=~(34p?+t1~@fs|k7Zsbmr1?RiD2QKxE?v63*&qnnSRlU9&y~D`9ioWQx zzS~vZjk+e^jmj=Qm2<$!(&2Ac70hmygOjock2)v3o8IU+1ZQK_=pJ9B<^{1 z9>i)xJ#b`kt!M=Rlkno%--`^LoH2%ej%P>(5B<6LytDjd%rz<;{5@`Jto+GhcY;~o z>wH>m!ftKr^LUTJ*?uOzJv76>29>+?W7(VAEOUKjzN32Y-pAYh>SLJVRNsf;5}dKJ0;V}HgcAqjyq=lN?kWT{_H=OS)`FqhXBUv zrTm-tT)Dnz*1VG3cyJmV{l4acGXcE<%2b0Tee|&cL zqGuvJCDtMLld^A6kLT>HHZ$MVz5aYeUEG<--{dUsL>*mTi=sjg{BZBt-3j{w6N?oB zy%hZp&5AqCZp63~zHuOv4xQK;JaSf8dP%(2Uwp==Gsh+?J2NA!jQb?;S)VIPFzZhW zPOvq`$(H7TcgAGz7BFMWHoNbZ?-d)GSEgWO)ZO7zdLGX9bK;+XoVY9A7xl~0H$A+| zS$^!`+K2-MHZSPu5iCd!MYP%=bQ7Ntw@m9Mde-%K6^MRh9Ut z^S+P0;d$N1eXZe#5fPiu=ZX8|2+n-(ljAn?yiXamng4wpubJE-uDS#a-R1g3q08P{O@BPKJWVk2cOS<+ykQ2+va_r(AMU8A5ai_(7f*xYS29I zQz|3#y-(Ic=6xS?`((vq{`axgG5`Bm-^S)2S0DYe_ zqdu}>o!NZU+-CIcyq_fT68GC6`ZZmpOx%A({UqpGabM?`)gNvBOZzv`A~aO4L#5UA zR14@jCf7Etr0OOrUZ_L4v-G>EYHaGt6?W)cOLgO}X4ufR)>TKvop|qb+Q@Y|eor6h zzU{kqrh4SEj~!80sQ5~URn%}qIj%?jKI8jq>t{~#eNMV2S@`q$K7Xlis~yMqq(}R< zZcL3n?|Zf;1m8@RRDnL<@8f;cPlF#YdSf4}pm$B!Wo8^!gBG8%#fYma{9ca!9ytCu zNc|%W*N?h1zemt>l*++*eh;=|?fZ0{%^7X9%j+U(Al0}qv&Why}icJrng7bcWJT8-zWQ~KR6 'pubs' GO -if CAST(SERVERPROPERTY('ProductMajorVersion') AS INT)<12 +if CAST(SERVERPROPERTY('ProductMajorVersion') AS INT)<12 BEGIN exec sp_dboption 'pubs','trunc. log on chkpt.','true' exec sp_dboption 'pubs','select into/bulkcopy','true' @@ -421,7 +421,7 @@ insert publishers values('1389', 'Algodata Infosystems', 'Berkeley', 'CA', 'USA' insert publishers values('9952', 'Scootney Books', 'New York', 'NY', 'USA') insert publishers values('1622', 'Five Lakes Publishing', 'Chicago', 'IL', 'USA') insert publishers values('1756', 'Ramona Publishers', 'Dallas', 'TX', 'USA') -insert publishers values('9901', 'GGG&G', 'Mnchen', NULL, 'Germany') +insert publishers values('9901', 'GGG&G', 'M�nchen', NULL, 'Germany') insert publishers values('9999', 'Lucerne Publishing', 'Paris', NULL, 'France') GO @@ -1670,7 +1670,7 @@ insert pub_info values('1756', 0x474946383961E3002500B30F00000000800000008000808 'This is sample text data for Ramona Publishers, publisher 1756 in the pubs database. Ramona Publishers is located in Dallas, Texas.') insert pub_info values('9901', 0x4749463839615D002200B30F00000000800000008000808000000080800080008080808080C0C0C0FF000000FF00FFFF000000FFFF00FF00FFFFFFFFFF21F9040100000F002C000000005D0022004004FFF0C949ABBD38EBCDFB03DF078C249895A386AA68BB9E6E0ACE623ABD1BC9E9985DFFB89E8E366BED782C5332563ABA4245A6744AAD5AAF4D2276CBED5EA1D026C528B230CD38B2C92721D78CC4772526748F9F611EB28DE7AFE25E818283604A1E8788898A7385838E8F55856F6C2C1D86392F6B9730708D6C5477673758A3865E92627E94754E173697A6A975809368949BB2AE7B9A6865AA734F80A2A17DA576AA5BB667C290CDCE4379CFD2CE9ED3D6A7CCD7DAA4D9C79341C8B9DF5FC052A8DEBA9BB696767B9C7FD5B8BBF23EABB9706BCAE5F05AB7E6C4C7488DDAF7251BC062530EFE93638C5B3580ECD4951312C217C425E73E89D38709D79D810D393BD20A528CE0AA704AA2D4D3082E583C89BD2C2D720753E1C8922697D44CF6AE53BF6D4041750B4AD467C54548932A1D7374A9D3A789004400003B, -'This is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G is located in München, Germany.') +'This is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G is located in M�nchen, Germany.') insert pub_info values('9952', 0x47494638396107012800B30F00000000800000008000808000000080800080008080808080C0C0C0FF000000FF00FFFF000000FFFF00FF00FFFFFFFFFF21F9040100000F002C00000000070128004004FFF0C949ABBD38EBCDBBFF60288E6469660005AC2C7BB56D05A7D24C4F339E3F765FC716980C3824F28418E4D1A552DA8ACCA5517A7B526F275912690D2A9BD11D14AB8B8257E7E9776BDEE452C2279C47A5CBEDEF2B3C3FBF9FC85981821D7D76868588878A898C8B838F1C8D928E733890829399949B979D9E9FA074A1A3A4A5A6A7458F583E69803F53AF4C62AD5E6DB13B6B3DAEAC6EBA64B365B26BB7ABBEB5C07FB428BCC4C8C1CCC7BBB065637C7A9B7BBE8CDADBDA8B7C31D9E1D88E2FA89E9AE9E49AE7EDA48DA2EEF2F3F4F597AEF6F9FAFBFC805D6CD28C0164C64D18BE3AAD88D87AA5C1DBC07FD59CE54293F0E0882AC39ED9CA2886E3308FB3FF262EBC726D591823204F2E0C09A4A3B32CFEACBC24198D86C48FD3E208D43832E3C0671A2D89737167281AA333219AC048D061499A3C83BEC8090BD84E5A99DE808B730DE9516B727CE85AE7C122BF73EAD29255CB76ADDBB6EC549C8504F7AD5DB37343A98D97576EDDBF7CFB0AEE8457EF5D4E83132BAEB1B8B1E3C749204B9EACB830E5CB984DE1F339A4E1CC88C93CB7D989D72234D1D3A672FEF85055C483C80A06742ADB664F3563119E417D5A8F52DFB1512AEC5D82E9C8662A477FB19A72B6F2E714413F8D0654AA75A8C4C648FDBC346ACDCD5487AFC439BE8BC8E8AA7F6BD77D2B7DF4E6C5882E57DFBDE2F56AEE6D87DFB8BFE06BE7E8F1C6CBCE4D2DC15751803C5956567EFA1D47A041E5F1176183CC1D571D21C2850396565CF5B1D5571D8AC21D08E099A15E85269E87207B1736B31E6FE620324E582116F5215178C86763518A9068DF7FE8C9C6207DCD0104A47B6B717388901EFA27238E3482454E43BB61E8D388F7FD44DD32473E79D43A527633232561E6F86536660256891699D175989A6F1A020A9C75C9D5E68274C619D79D91B5C5189F7906CA67297129D88F9E881A3AA83E8AB623E85E8B0EDAE89C892216E9A584B80318A69C7E3269A7A046FA69A8A4B6094004003B, 'This is sample text data for Scootney Books, publisher 9952 in the pubs database. Scootney Books is located in New York City, New York.') @@ -2099,8 +2099,8 @@ where titleauthor.royaltyper = @percentage GO CREATE PROCEDURE reptq1 AS -select - case when grouping(pub_id) = 1 then 'ALL' else pub_id end as pub_id, +select + case when grouping(pub_id) = 1 then 'ALL' else pub_id end as pub_id, avg(price) as avg_price from titles where price is NOT NULL @@ -2110,9 +2110,9 @@ order by pub_id GO CREATE PROCEDURE reptq2 AS -select - case when grouping(type) = 1 then 'ALL' else type end as type, - case when grouping(pub_id) = 1 then 'ALL' else pub_id end as pub_id, +select + case when grouping(type) = 1 then 'ALL' else type end as type, + case when grouping(pub_id) = 1 then 'ALL' else pub_id end as pub_id, avg(ytd_sales) as avg_ytd_sales from titles where pub_id is NOT NULL @@ -2123,9 +2123,9 @@ GO CREATE PROCEDURE reptq3 @lolimit money, @hilimit money, @type char(12) AS -select - case when grouping(pub_id) = 1 then 'ALL' else pub_id end as pub_id, - case when grouping(type) = 1 then 'ALL' else type end as type, +select + case when grouping(pub_id) = 1 then 'ALL' else pub_id end as pub_id, + case when grouping(type) = 1 then 'ALL' else type end as type, count(title_id) as cnt from titles where price >@lolimit AND price <@hilimit AND type = @type OR type LIKE '%cook%' diff --git a/samples/databases/wide-world-importers/power-bi-dashboards/README.md b/samples/databases/wide-world-importers/power-bi-dashboards/README.md index a55d2507..d86ee9c1 100644 --- a/samples/databases/wide-world-importers/power-bi-dashboards/README.md +++ b/samples/databases/wide-world-importers/power-bi-dashboards/README.md @@ -35,8 +35,8 @@ To run this sample, you need the following prerequisites. **Software prerequisites:** -1. [WideWorldImporters](../wwi-ssdt/) and [WideWorldImportersDW](../wwi-dw-ssdt/) sample databases running in SQL Server 2016 (or higher) or Azure SQL Database. Install from source code. -1. Power BI Desktop. Download link: [https://powerbi.microsoft.com/downloads/](https://powerbi.microsoft.com/downloads/) +1. [WideWorldImporters](../wwi-ssdt/) and [WideWorldImportersDW](../wwi-dw-ssdt/) sample databases running in SQL Server 2016 (or higher) or Azure SQL Database. Install from source code. +1. Power BI Desktop. Download link: [https://powerbi.microsoft.com/downloads/](https://powerbi.microsoft.com/downloads/) diff --git a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted - Window 2.sql b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted - Window 2.sql index 828ee9c1..2420dfb2 100644 --- a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted - Window 2.sql +++ b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted - Window 2.sql @@ -3,7 +3,7 @@ -- note this demo is continued from the first demo window --- 5b. Right-click in this window and choose Connection, then Change Connection. +-- 5b. Right-click in this window and choose Connection, then Change Connection. -- 5c. In the connection dialog, click Options. -- 5d. Type WideWorldImporters for the database name. -- 5e. Click on Additional Connection Parameters and enter: Column Encryption Setting=enabled @@ -11,8 +11,8 @@ -- Note that when acting as a client with access to the certificate, we -- can see the data. Remember that this can only work because --- the client happens to be the same machine as the server in our --- case. +-- the client happens to be the same machine as the server in our +-- case. SELECT * FROM Purchasing.Supplier_PrivateDetails ORDER BY SupplierID; GO diff --git a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted.sql b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted.sql index 24a4ab00..c893b88e 100644 --- a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted.sql +++ b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/DemonstrateAlwaysEncrypted.sql @@ -19,8 +19,8 @@ END; GO -- We need a column master key. This key is used to encrypt the column encryption keys. --- The column master key isn't really stored in the database. It's created and stored on the --- client system. SQL Server only holds a link to it so that SQL Server can tell the +-- The column master key isn't really stored in the database. It's created and stored on the +-- client system. SQL Server only holds a link to it so that SQL Server can tell the -- client application where to locate the master key. The client system will encrypt a column -- encryption key with this master key. @@ -32,14 +32,14 @@ GO -- If you do not see the Always Encrypted node, install the latest version of Management Studio (17.X or higher): https://aka.ms/ssms -- 1b. Right-click the Column Master Keys node and click New Column Master Key. -- 1c. For the name, enter WWI_ColumnMasterKey. --- 1d. Note the available entries in the Key store dropdown list. Choose Windows Certificate Store - Current User. +-- 1d. Note the available entries in the Key store dropdown list. Choose Windows Certificate Store - Current User. -- This will only be a temporary location for the certificate. -- 1e. Click Generate Certificate to create the new certificate. Note that an Always Encrypted certificate -- has been created. Ensure that it is selected, then click OK. --- We have used the MSSQL_CERTIFICATE_STORE which uses the Windows store --- but we can use any store that implements the SqlColumnEncryptionKeyStoreProvider --- class. (And is registered by calling the SqlConnection.RegisterColumnEncryptionKeyStoreProviders() +-- We have used the MSSQL_CERTIFICATE_STORE which uses the Windows store +-- but we can use any store that implements the SqlColumnEncryptionKeyStoreProvider +-- class. (And is registered by calling the SqlConnection.RegisterColumnEncryptionKeyStoreProviders() -- method). This requires .NET framework 4.6.1 or later on the client. -- The certificate could also have been created via the makecert utility and just loaded on the client. @@ -53,7 +53,7 @@ SELECT * FROM sys.column_master_keys; -- On the client system, it is protected by the column master key. -- 2a. In Object Explorer, right-click the Column Encryption Keys node and click New Column Encryption Key. --- 2b. In the Name textbox, enter WWI_ColumnEncryptionKey and from the Column master key dropdown list, +-- 2b. In the Name textbox, enter WWI_ColumnEncryptionKey and from the Column master key dropdown list, -- select WWI_ColumnMasterKey to be used to encrypt this new key. Then click OK. -- We can see the newly created encryption key. @@ -61,12 +61,12 @@ SELECT * FROM sys.column_master_keys; SELECT * FROM sys.column_encryption_keys; -- Now let's create the table that will use always encrypted. --- We'll have one deterministic encryption column and two random +-- We'll have one deterministic encryption column and two random -- encryption (salted) columns. CREATE TABLE Purchasing.Supplier_PrivateDetails ( - SupplierID int + SupplierID int CONSTRAINT PKFK_Purchasing_Supplier_PrivateDetails PRIMARY KEY CONSTRAINT FK_Purchasing_Supplier_PrivateDetails_Suppliers FOREIGN KEY REFERENCES Purchasing.Suppliers (SupplierID), @@ -89,14 +89,14 @@ GO -- Note the error returned. The data in the columns is only -- understood by the client system. -INSERT Purchasing.Supplier_PrivateDetails +INSERT Purchasing.Supplier_PrivateDetails (SupplierID, NationalID, CreditCardNumber, ExpiryDate) VALUES (1, N'93748567', N'7382-5849-2903-2838', N'11/19'); GO -- Let's ensure the table is empty, then we'll use a client application --- to populate the data. Note that we can still perform standard +-- to populate the data. Note that we can still perform standard -- table operations like truncation. TRUNCATE TABLE Purchasing.Supplier_PrivateDetails; @@ -109,10 +109,10 @@ GO SELECT * FROM Purchasing.Supplier_PrivateDetails ORDER BY SupplierID; GO --- To emulate a client application that has access to the keys, we +-- To emulate a client application that has access to the keys, we -- can use SSMS to connect. Note that this can only work because --- the client happens to be the same machine as the server in our --- case. +-- the client happens to be the same machine as the server in our +-- case. -- 5a. Open the second query window for this demonstration and follow the instructions there. diff --git a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/App.config b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/App.config index 870e2491..ac824e11 100644 --- a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/App.config +++ b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/App.config @@ -5,7 +5,7 @@

    - + diff --git a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/PopulateAlwaysEncryptedData.csproj b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/PopulateAlwaysEncryptedData.csproj index dddc08db..6e393d22 100644 --- a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/PopulateAlwaysEncryptedData.csproj +++ b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/PopulateAlwaysEncryptedData.csproj @@ -80,7 +80,7 @@ - diff --git a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/AssemblyInfo.cs b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/AssemblyInfo.cs index 23bde482..26266a64 100644 --- a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/AssemblyInfo.cs +++ b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("PopulateAlwaysEncryptedData")] @@ -14,8 +14,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -25,11 +25,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Resources.resx b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Resources.resx index af7dbebb..9c90483a 100644 --- a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Resources.resx +++ b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Settings.Designer.cs b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Settings.Designer.cs index 63c5a344..4f58fc98 100644 --- a/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Settings.Designer.cs +++ b/samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/Properties/Settings.Designer.cs @@ -9,20 +9,20 @@ //------------------------------------------------------------------------------ namespace PopulateAlwaysEncryptedData.Properties { - - + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - + public static Settings Default { get { return defaultInstance; } } - + [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] diff --git a/samples/databases/wide-world-importers/sample-scripts/dynamic-data-masking/DemonstrateDDM.SQL b/samples/databases/wide-world-importers/sample-scripts/dynamic-data-masking/DemonstrateDDM.SQL index 44cd2ec62d5197c86eb85748b0ab196db1894c9f..d1915e263ccb1bdf38ce595d76ed889608e5b7da 100644 GIT binary patch delta 15 XcmdlbzD;~Wz{a3ujGKQk9^eE3HYEn2 delta 19 bcmdlczDs;U0HeZ2|K*H~3Y)(&9^?c7MVbcO diff --git a/samples/databases/wide-world-importers/sample-scripts/in-memory-oltp/VehicleLocation.sql b/samples/databases/wide-world-importers/sample-scripts/in-memory-oltp/VehicleLocation.sql index 7b7d999906aa25d64f7f93cc02f68e1ddce9dee9..2a9dbdef30af3e1ec78ddd85be9a4d4b0cbef45c 100644 GIT binary patch delta 23 fcmewr_$_e4tBr5!_$RO8RGWN2S#I+N0WS#vn;Q!Z delta 23 fcmews_$zS2D@KKlFYEak6((Qg72aGWP$K~Vhv*5+ diff --git a/samples/databases/wide-world-importers/sample-scripts/load-sample-data-using-polybase/load-sample-data-using-polybase.sql b/samples/databases/wide-world-importers/sample-scripts/load-sample-data-using-polybase/load-sample-data-using-polybase.sql index 08297f90..e80d5634 100644 --- a/samples/databases/wide-world-importers/sample-scripts/load-sample-data-using-polybase/load-sample-data-using-polybase.sql +++ b/samples/databases/wide-world-importers/sample-scripts/load-sample-data-using-polybase/load-sample-data-using-polybase.sql @@ -2,7 +2,7 @@ -- Use PolyBase to load public data from Azure blob storage into the Wide World Importers Data Warehouse schema. -- -- This script: --- +-- -- 1. Configures PolyBase for loading from a public blob storage container. -- 2. Loads the data into columnstore indexes -- 3. Generates millions of rows in the date dimension and sales fact tables @@ -10,10 +10,10 @@ -- -- Before you begin: -- To run this tutorial, you need an Azure account that already has a SQL Data Warehouse database. --- If you don't already have this, see --- http://azure.microsoft.com/documentation/articles/sql-data-warehouse-get-started-provision.md +-- If you don't already have this, see +-- http://azure.microsoft.com/documentation/articles/sql-data-warehouse-get-started-provision.md -- --- You also need to have created a login and user that will be used for loading data. +-- You also need to have created a login and user that will be used for loading data. -- The server admin account is meant to perform management operations, and is not suited for running queries on user data. -- -- For more explanation about the loading process, this article on azure.microsoft.com explains the process in more detail. @@ -28,34 +28,34 @@ WITH TYPE = Hadoop, LOCATION = 'wasbs://wideworldimporters@sqldwholdata.blob.core.windows.net' ); - --- Specify the formatting characteristics and options for the external data file. --- This statement specifies the external data is stored as text and the values are separated by the pipe ('|') character. -CREATE EXTERNAL FILE FORMAT TextFileFormat -WITH -( + +-- Specify the formatting characteristics and options for the external data file. +-- This statement specifies the external data is stored as text and the values are separated by the pipe ('|') character. +CREATE EXTERNAL FILE FORMAT TextFileFormat +WITH +( FORMAT_TYPE = DELIMITEDTEXT, FORMAT_OPTIONS - ( + ( FIELD_TERMINATOR = '|', - USE_TYPE_DEFAULT = FALSE + USE_TYPE_DEFAULT = FALSE ) ); -- ----------------------------------STEP 2: Create schema to organize loading data and local table data ----------------------------------------------------- --- Create ext schema. It provides a way to organize the external tables you are about to create for loading data +-- Create ext schema. It provides a way to organize the external tables you are about to create for loading data CREATE SCHEMA ext; GO --- Create wwi schema. It organizes the standard tables that will contain the data. +-- Create wwi schema. It organizes the standard tables that will contain the data. CREATE SCHEMA wwi; GO -- ----------------------------------STEP 3: Create external table defintions -------------------------------------------------------------------------------- --- Create external tables. --- The table definitions are stored in SQL Data Warehouse, but the tables reference data that is stored in Azure blob storage. +-- Create external tables. +-- The table definitions are stored in SQL Data Warehouse, but the tables reference data that is stored in Azure blob storage. CREATE EXTERNAL TABLE [ext].[dimension_City]( [City Key] [int] NOT NULL, [WWI City ID] [int] NOT NULL, @@ -72,12 +72,12 @@ CREATE EXTERNAL TABLE [ext].[dimension_City]( [Valid To] [datetime2](7) NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH (LOCATION='/v1/dimension_City/', - DATA_SOURCE = WWIStorage, +WITH (LOCATION='/v1/dimension_City/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 -); +); CREATE EXTERNAL TABLE [ext].[dimension_Customer] ( [Customer Key] [int] NOT NULL, [WWI Customer ID] [int] NOT NULL, @@ -91,12 +91,12 @@ CREATE EXTERNAL TABLE [ext].[dimension_Customer] ( [Valid To] [datetime2](7) NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH (LOCATION='/v1/dimension_Customer/', - DATA_SOURCE = WWIStorage, +WITH (LOCATION='/v1/dimension_Customer/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 -); +); CREATE EXTERNAL TABLE [ext].[dimension_Employee] ( [Employee Key] [int] NOT NULL, [WWI Employee ID] [int] NOT NULL, @@ -108,8 +108,8 @@ CREATE EXTERNAL TABLE [ext].[dimension_Employee] ( [Valid To] [datetime2](7) NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION='/v1/dimension_Employee/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION='/v1/dimension_Employee/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -122,8 +122,8 @@ CREATE EXTERNAL TABLE [ext].[dimension_PaymentMethod] ( [Valid To] [datetime2](7) NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/dimension_PaymentMethod/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/dimension_PaymentMethod/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -150,8 +150,8 @@ CREATE EXTERNAL TABLE [ext].[dimension_StockItem]( [Valid To] [datetime2](7) NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/dimension_StockItem/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/dimension_StockItem/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -169,8 +169,8 @@ CREATE EXTERNAL TABLE [ext].[dimension_Supplier]( [Valid To] [datetime2](7) NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/dimension_Supplier/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/dimension_Supplier/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -182,9 +182,9 @@ CREATE EXTERNAL TABLE [ext].[dimension_TransactionType]( [Valid From] [datetime2](7) NOT NULL, [Valid To] [datetime2](7) NOT NULL, [Lineage Key] [int] NOT NULL -) -WITH ( LOCATION ='/v1/dimension_TransactionType/', - DATA_SOURCE = WWIStorage, +) +WITH ( LOCATION ='/v1/dimension_TransactionType/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -202,8 +202,8 @@ CREATE EXTERNAL TABLE [ext].[fact_Movement] ( [Quantity] [int] NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/fact_Movement/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/fact_Movement/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -229,8 +229,8 @@ CREATE EXTERNAL TABLE [ext].[fact_Order] ( [Total Including Tax] [decimal](18, 2) NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/fact_Order/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/fact_Order/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -248,8 +248,8 @@ CREATE EXTERNAL TABLE [ext].[fact_Purchase] ( [Is Order Finalized] [bit] NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/fact_Purchase/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/fact_Purchase/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -277,8 +277,8 @@ CREATE EXTERNAL TABLE [ext].[fact_Sale] ( [Total Chiller Items] [int] NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/fact_Sale/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/fact_Sale/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -294,8 +294,8 @@ CREATE EXTERNAL TABLE [ext].[fact_StockHolding] ( [Target Stock Level] [int] NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/fact_StockHolding/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/fact_StockHolding/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 @@ -320,21 +320,21 @@ CREATE EXTERNAL TABLE [ext].[fact_Transaction] ( [Is Finalized] [bit] NOT NULL, [Lineage Key] [int] NOT NULL ) -WITH ( LOCATION ='/v1/fact_Transaction/', - DATA_SOURCE = WWIStorage, +WITH ( LOCATION ='/v1/fact_Transaction/', + DATA_SOURCE = WWIStorage, FILE_FORMAT = TextFileFormat, REJECT_TYPE = VALUE, REJECT_VALUE = 0 ); - + -- ----------------------------------STEP 4: Load data into the external tables -------------------------------------------------------------------------------- --- The script below does not load data into the wwi.dimension_Date and wwi.fact_Sales tables. +-- The script below does not load data into the wwi.dimension_Date and wwi.fact_Sales tables. -- You will generate the data for this tables in a later step to make sure the tables have a sizeable number of rows CREATE TABLE [wwi].[dimension_City] WITH -( +( DISTRIBUTION = REPLICATE, CLUSTERED COLUMNSTORE INDEX ) @@ -345,7 +345,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[dimension_City]') CREATE TABLE [wwi].[dimension_Customer] WITH -( +( DISTRIBUTION = REPLICATE, CLUSTERED COLUMNSTORE INDEX ) @@ -356,7 +356,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[dimension_Customer]') CREATE TABLE [wwi].[dimension_Employee] WITH -( +( DISTRIBUTION = REPLICATE, CLUSTERED COLUMNSTORE INDEX ) @@ -367,7 +367,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[dimension_Employee]') CREATE TABLE [wwi].[dimension_PaymentMethod] WITH -( +( DISTRIBUTION = REPLICATE, CLUSTERED COLUMNSTORE INDEX ) @@ -378,7 +378,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[dimension_PaymentMethod]') CREATE TABLE [wwi].[dimension_StockItem] WITH -( +( DISTRIBUTION = REPLICATE, CLUSTERED COLUMNSTORE INDEX ) @@ -389,7 +389,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[dimension_StockItem]') CREATE TABLE [wwi].[dimension_Supplier] WITH -( +( DISTRIBUTION = REPLICATE, CLUSTERED COLUMNSTORE INDEX ) @@ -400,7 +400,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[dimension_Supplier]') CREATE TABLE [wwi].[dimension_TransactionType] WITH -( +( DISTRIBUTION = REPLICATE, CLUSTERED COLUMNSTORE INDEX ) @@ -411,7 +411,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[dimension_TransactionType]') CREATE TABLE [wwi].[fact_Movement] WITH -( +( DISTRIBUTION = HASH([Movement Key]), CLUSTERED COLUMNSTORE INDEX ) @@ -422,7 +422,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[fact_Movement]') CREATE TABLE [wwi].[fact_Order] WITH -( +( DISTRIBUTION = HASH([Order Key]), CLUSTERED COLUMNSTORE INDEX ) @@ -433,7 +433,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[fact_Order]') CREATE TABLE [wwi].[fact_Purchase] WITH -( +( DISTRIBUTION = HASH([Purchase Key]), CLUSTERED COLUMNSTORE INDEX ) @@ -444,7 +444,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[fact_Purchase]') CREATE TABLE [wwi].[seed_Sale] WITH -( +( DISTRIBUTION = HASH([WWI Invoice ID]), CLUSTERED COLUMNSTORE INDEX ) @@ -455,7 +455,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[seed_Sale]') CREATE TABLE [wwi].[fact_StockHolding] WITH -( +( DISTRIBUTION = HASH([Stock Holding Key]), CLUSTERED COLUMNSTORE INDEX ) @@ -466,7 +466,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[fact_StockHolding]') CREATE TABLE [wwi].[fact_Transaction] WITH -( +( DISTRIBUTION = HASH([Transaction Key]), CLUSTERED COLUMNSTORE INDEX ) @@ -486,7 +486,7 @@ OPTION (LABEL = 'CTAS : Load [wwi].[fact_Transaction]') -- r.status, -- count(distinct input_name) as nbr_files, -- sum(s.bytes_processed)/1024/1024/1024 as gb_processed --- FROM +-- FROM -- sys.dm_pdw_exec_requests r -- INNER JOIN sys.dm_pdw_dms_external_work s -- ON r.request_id = s.request_id @@ -508,8 +508,8 @@ OPTION (LABEL = 'CTAS : Load [wwi].[fact_Transaction]') -- s.request_id, -- r.status -- ORDER BY --- nbr_files desc, --- gb_processed desc; +-- nbr_files desc, +-- gb_processed desc; -- ----------------------------------STEP 6: Generate millions of rows for the Date dimension table and Sales fact table -------------------------------------------------------------------------------- @@ -532,7 +532,7 @@ CREATE TABLE [wwi].[dimension_Date] [Fiscal Year Label] [nvarchar](10) NOT NULL, [ISO Week Number] [int] NOT NULL ) -WITH +WITH ( DISTRIBUTION = REPLICATE, CLUSTERED INDEX ([Date]) @@ -566,9 +566,9 @@ WITH DISTRIBUTION = HASH ( [WWI Invoice ID] ), CLUSTERED COLUMNSTORE INDEX ) - --- Create [wwi].[InitialSalesDataPopulation] to increase the number of rows in [wwi].[seed_Sale] by a factor of eight. + +-- Create [wwi].[InitialSalesDataPopulation] to increase the number of rows in [wwi].[seed_Sale] by a factor of eight. CREATE PROCEDURE [wwi].[InitialSalesDataPopulation] AS BEGIN @@ -598,7 +598,7 @@ END -- Create this stored procedure that populates rows into wwi.dimension_Date. CREATE PROCEDURE [wwi].[PopulateDateDimensionForYear] @Year [int] AS BEGIN - IF OBJECT_ID('tempdb..#month', 'U') IS NOT NULL + IF OBJECT_ID('tempdb..#month', 'U') IS NOT NULL DROP TABLE #month CREATE TABLE #month ( monthnum int, @@ -608,7 +608,7 @@ BEGIN INSERT INTO #month SELECT 1, 31 UNION SELECT 2, CASE WHEN (@YEAR % 4 = 0 AND @YEAR % 100 <> 0) OR @YEAR % 400 = 0 THEN 29 ELSE 28 END UNION SELECT 3,31 UNION SELECT 4,30 UNION SELECT 5,31 UNION SELECT 6,30 UNION SELECT 7,31 UNION SELECT 8,31 UNION SELECT 9,30 UNION SELECT 10,31 UNION SELECT 11,30 UNION SELECT 12,31 - IF OBJECT_ID('tempdb..#days', 'U') IS NOT NULL + IF OBJECT_ID('tempdb..#days', 'U') IS NOT NULL DROP TABLE #days CREATE TABLE #days (days int) WITH (DISTRIBUTION = ROUND_ROBIN, HEAP) @@ -617,7 +617,7 @@ BEGIN SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23 UNION SELECT 24 UNION SELECT 25 UNION SELECT 26 UNION SELECT 27 UNION SELECT 28 UNION SELECT 29 UNION SELECT 30 UNION SELECT 31 INSERT [wwi].[dimension_Date] ( - [Date], [Day Number], [Day], [Month], [Short Month], [Calendar Month Number], [Calendar Month Label], [Calendar Year], [Calendar Year Label], [Fiscal Month Number], [Fiscal Month Label], [Fiscal Year], [Fiscal Year Label], [ISO Week Number] + [Date], [Day Number], [Day], [Month], [Short Month], [Calendar Month Number], [Calendar Month Label], [Calendar Year], [Calendar Year Label], [Fiscal Month Number], [Fiscal Month Label], [Fiscal Year], [Fiscal Year Label], [ISO Week Number] ) SELECT CAST(CAST(monthnum AS VARCHAR(2)) + '/' + CAST([days] AS VARCHAR(3)) + '/' + CAST(@year AS CHAR(4)) AS DATE) AS [Date] @@ -649,8 +649,8 @@ WHERE d.days <= m.numofdays DROP table #month; DROP table #days; END; - --- Create procedure that populates the wwi.dimension_Date and wwi.fact_Sales tables. + +-- Create procedure that populates the wwi.dimension_Date and wwi.fact_Sales tables. -- It calls [wwi].[PopulateDateDimensionForYear] to populate wwi.dimension_Date. CREATE PROCEDURE [wwi].[Configuration_PopulateLargeSaleTable] @EstimatedRowsPerDay [bigint],@Year [int] AS BEGIN @@ -661,7 +661,7 @@ BEGIN DECLARE @OrderCounter bigint = 0; DECLARE @NumberOfSalesPerDay bigint = @EstimatedRowsPerDay; - DECLARE @DateCounter date; + DECLARE @DateCounter date; DECLARE @StartingSaleKey bigint; DECLARE @MaximumSaleKey bigint = (SELECT MAX([Sale Key]) FROM wwi.seed_Sale); DECLARE @MaxDate date; @@ -693,7 +693,7 @@ BEGIN SELECT TOP(@VariantNumberOfSalesPerDay) [City Key], [Customer Key], [Bill To Customer Key], [Stock Item Key], @DateCounter, DATEADD(day, 1, @DateCounter), [Salesperson Key], [WWI Invoice ID], [Description], Package, Quantity, [Unit Price], [Tax Rate], [Total Excluding Tax], [Tax Amount], Profit, [Total Including Tax], [Total Dry Items], [Total Chiller Items], [Lineage Key] FROM [wwi].[seed_Sale] - WHERE + WHERE --[Sale Key] > @StartingSaleKey and /* IDENTITY DOES NOT WORK THE SAME IN SQLDW AND CAN'T USE THIS METHOD FOR VARIANT */ [Invoice Date Key] >=cast(@YEAR AS CHAR(4)) + '-01-01' ORDER BY [Sale Key]; @@ -709,12 +709,12 @@ EXEC [wwi].[InitialSalesDataPopulation] -- Populate wwi.fact_Sales with 100,000 rows per day for each day in the year 2000. EXEC [wwi].[Configuration_PopulateLargeSaleTable] 100000, 2000 --- The data generation in the previous step might take a while as it progresses through the year. +-- The data generation in the previous step might take a while as it progresses through the year. -- To see which day the current process is on, uncomment the query below and run it: --SELECT MAX([Invoice Date Key]) FROM wwi.fact_Sale; - + -- ----------------------------------STEP 7: Populate the replicated table cache to speed up later queries -------------------------------------------------------------------------------- --- SQL Data Warehouse replicates a table by caching the data to each Compute node. The cache only gets populated when a query runs against the table. +-- SQL Data Warehouse replicates a table by caching the data to each Compute node. The cache only gets populated when a query runs against the table. -- Therefore, the first query on a replicated table might require extra time to populate the cache. After the cache is populated, queries on replicated tables run faster. SELECT TOP 1 * FROM [wwi].[dimension_City]; @@ -728,7 +728,7 @@ SELECT TOP 1 * FROM [wwi].[dimension_TransactionType]; -- ----------------------------------STEP 8: Create statistics on newly loaded data -------------------------------------------------------------------------------------------------- --- To achieve high query performance, it's important to create statistics on each column of each table after the first load. +-- To achieve high query performance, it's important to create statistics on each column of each table after the first load. -- It's also important to update statistics after substantial changes in the data. -- Create stored procedure that updates statistics on all columns of all tables. diff --git a/samples/databases/wide-world-importers/sample-scripts/operational-analytics/DemonstrateOperationalAnalyticsPerformance.sql b/samples/databases/wide-world-importers/sample-scripts/operational-analytics/DemonstrateOperationalAnalyticsPerformance.sql index c3f062a4c3ae1a6cdee2899a3178a71379b3a8e2..717dd2b9095c9d87c4b76fb7a03d71b0be5ba9a8 100644 GIT binary patch delta 35 rcmcbobxmu7AM@q_W(k(fS?qQ!lLI&;HXq^+W11YqEw 0 --- OR IS_ROLEMEMBER((SELECT sp.SalesTerritory +-- WITH SCHEMABINDING +-- AS +-- RETURN (SELECT 1 AS AccessResult +-- WHERE IS_ROLEMEMBER(N'db_owner') <> 0 +-- OR IS_ROLEMEMBER((SELECT sp.SalesTerritory -- FROM [Application].Cities AS c -- INNER JOIN [Application].StateProvinces AS sp -- ON c.StateProvinceID = sp.StateProvinceID -- WHERE c.CityID = @CityID) + N' Sales') <> 0 --- OR (ORIGINAL_LOGIN() = N'Website' --- AND EXISTS (SELECT 1 +-- OR (ORIGINAL_LOGIN() = N'Website' +-- AND EXISTS (SELECT 1 -- FROM [Application].Cities AS c -- INNER JOIN [Application].StateProvinces AS sp -- ON c.StateProvinceID = sp.StateProvinceID --- WHERE c.CityID = @CityID +-- WHERE c.CityID = @CityID -- AND sp.SalesTerritory = SESSION_CONTEXT(N'SalesTerritory')))); -- GO -- The security policy that has been applied is as follows: -- -- CREATE SECURITY POLICY [Application].FilterCustomersBySalesTerritoryRole --- ADD FILTER PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) +-- ADD FILTER PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) -- ON Sales.Customers, --- ADD BLOCK PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) +-- ADD BLOCK PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID) -- ON Sales.Customers AFTER UPDATE; -- GO @@ -89,10 +89,10 @@ GO -- Now note the count and which rows are returned -- even though we have not changed the command -SELECT * FROM Sales.Customers; +SELECT * FROM Sales.Customers; GO --- where are those customers? +-- where are those customers? -- note the spatial results tab SELECT c.Border @@ -111,7 +111,7 @@ DECLARE @NonGreatLakesCityID INT -- pick a customer in the Great Lakes sales territory SELECT TOP 1 @GreatLakesCustomerID=c.CustomerID -FROM Sales.Customers c JOIN Application.Cities ci ON c.DeliveryCityID=ci.CityID +FROM Sales.Customers c JOIN Application.Cities ci ON c.DeliveryCityID=ci.CityID JOIN Application.StateProvinces sp ON ci.StateProvinceID=sp.StateProvinceID WHERE sp.SalesTerritory=N'Great Lakes' diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/App.config b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/App.config index 7a7ac481..a0e202f9 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/App.config +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/App.config @@ -5,7 +5,7 @@
    - + diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.Designer.cs b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.Designer.cs index 5bee2142..937bbfd5 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.Designer.cs +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.Designer.cs @@ -33,9 +33,9 @@ this.label2 = new System.Windows.Forms.Label(); this.OKButton = new System.Windows.Forms.Button(); this.SuspendLayout(); - // + // // MainMessageTextBox - // + // this.MainMessageTextBox.BackColor = System.Drawing.SystemColors.Info; this.MainMessageTextBox.Location = new System.Drawing.Point(29, 12); this.MainMessageTextBox.Multiline = true; @@ -46,9 +46,9 @@ this.MainMessageTextBox.Text = "This program is meant to be used to provide an intense order entry insert workloa" + "d for the WideWorldImporters database. Please check that you are connected to a " + "valid copy of that database."; - // + // // DetailedErrorMessageTextBox - // + // this.DetailedErrorMessageTextBox.BackColor = System.Drawing.Color.LightCyan; this.DetailedErrorMessageTextBox.Location = new System.Drawing.Point(29, 105); this.DetailedErrorMessageTextBox.Multiline = true; @@ -57,18 +57,18 @@ this.DetailedErrorMessageTextBox.Size = new System.Drawing.Size(942, 294); this.DetailedErrorMessageTextBox.TabIndex = 2; this.DetailedErrorMessageTextBox.TabStop = false; - // + // // label2 - // + // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(26, 86); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(165, 16); this.label2.TabIndex = 4; this.label2.Text = "Detailed error message:"; - // + // // OKButton - // + // this.OKButton.Location = new System.Drawing.Point(446, 417); this.OKButton.Name = "OKButton"; this.OKButton.Size = new System.Drawing.Size(125, 37); @@ -76,9 +76,9 @@ this.OKButton.Text = "&OK"; this.OKButton.UseVisualStyleBackColor = true; this.OKButton.Click += new System.EventHandler(this.OKButton_Click); - // + // // ErrorDetailsForm - // + // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1017, 466); diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.resx b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.resx index 1af7de15..8b2ff64a 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.resx +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/ErrorFormMain.resx @@ -1,17 +1,17 @@  - diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/MultithreadedOrderInsert.csproj b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/MultithreadedOrderInsert.csproj index 8747441d..a0a2f2d0 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/MultithreadedOrderInsert.csproj +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/MultithreadedOrderInsert.csproj @@ -90,7 +90,7 @@ - diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/AssemblyInfo.cs b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/AssemblyInfo.cs index 2bad47e5..d58297ba 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/AssemblyInfo.cs +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("MultithreadedInMemoryTableInsert")] @@ -14,8 +14,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -25,11 +25,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.Designer.cs b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.Designer.cs index 7de4b23f..db9df691 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.Designer.cs +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace MultithreadedOrderInsert.Properties { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -23,15 +23,15 @@ namespace MultithreadedOrderInsert.Properties { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// @@ -45,7 +45,7 @@ namespace MultithreadedOrderInsert.Properties { return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.resx b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.resx index af7dbebb..9c90483a 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.resx +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Settings.Designer.cs b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Settings.Designer.cs index 09f40b0d..4e6d10e5 100644 --- a/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Settings.Designer.cs +++ b/samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/Properties/Settings.Designer.cs @@ -9,20 +9,20 @@ //------------------------------------------------------------------------------ namespace MultithreadedOrderInsert.Properties { - - + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - + public static Settings Default { get { return defaultInstance; } } - + [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/App.config b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/App.config index e031a091..03213b6c 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/App.config +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/App.config @@ -5,7 +5,7 @@
    - + diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.Designer.cs b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.Designer.cs index b72d359a..ae6b7c7f 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.Designer.cs +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.Designer.cs @@ -34,9 +34,9 @@ this.label2 = new System.Windows.Forms.Label(); this.OKButton = new System.Windows.Forms.Button(); this.SuspendLayout(); - // + // // MainMessageTextBox - // + // this.MainMessageTextBox.BackColor = System.Drawing.SystemColors.Info; this.MainMessageTextBox.Location = new System.Drawing.Point(29, 12); this.MainMessageTextBox.Multiline = true; @@ -45,9 +45,9 @@ this.MainMessageTextBox.TabIndex = 1; this.MainMessageTextBox.TabStop = false; this.MainMessageTextBox.Text = resources.GetString("MainMessageTextBox.Text"); - // + // // DetailedErrorMessageTextBox - // + // this.DetailedErrorMessageTextBox.BackColor = System.Drawing.Color.LightCyan; this.DetailedErrorMessageTextBox.Location = new System.Drawing.Point(29, 105); this.DetailedErrorMessageTextBox.Multiline = true; @@ -56,18 +56,18 @@ this.DetailedErrorMessageTextBox.Size = new System.Drawing.Size(942, 294); this.DetailedErrorMessageTextBox.TabIndex = 2; this.DetailedErrorMessageTextBox.TabStop = false; - // + // // label2 - // + // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(26, 86); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(165, 16); this.label2.TabIndex = 4; this.label2.Text = "Detailed error message:"; - // + // // OKButton - // + // this.OKButton.Location = new System.Drawing.Point(446, 417); this.OKButton.Name = "OKButton"; this.OKButton.Size = new System.Drawing.Size(125, 37); @@ -75,9 +75,9 @@ this.OKButton.Text = "&OK"; this.OKButton.UseVisualStyleBackColor = true; this.OKButton.Click += new System.EventHandler(this.OKButton_Click); - // + // // ErrorDetailsForm - // + // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1017, 466); diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.resx b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.resx index ed4a8604..abe95d92 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.resx +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/ErrorFormMain.resx @@ -1,17 +1,17 @@  - diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/MultithreadedInMemoryTableInsert.csproj b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/MultithreadedInMemoryTableInsert.csproj index 12739c46..9492f656 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/MultithreadedInMemoryTableInsert.csproj +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/MultithreadedInMemoryTableInsert.csproj @@ -89,7 +89,7 @@ - diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/AssemblyInfo.cs b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/AssemblyInfo.cs index 2bad47e5..d58297ba 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/AssemblyInfo.cs +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("MultithreadedInMemoryTableInsert")] @@ -14,8 +14,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -25,11 +25,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Resources.resx b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Resources.resx index af7dbebb..9c90483a 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Resources.resx +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Settings.Designer.cs b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Settings.Designer.cs index 3176f3ff..fc08bb4e 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Settings.Designer.cs +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/Properties/Settings.Designer.cs @@ -9,20 +9,20 @@ //------------------------------------------------------------------------------ namespace MultithreadedInMemoryTableInsert.Properties { - - + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - + public static Settings Default { get { return defaultInstance; } } - + [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("")] diff --git a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/VehicleLocation.sql b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/VehicleLocation.sql index c6fa6f71..a9c5f643 100644 --- a/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/VehicleLocation.sql +++ b/samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/VehicleLocation.sql @@ -1,5 +1,5 @@ -- This script enables the database for In-Memory OLTP if it is not already. --- Then, it creates comparable disk-based and memory-optimized tables, as well as corresponding stored procedures +-- Then, it creates comparable disk-based and memory-optimized tables, as well as corresponding stored procedures -- for vehicle location insertion. @@ -7,19 +7,19 @@ SET NOCOUNT ON; SET XACT_ABORT ON; -- 1. validate that In-Memory OLTP is supported -IF SERVERPROPERTY(N'IsXTPSupported') = 0 -BEGIN +IF SERVERPROPERTY(N'IsXTPSupported') = 0 +BEGIN PRINT N'Error: In-Memory OLTP is not supported for this server edition or database pricing tier.'; -END +END IF DB_ID() < 5 -BEGIN +BEGIN PRINT N'Error: In-Memory OLTP is not supported in system databases. Connect to a user database.'; -END -ELSE -BEGIN +END +ELSE +BEGIN BEGIN TRY; -- 2. add MEMORY_OPTIMIZED_DATA filegroup when not using Azure SQL DB - IF SERVERPROPERTY('EngineEdition') != 5 + IF SERVERPROPERTY('EngineEdition') != 5 BEGIN DECLARE @SQLDataFolder nvarchar(max) = cast(SERVERPROPERTY('InstanceDefaultDataPath') as nvarchar(max)) DECLARE @MODName nvarchar(max) = DB_NAME() + N'_mod'; @@ -31,7 +31,7 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE type = N'FX') BEGIN SET @SQL = N' -ALTER DATABASE CURRENT +ALTER DATABASE CURRENT ADD FILEGROUP ' + QUOTENAME(@MODName) + N' CONTAINS MEMORY_OPTIMIZED_DATA;'; EXECUTE (@SQL); @@ -41,7 +41,7 @@ ADD FILEGROUP ' + QUOTENAME(@MODName) + N' CONTAINS MEMORY_OPTIMIZED_DATA;'; SET @SQL = N' ALTER DATABASE CURRENT ADD FILE (name = N''' + @MODName + ''', filename = ''' - + @MemoryOptimizedFilegroupFolder + N''') + + @MemoryOptimizedFilegroupFolder + N''') TO FILEGROUP ' + QUOTENAME(@MODName); EXECUTE (@SQL); END @@ -50,7 +50,7 @@ TO FILEGROUP ' + QUOTENAME(@MODName); -- 3. set compat level to 130 if it is lower IF (SELECT compatibility_level FROM sys.databases WHERE database_id=DB_ID()) < 130 - ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130 + ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130 -- 4. enable MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT for the database ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON; @@ -123,7 +123,7 @@ CREATE TABLE InMemory.VehicleLocations ) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA); GO - + CREATE PROCEDURE InMemory.InsertVehicleLocation @RegistrationNumber nvarchar(20), @TrackedWhen datetime2(2), diff --git a/samples/databases/wide-world-importers/wwi-app/Controllers/FrontEndController.cs b/samples/databases/wide-world-importers/wwi-app/Controllers/FrontEndController.cs index e604d6bd..824aedd5 100644 --- a/samples/databases/wide-world-importers/wwi-app/Controllers/FrontEndController.cs +++ b/samples/databases/wide-world-importers/wwi-app/Controllers/FrontEndController.cs @@ -21,7 +21,7 @@ namespace wwi_app.Controllers this.queryService = queryService; this._logger = logger; } - + public async Task Login(string username, string password) { if(string.IsNullOrEmpty(username)) diff --git a/samples/databases/wide-world-importers/wwi-app/Controllers/ODataController.tt b/samples/databases/wide-world-importers/wwi-app/Controllers/ODataController.tt index 1db9b5f0..7f26e760 100644 --- a/samples/databases/wide-world-importers/wwi-app/Controllers/ODataController.tt +++ b/samples/databases/wide-world-importers/wwi-app/Controllers/ODataController.tt @@ -78,7 +78,7 @@ namespace wwi_app.Controllers } <#+ - public class TableDef { + public class TableDef { public string Schema {get; set;} public string Table {get; set;} public string ODataColumns {get; set;} diff --git a/samples/databases/wide-world-importers/wwi-app/Startup.cs b/samples/databases/wide-world-importers/wwi-app/Startup.cs index 72fb38c3..9e31a14e 100644 --- a/samples/databases/wide-world-importers/wwi-app/Startup.cs +++ b/samples/databases/wide-world-importers/wwi-app/Startup.cs @@ -30,9 +30,9 @@ namespace App public void ConfigureServices(IServiceCollection services) { services.AddSingleton(); - + services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) - .AddCookie(o => + .AddCookie(o => { o.LoginPath = new PathString("/Index"); o.AccessDeniedPath = new PathString("/Index"); @@ -46,11 +46,11 @@ namespace App options.SessionContext .Add("SalesTerritory", GetTerritoryFromSession); options.EnableODataExtensions = true; - + }); services.AddAuthorization(); - + // Add framework services. services.AddMvc(); } diff --git a/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Customers.cshtml b/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Customers.cshtml index a467f29a..54ee8dd7 100644 --- a/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Customers.cshtml +++ b/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Customers.cshtml @@ -82,7 +82,7 @@
    -
    +
    , ()
    diff --git a/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Offers.cshtml b/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Offers.cshtml index 13c02e1a..973ed6d4 100644 --- a/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Offers.cshtml +++ b/samples/databases/wide-world-importers/wwi-app/Views/FrontEnd/Offers.cshtml @@ -102,7 +102,7 @@ $(".product-tags-r>li").view(data.tags.slice(data.tags.length / 2 + 1, data.tags.length)); } else { $(".product-tags-r").hide(); - } + } } diff --git a/samples/databases/wide-world-importers/wwi-app/Views/Shared/_InvoicesForm.cshtml b/samples/databases/wide-world-importers/wwi-app/Views/Shared/_InvoicesForm.cshtml index 6611a4ea..abbfdf0a 100644 --- a/samples/databases/wide-world-importers/wwi-app/Views/Shared/_InvoicesForm.cshtml +++ b/samples/databases/wide-world-importers/wwi-app/Views/Shared/_InvoicesForm.cshtml @@ -22,7 +22,7 @@
    - +
    diff --git a/samples/databases/wide-world-importers/wwi-app/Views/Shared/_Layout.cshtml b/samples/databases/wide-world-importers/wwi-app/Views/Shared/_Layout.cshtml index 720aeeb0..ecd868d4 100644 --- a/samples/databases/wide-world-importers/wwi-app/Views/Shared/_Layout.cshtml +++ b/samples/databases/wide-world-importers/wwi-app/Views/Shared/_Layout.cshtml @@ -94,10 +94,10 @@
  • }
  • Contact
  • - + @if (User.Identity.IsAuthenticated) { -
    - +
    diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/OData.tt b/samples/databases/wide-world-importers/wwi-app/wwwroot/OData.tt index 207c6cee..7bbb8135 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/OData.tt +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/OData.tt @@ -96,7 +96,7 @@ paths: 500: description: "OData service cannot process request"<# } #> <#+ - public class TableDef { + public class TableDef { public string Schema {get; set;} public string Table {get; set;} public string ODataColumns {get; set;} diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/CustomerTransactions.Edit.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/CustomerTransactions.Edit.js index c273a5d9..130e788f 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/CustomerTransactions.Edit.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/CustomerTransactions.Edit.js @@ -1,5 +1,5 @@ $(() => { - + var $table = $("#customerTransactions").DataTable(); var $form = $("#EditCustomerTransactionForm"); var $dlg = $("#modalCustomerTransactionDialog"); diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Customers.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Customers.js index 59b978e5..86974323 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Customers.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Customers.js @@ -23,7 +23,7 @@ }); var $formCustomer = $("#EditCustomerForm"); - + o('CustomerCategories') .select('CustomerCategoryID,CustomerCategoryName') .get(categories => $("#CustomerCategoryID", $formCustomer).view(categories)); @@ -58,7 +58,7 @@ toastr.error('An error occured while trying to get the customer.') ); }); - + $("button#cancel-customer-edit").on("click", e => { $("body").trigger("close-customer-edit"); diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Dashboard.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Dashboard.js index 8ab773f7..b452fd0a 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Dashboard.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Dashboard.js @@ -1,5 +1,5 @@ $(() => { - + $.ajax('/odata/Customers?$apply=groupby((PostalCity),aggregate(CustomerID with sum as Total))&$orderby=CustomerID with sum desc&$top=5', { dataType: 'json' }) .done(data => { $("#part1 table tbody tr").view(data.value); diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.Edit.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.Edit.js index 8bdd289b..f234eb27 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.Edit.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.Edit.js @@ -21,7 +21,7 @@ }) .fail(e => toastr.error('An error occured while trying to get the invoice.')); }); - + $("button#save-invoice").on("click", e => { var id = $("#InvoiceID", $formInvoiceEdit).val(); diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.js index fecb8573..85987ed6 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Invoices.js @@ -1,3 +1,3 @@ -/// Code is placed in the following files: +/// Code is placed in the following files: /// /// \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SalesOrders.Edit.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SalesOrders.Edit.js index e085b908..4244f193 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SalesOrders.Edit.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SalesOrders.Edit.js @@ -39,7 +39,7 @@ console.error(e); }); }); - + $("button#save-order").on("click", e => { var id = $("#OrderID", $formOrder).val(); diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SupplierTransactions.Edit.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SupplierTransactions.Edit.js index 76991597..11c8a840 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SupplierTransactions.Edit.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/SupplierTransactions.Edit.js @@ -1,5 +1,5 @@ $(() => { - + var $form = $("#EditSupplierTransactionForm"); var $dlg = $("#modalSupplierTransactionDialog"); diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.StockItemsTable.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.StockItemsTable.js index d5405016..fb614e90 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.StockItemsTable.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.StockItemsTable.js @@ -1,5 +1,5 @@ $(() => { - + $("#stockItems") .DataTable({ ajax: { url: "/OData/StockItems?$top=0", dataSrc: "value" }, diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.js index 2ee60db1..8067c872 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/js/Suppliers.js @@ -31,7 +31,7 @@ o('DeliveryMethods') .select('DeliveryMethodID,DeliveryMethodName') .get(list => $("#DeliveryMethodID", $formOrder).view(list)); - + $table.on("click", "button.edit", e => { $formSupplier[0].reset(); diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap.js index f69acdc6..393fd748 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap.js @@ -155,7 +155,7 @@ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, bu }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap4.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap4.js index 7977fd79..87575700 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap4.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.bootstrap4.js @@ -157,7 +157,7 @@ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, bu }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.material.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.material.js index ffdaf123..e9ecccf4 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.material.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.material.js @@ -164,7 +164,7 @@ DataTable.ext.renderer.pageButton.material = function ( settings, host, idx, but }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.semanticui.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.semanticui.js index c19ffe06..872e554b 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.semanticui.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.semanticui.js @@ -166,7 +166,7 @@ DataTable.ext.renderer.pageButton.semanticUI = function ( settings, host, idx, b }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.uikit.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.uikit.js index 2e617613..fc29add9 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.uikit.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/dataTables.uikit.js @@ -149,7 +149,7 @@ DataTable.ext.renderer.pageButton.uikit = function ( settings, host, idx, button }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/jquery.dataTables.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/jquery.dataTables.js index 88cdab91..4f8d2bac 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/jquery.dataTables.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/datatables/media/js/jquery.dataTables.js @@ -1586,7 +1586,7 @@ /** * DataTables utility methods - * + * * This namespace provides helper methods that DataTables uses internally to * create a DataTable, but which are not exclusively used only for DataTables. * These methods can be used by extension authors to save the duplication of @@ -2233,7 +2233,7 @@ var i, ien, j, jen, k, ken; var col, cell, detectedType, cache; - // For each column, spin over the + // For each column, spin over the for ( i=0, ien=columns.length ; iEmpty string - */ - "sSearch": "", - - /** - * Flag to indicate if the search term should be interpreted as a - * regular expression (true) or not (false) and therefore and special - * regex characters escaped. - * @type boolean - * @default false - */ - "bRegex": false, - - /** - * Flag to indicate if DataTables is to use its smart filtering or not. - * @type boolean - * @default true - */ - "bSmart": true - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * each individual row. This is the object format used for the settings - * aoData array. - * @namespace - */ - DataTable.models.oRow = { - /** - * TR element for the row - * @type node - * @default null - */ - "nTr": null, - - /** - * Array of TD elements for each row. This is null until the row has been - * created. - * @type array nodes - * @default [] - */ - "anCells": null, - - /** - * Data object from the original data source for the row. This is either - * an array if using the traditional form of DataTables, or an object if - * using mData options. The exact type will depend on the passed in - * data from the data source, or will be an array if using DOM a data - * source. - * @type array|object - * @default [] - */ - "_aData": [], - - /** - * Sorting data cache - this array is ostensibly the same length as the - * number of columns (although each index is generated only as it is - * needed), and holds the data that is used for sorting each column in the - * row. We do this cache generation at the start of the sort in order that - * the formatting of the sort data need be done only once for each cell - * per sort. This array should not be read from or written to by anything - * other than the master sorting methods. - * @type array - * @default null - * @private - */ - "_aSortData": null, - - /** - * Per cell filtering data cache. As per the sort data cache, used to - * increase the performance of the filtering in DataTables - * @type array - * @default null - * @private - */ - "_aFilterData": null, - - /** - * Filtering data cache. This is the same as the cell filtering cache, but - * in this case a string rather than an array. This is easily computed with - * a join on `_aFilterData`, but is provided as a cache so the join isn't - * needed on every search (memory traded for performance) - * @type array - * @default null - * @private - */ - "_sFilterRow": null, - - /** - * Cache of the class name that DataTables has applied to the row, so we - * can quickly look at this variable rather than needing to do a DOM check - * on className for the nTr property. - * @type string - * @default Empty string - * @private - */ - "_sRowStripe": "", - - /** - * Denote if the original data source was from the DOM, or the data source - * object. This is used for invalidating data, so DataTables can - * automatically read data from the original source, unless uninstructed - * otherwise. - * @type string - * @default null - * @private - */ - "src": null, - - /** - * Index in the aoData array. This saves an indexOf lookup when we have the - * object, but want to know the index - * @type integer - * @default -1 - * @private - */ - "idx": -1 - }; - - - /** - * Template object for the column information object in DataTables. This object - * is held in the settings aoColumns array and contains all the information that - * DataTables needs about each individual column. - * - * Note that this object is related to {@link DataTable.defaults.column} - * but this one is the internal data store for DataTables's cache of columns. - * It should NOT be manipulated outside of DataTables. Any configuration should - * be done through the initialisation options. - * @namespace - */ - DataTable.models.oColumn = { - /** - * Column index. This could be worked out on-the-fly with $.inArray, but it - * is faster to just hold it as a variable - * @type integer - * @default null - */ - "idx": null, - - /** - * A list of the columns that sorting should occur on when this column - * is sorted. That this property is an array allows multi-column sorting - * to be defined for a column (for example first name / last name columns - * would benefit from this). The values are integers pointing to the - * columns to be sorted on (typically it will be a single integer pointing - * at itself, but that doesn't need to be the case). - * @type array - */ - "aDataSort": null, - - /** - * Define the sorting directions that are applied to the column, in sequence - * as the column is repeatedly sorted upon - i.e. the first value is used - * as the sorting direction when the column if first sorted (clicked on). - * Sort it again (click again) and it will move on to the next index. - * Repeat until loop. - * @type array - */ - "asSorting": null, - - /** - * Flag to indicate if the column is searchable, and thus should be included - * in the filtering or not. - * @type boolean - */ - "bSearchable": null, - - /** - * Flag to indicate if the column is sortable or not. - * @type boolean - */ - "bSortable": null, - - /** - * Flag to indicate if the column is currently visible in the table or not - * @type boolean - */ - "bVisible": null, - - /** - * Store for manual type assignment using the `column.type` option. This - * is held in store so we can manipulate the column's `sType` property. - * @type string - * @default null - * @private - */ - "_sManualType": null, - - /** - * Flag to indicate if HTML5 data attributes should be used as the data - * source for filtering or sorting. True is either are. - * @type boolean - * @default false - * @private - */ - "_bAttrSrc": false, - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @default null - */ - "fnCreatedCell": null, - - /** - * Function to get data from a cell in a column. You should never - * access data directly through _aData internally in DataTables - always use - * the method attached to this property. It allows mData to function as - * required. This function is automatically assigned by the column - * initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {string} sSpecific The specific data type you want to get - - * 'display', 'type' 'filter' 'sort' - * @returns {*} The data for the cell from the given row's data - * @default null - */ - "fnGetData": null, - - /** - * Function to set data for a cell in the column. You should never - * set the data directly to _aData internally in DataTables - always use - * this method. It allows mData to function as required. This function - * is automatically assigned by the column initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {*} sValue Value to set - * @default null - */ - "fnSetData": null, - - /** - * Property to read the value for the cells in the column from the data - * source array / object. If null, then the default content is used, if a - * function is given then the return from the function is used. - * @type function|int|string|null - * @default null - */ - "mData": null, - - /** - * Partner property to mData which is used (only when defined) to get - * the data - i.e. it is basically the same as mData, but without the - * 'set' option, and also the data fed to it is the result from mData. - * This is the rendering method to match the data method of mData. - * @type function|int|string|null - * @default null - */ - "mRender": null, - - /** - * Unique header TH/TD element for this column - this is what the sorting - * listener is attached to (if sorting is enabled.) - * @type node - * @default null - */ - "nTh": null, - - /** - * Unique footer TH/TD element for this column (if there is one). Not used - * in DataTables as such, but can be used for plug-ins to reference the - * footer for each column. - * @type node - * @default null - */ - "nTf": null, - - /** - * The class to apply to all TD elements in the table's TBODY for the column - * @type string - * @default null - */ - "sClass": null, - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * @type string - */ - "sContentPadding": null, - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mData - * is set to null, or because the data source itself is null). - * @type string - * @default null - */ - "sDefaultContent": null, - - /** - * Name for the column, allowing reference to the column by name as well as - * by index (needs a lookup to work by name). - * @type string - */ - "sName": null, - - /** - * Custom sorting data type - defines which of the available plug-ins in - * afnSortData the custom sorting will use - if any is defined. - * @type string - * @default std - */ - "sSortDataType": 'std', - - /** - * Class to be applied to the header element when sorting on this column - * @type string - * @default null - */ - "sSortingClass": null, - - /** - * Class to be applied to the header element when sorting on this column - - * when jQuery UI theming is used. - * @type string - * @default null - */ - "sSortingClassJUI": null, - - /** - * Title of the column - what is seen in the TH element (nTh). - * @type string - */ - "sTitle": null, - - /** - * Column sorting and filtering type - * @type string - * @default null - */ - "sType": null, - - /** - * Width of the column - * @type string - * @default null - */ - "sWidth": null, - - /** - * Width of the column when it was first "encountered" - * @type string - * @default null - */ - "sWidthOrig": null - }; - - - /* - * Developer note: The properties of the object below are given in Hungarian - * notation, that was used as the interface for DataTables prior to v1.10, however - * from v1.10 onwards the primary interface is camel case. In order to avoid - * breaking backwards compatibility utterly with this change, the Hungarian - * version is still, internally the primary interface, but is is not documented - * - hence the @name tags in each doc comment. This allows a Javascript function - * to create a map from Hungarian notation to camel case (going the other direction - * would require each property to be listed, which would at around 3K to the size - * of DataTables, while this method is about a 0.5K hit. - * - * Ultimately this does pave the way for Hungarian notation to be dropped - * completely, but that is a massive amount of work and will break current - * installs (therefore is on-hold until v2). - */ - - /** - * Initialisation options that can be given to DataTables at initialisation - * time. - * @namespace - */ - DataTable.defaults = { - /** - * An array of data to use for the table, passed in at initialisation which - * will be used in preference to any data which is already in the DOM. This is - * particularly useful for constructing tables purely in Javascript, for - * example with a custom Ajax call. - * @type array - * @default null - * - * @dtopt Option - * @name DataTable.defaults.data - * - * @example - * // Using a 2D array data source - * $(document).ready( function () { - * $('#example').dataTable( { - * "data": [ - * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], - * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], - * ], - * "columns": [ - * { "title": "Engine" }, - * { "title": "Browser" }, - * { "title": "Platform" }, - * { "title": "Version" }, - * { "title": "Grade" } - * ] - * } ); - * } ); - * - * @example - * // Using an array of objects as a data source (`data`) - * $(document).ready( function () { - * $('#example').dataTable( { - * "data": [ - * { - * "engine": "Trident", - * "browser": "Internet Explorer 4.0", - * "platform": "Win 95+", - * "version": 4, - * "grade": "X" - * }, - * { - * "engine": "Trident", - * "browser": "Internet Explorer 5.0", - * "platform": "Win 95+", - * "version": 5, - * "grade": "C" - * } - * ], - * "columns": [ - * { "title": "Engine", "data": "engine" }, - * { "title": "Browser", "data": "browser" }, - * { "title": "Platform", "data": "platform" }, - * { "title": "Version", "data": "version" }, - * { "title": "Grade", "data": "grade" } - * ] - * } ); - * } ); - */ - "aaData": null, - - - /** - * If ordering is enabled, then DataTables will perform a first pass sort on - * initialisation. You can define which column(s) the sort is performed - * upon, and the sorting direction, with this variable. The `sorting` array - * should contain an array for each column to be sorted initially containing - * the column's index and a direction string ('asc' or 'desc'). - * @type array - * @default [[0,'asc']] - * - * @dtopt Option - * @name DataTable.defaults.order - * - * @example - * // Sort by 3rd column first, and then 4th column - * $(document).ready( function() { - * $('#example').dataTable( { - * "order": [[2,'asc'], [3,'desc']] - * } ); - * } ); - * - * // No initial sorting - * $(document).ready( function() { - * $('#example').dataTable( { - * "order": [] - * } ); - * } ); - */ - "aaSorting": [[0,'asc']], - - - /** - * This parameter is basically identical to the `sorting` parameter, but - * cannot be overridden by user interaction with the table. What this means - * is that you could have a column (visible or hidden) which the sorting - * will always be forced on first - any sorting after that (from the user) - * will then be performed as required. This can be useful for grouping rows - * together. - * @type array - * @default null - * - * @dtopt Option - * @name DataTable.defaults.orderFixed - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "orderFixed": [[0,'asc']] - * } ); - * } ) - */ - "aaSortingFixed": [], - - - /** - * DataTables can be instructed to load data to display in the table from a - * Ajax source. This option defines how that Ajax call is made and where to. - * - * The `ajax` property has three different modes of operation, depending on - * how it is defined. These are: - * - * * `string` - Set the URL from where the data should be loaded from. - * * `object` - Define properties for `jQuery.ajax`. - * * `function` - Custom data get function - * - * `string` - * -------- - * - * As a string, the `ajax` property simply defines the URL from which - * DataTables will load data. - * - * `object` - * -------- - * - * As an object, the parameters in the object are passed to - * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control - * of the Ajax request. DataTables has a number of default parameters which - * you can override using this option. Please refer to the jQuery - * documentation for a full description of the options available, although - * the following parameters provide additional options in DataTables or - * require special consideration: - * - * * `data` - As with jQuery, `data` can be provided as an object, but it - * can also be used as a function to manipulate the data DataTables sends - * to the server. The function takes a single parameter, an object of - * parameters with the values that DataTables has readied for sending. An - * object may be returned which will be merged into the DataTables - * defaults, or you can add the items to the object that was passed in and - * not return anything from the function. This supersedes `fnServerParams` - * from DataTables 1.9-. - * - * * `dataSrc` - By default DataTables will look for the property `data` (or - * `aaData` for compatibility with DataTables 1.9-) when obtaining data - * from an Ajax source or for server-side processing - this parameter - * allows that property to be changed. You can use Javascript dotted - * object notation to get a data source for multiple levels of nesting, or - * it my be used as a function. As a function it takes a single parameter, - * the JSON returned from the server, which can be manipulated as - * required, with the returned value being that used by DataTables as the - * data source for the table. This supersedes `sAjaxDataProp` from - * DataTables 1.9-. - * - * * `success` - Should not be overridden it is used internally in - * DataTables. To manipulate / transform the data returned by the server - * use `ajax.dataSrc`, or use `ajax` as a function (see below). - * - * `function` - * ---------- - * - * As a function, making the Ajax call is left up to yourself allowing - * complete control of the Ajax request. Indeed, if desired, a method other - * than Ajax could be used to obtain the required data, such as Web storage - * or an AIR database. - * - * The function is given four parameters and no return is required. The - * parameters are: - * - * 1. _object_ - Data to send to the server - * 2. _function_ - Callback function that must be executed when the required - * data has been obtained. That data should be passed into the callback - * as the only parameter - * 3. _object_ - DataTables settings object for the table - * - * Note that this supersedes `fnServerData` from DataTables 1.9-. - * - * @type string|object|function - * @default null - * - * @dtopt Option - * @name DataTable.defaults.ajax - * @since 1.10.0 - * - * @example - * // Get JSON data from a file via Ajax. - * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default). - * $('#example').dataTable( { - * "ajax": "data.json" - * } ); - * - * @example - * // Get JSON data from a file via Ajax, using `dataSrc` to change - * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`) - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": "tableData" - * } - * } ); - * - * @example - * // Get JSON data from a file via Ajax, using `dataSrc` to read data - * // from a plain array rather than an array in an object - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": "" - * } - * } ); - * - * @example - * // Manipulate the data returned from the server - add a link to data - * // (note this can, should, be done using `render` for the column - this - * // is just a simple example of how the data can be manipulated). - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": function ( json ) { - * for ( var i=0, ien=json.length ; iView message'; - * } - * return json; - * } - * } - * } ); - * - * @example - * // Add data to the request - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "data": function ( d ) { - * return { - * "extra_search": $('#extra').val() - * }; - * } - * } - * } ); - * - * @example - * // Send request as POST - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "type": "POST" - * } - * } ); - * - * @example - * // Get the data from localStorage (could interface with a form for - * // adding, editing and removing rows). - * $('#example').dataTable( { - * "ajax": function (data, callback, settings) { - * callback( - * JSON.parse( localStorage.getItem('dataTablesData') ) - * ); - * } - * } ); - */ - "ajax": null, - - - /** - * This parameter allows you to readily specify the entries in the length drop - * down menu that DataTables shows when pagination is enabled. It can be - * either a 1D array of options which will be used for both the displayed - * option and the value, or a 2D array which will use the array in the first - * position as the value, and the array in the second position as the - * displayed options (useful for language strings such as 'All'). - * - * Note that the `pageLength` property will be automatically set to the - * first value given in this array, unless `pageLength` is also provided. - * @type array - * @default [ 10, 25, 50, 100 ] - * - * @dtopt Option - * @name DataTable.defaults.lengthMenu - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] - * } ); - * } ); - */ - "aLengthMenu": [ 10, 25, 50, 100 ], - - - /** - * The `columns` option in the initialisation parameter allows you to define - * details about the way individual columns behave. For a full list of - * column options that can be set, please see - * {@link DataTable.defaults.column}. Note that if you use `columns` to - * define your columns, you must have an entry in the array for every single - * column that you have in your table (these can be null if you don't which - * to specify any options). - * @member - * - * @name DataTable.defaults.column - */ - "aoColumns": null, - - /** - * Very similar to `columns`, `columnDefs` allows you to target a specific - * column, multiple columns, or all columns, using the `targets` property of - * each object in the array. This allows great flexibility when creating - * tables, as the `columnDefs` arrays can be of any length, targeting the - * columns you specifically want. `columnDefs` may use any of the column - * options available: {@link DataTable.defaults.column}, but it _must_ - * have `targets` defined in each object in the array. Values in the `targets` - * array may be: - *
      - *
    • a string - class name will be matched on the TH for the column
    • - *
    • 0 or a positive integer - column index counting from the left
    • - *
    • a negative integer - column index counting from the right
    • - *
    • the string "_all" - all columns (i.e. assign a default)
    • - *
    - * @member - * - * @name DataTable.defaults.columnDefs - */ - "aoColumnDefs": null, - - - /** - * Basically the same as `search`, this parameter defines the individual column - * filtering state at initialisation time. The array must be of the same size - * as the number of columns, and each element be an object with the parameters - * `search` and `escapeRegex` (the latter is optional). 'null' is also - * accepted and the default will be used. - * @type array - * @default [] - * - * @dtopt Option - * @name DataTable.defaults.searchCols - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "searchCols": [ - * null, - * { "search": "My filter" }, - * null, - * { "search": "^[0-9]", "escapeRegex": false } - * ] - * } ); - * } ) - */ - "aoSearchCols": [], - - - /** - * An array of CSS classes that should be applied to displayed rows. This - * array may be of any length, and DataTables will apply each class - * sequentially, looping when required. - * @type array - * @default null Will take the values determined by the `oClasses.stripe*` - * options - * - * @dtopt Option - * @name DataTable.defaults.stripeClasses - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ] - * } ); - * } ) - */ - "asStripeClasses": null, - - - /** - * Enable or disable automatic column width calculation. This can be disabled - * as an optimisation (it takes some time to calculate the widths) if the - * tables widths are passed in using `columns`. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.autoWidth - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "autoWidth": false - * } ); - * } ); - */ - "bAutoWidth": true, - - - /** - * Deferred rendering can provide DataTables with a huge speed boost when you - * are using an Ajax or JS data source for the table. This option, when set to - * true, will cause DataTables to defer the creation of the table elements for - * each row until they are needed for a draw - saving a significant amount of - * time. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.deferRender - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajax": "sources/arrays.txt", - * "deferRender": true - * } ); - * } ); - */ - "bDeferRender": false, - - - /** - * Replace a DataTable which matches the given selector and replace it with - * one which has the properties of the new initialisation object passed. If no - * table matches the selector, then the new DataTable will be constructed as - * per normal. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.destroy - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "srollY": "200px", - * "paginate": false - * } ); - * - * // Some time later.... - * $('#example').dataTable( { - * "filter": false, - * "destroy": true - * } ); - * } ); - */ - "bDestroy": false, - - - /** - * Enable or disable filtering of data. Filtering in DataTables is "smart" in - * that it allows the end user to input multiple words (space separated) and - * will match a row containing those words, even if not in the order that was - * specified (this allow matching across multiple columns). Note that if you - * wish to use filtering in DataTables this must remain 'true' - to remove the - * default filtering input box and retain filtering abilities, please use - * {@link DataTable.defaults.dom}. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.searching - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "searching": false - * } ); - * } ); - */ - "bFilter": true, - - - /** - * Enable or disable the table information display. This shows information - * about the data that is currently visible on the page, including information - * about filtered data if that action is being performed. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.info - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "info": false - * } ); - * } ); - */ - "bInfo": true, - - - /** - * Allows the end user to select the size of a formatted page from a select - * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`). - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.lengthChange - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "lengthChange": false - * } ); - * } ); - */ - "bLengthChange": true, - - - /** - * Enable or disable pagination. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.paging - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "paging": false - * } ); - * } ); - */ - "bPaginate": true, - - - /** - * Enable or disable the display of a 'processing' indicator when the table is - * being processed (e.g. a sort). This is particularly useful for tables with - * large amounts of data where it can take a noticeable amount of time to sort - * the entries. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.processing - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "processing": true - * } ); - * } ); - */ - "bProcessing": false, - - - /** - * Retrieve the DataTables object for the given selector. Note that if the - * table has already been initialised, this parameter will cause DataTables - * to simply return the object that has already been set up - it will not take - * account of any changes you might have made to the initialisation object - * passed to DataTables (setting this parameter to true is an acknowledgement - * that you understand this). `destroy` can be used to reinitialise a table if - * you need. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.retrieve - * - * @example - * $(document).ready( function() { - * initTable(); - * tableActions(); - * } ); - * - * function initTable () - * { - * return $('#example').dataTable( { - * "scrollY": "200px", - * "paginate": false, - * "retrieve": true - * } ); - * } - * - * function tableActions () - * { - * var table = initTable(); - * // perform API operations with oTable - * } - */ - "bRetrieve": false, - - - /** - * When vertical (y) scrolling is enabled, DataTables will force the height of - * the table's viewport to the given height at all times (useful for layout). - * However, this can look odd when filtering data down to a small data set, - * and the footer is left "floating" further down. This parameter (when - * enabled) will cause DataTables to collapse the table's viewport down when - * the result set will fit within the given Y height. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.scrollCollapse - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollY": "200", - * "scrollCollapse": true - * } ); - * } ); - */ - "bScrollCollapse": false, - - - /** - * Configure DataTables to use server-side processing. Note that the - * `ajax` parameter must also be given in order to give DataTables a - * source to obtain the required data for each draw. - * @type boolean - * @default false - * - * @dtopt Features - * @dtopt Server-side - * @name DataTable.defaults.serverSide - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "xhr.php" - * } ); - * } ); - */ - "bServerSide": false, - - - /** - * Enable or disable sorting of columns. Sorting of individual columns can be - * disabled by the `sortable` option for each column. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.ordering - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "ordering": false - * } ); - * } ); - */ - "bSort": true, - - - /** - * Enable or display DataTables' ability to sort multiple columns at the - * same time (activated by shift-click by the user). - * @type boolean - * @default true - * - * @dtopt Options - * @name DataTable.defaults.orderMulti - * - * @example - * // Disable multiple column sorting ability - * $(document).ready( function () { - * $('#example').dataTable( { - * "orderMulti": false - * } ); - * } ); - */ - "bSortMulti": true, - - - /** - * Allows control over whether DataTables should use the top (true) unique - * cell that is found for a single column, or the bottom (false - default). - * This is useful when using complex headers. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.orderCellsTop - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "orderCellsTop": true - * } ); - * } ); - */ - "bSortCellsTop": false, - - - /** - * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and - * `sorting\_3` to the columns which are currently being sorted on. This is - * presented as a feature switch as it can increase processing time (while - * classes are removed and added) so for large data sets you might want to - * turn this off. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.orderClasses - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "orderClasses": false - * } ); - * } ); - */ - "bSortClasses": true, - - - /** - * Enable or disable state saving. When enabled HTML5 `localStorage` will be - * used to save table display information such as pagination information, - * display length, filtering and sorting. As such when the end user reloads - * the page the display display will match what thy had previously set up. - * - * Due to the use of `localStorage` the default state saving is not supported - * in IE6 or 7. If state saving is required in those browsers, use - * `stateSaveCallback` to provide a storage solution such as cookies. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.stateSave - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "stateSave": true - * } ); - * } ); - */ - "bStateSave": false, - - - /** - * This function is called when a TR element is created (and all TD child - * elements have been inserted), or registered if using a DOM source, allowing - * manipulation of the TR element (adding classes etc). - * @type function - * @param {node} row "TR" element for the current row - * @param {array} data Raw data array for this row - * @param {int} dataIndex The index of this row in the internal aoData array - * - * @dtopt Callbacks - * @name DataTable.defaults.createdRow - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "createdRow": function( row, data, dataIndex ) { - * // Bold the grade for all 'A' grade browsers - * if ( data[4] == "A" ) - * { - * $('td:eq(4)', row).html( 'A' ); - * } - * } - * } ); - * } ); - */ - "fnCreatedRow": null, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify any aspect you want about the created DOM. - * @type function - * @param {object} settings DataTables settings object - * - * @dtopt Callbacks - * @name DataTable.defaults.drawCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "drawCallback": function( settings ) { - * alert( 'DataTables has redrawn the table' ); - * } - * } ); - * } ); - */ - "fnDrawCallback": null, - - - /** - * Identical to fnHeaderCallback() but for the table footer this function - * allows you to modify the table footer on every 'draw' event. - * @type function - * @param {node} foot "TR" element for the footer - * @param {array} data Full table data (as derived from the original HTML) - * @param {int} start Index for the current display starting point in the - * display array - * @param {int} end Index for the current display ending point in the - * display array - * @param {array int} display Index array to translate the visual position - * to the full data array - * - * @dtopt Callbacks - * @name DataTable.defaults.footerCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "footerCallback": function( tfoot, data, start, end, display ) { - * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start; - * } - * } ); - * } ) - */ - "fnFooterCallback": null, - - - /** - * When rendering large numbers in the information element for the table - * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers - * to have a comma separator for the 'thousands' units (e.g. 1 million is - * rendered as "1,000,000") to help readability for the end user. This - * function will override the default method DataTables uses. - * @type function - * @member - * @param {int} toFormat number to be formatted - * @returns {string} formatted string for DataTables to show the number - * - * @dtopt Callbacks - * @name DataTable.defaults.formatNumber - * - * @example - * // Format a number using a single quote for the separator (note that - * // this can also be done with the language.thousands option) - * $(document).ready( function() { - * $('#example').dataTable( { - * "formatNumber": function ( toFormat ) { - * return toFormat.toString().replace( - * /\B(?=(\d{3})+(?!\d))/g, "'" - * ); - * }; - * } ); - * } ); - */ - "fnFormatNumber": function ( toFormat ) { - return toFormat.toString().replace( - /\B(?=(\d{3})+(?!\d))/g, - this.oLanguage.sThousands - ); - }, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify the header row. This can be used to calculate and - * display useful information about the table. - * @type function - * @param {node} head "TR" element for the header - * @param {array} data Full table data (as derived from the original HTML) - * @param {int} start Index for the current display starting point in the - * display array - * @param {int} end Index for the current display ending point in the - * display array - * @param {array int} display Index array to translate the visual position - * to the full data array - * - * @dtopt Callbacks - * @name DataTable.defaults.headerCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fheaderCallback": function( head, data, start, end, display ) { - * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records"; - * } - * } ); - * } ) - */ - "fnHeaderCallback": null, - - - /** - * The information element can be used to convey information about the current - * state of the table. Although the internationalisation options presented by - * DataTables are quite capable of dealing with most customisations, there may - * be times where you wish to customise the string further. This callback - * allows you to do exactly that. - * @type function - * @param {object} oSettings DataTables settings object - * @param {int} start Starting position in data for the draw - * @param {int} end End position in data for the draw - * @param {int} max Total number of rows in the table (regardless of - * filtering) - * @param {int} total Total number of rows in the data set, after filtering - * @param {string} pre The string that DataTables has formatted using it's - * own rules - * @returns {string} The string to be displayed in the information element. - * - * @dtopt Callbacks - * @name DataTable.defaults.infoCallback - * - * @example - * $('#example').dataTable( { - * "infoCallback": function( settings, start, end, max, total, pre ) { - * return start +" to "+ end; - * } - * } ); - */ - "fnInfoCallback": null, - - - /** - * Called when the table has been initialised. Normally DataTables will - * initialise sequentially and there will be no need for this function, - * however, this does not hold true when using external language information - * since that is obtained using an async XHR call. - * @type function - * @param {object} settings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - * - * @dtopt Callbacks - * @name DataTable.defaults.initComplete - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "initComplete": function(settings, json) { - * alert( 'DataTables has finished its initialisation.' ); - * } - * } ); - * } ) - */ - "fnInitComplete": null, - - - /** - * Called at the very start of each table draw and can be used to cancel the - * draw by returning false, any other return (including undefined) results in - * the full draw occurring). - * @type function - * @param {object} settings DataTables settings object - * @returns {boolean} False will cancel the draw, anything else (including no - * return) will allow it to complete. - * - * @dtopt Callbacks - * @name DataTable.defaults.preDrawCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "preDrawCallback": function( settings ) { - * if ( $('#test').val() == 1 ) { - * return false; - * } - * } - * } ); - * } ); - */ - "fnPreDrawCallback": null, - - - /** - * This function allows you to 'post process' each row after it have been - * generated for each table draw, but before it is rendered on screen. This - * function might be used for setting the row class name etc. - * @type function - * @param {node} row "TR" element for the current row - * @param {array} data Raw data array for this row - * @param {int} displayIndex The display index for the current table draw - * @param {int} displayIndexFull The index of the data in the full list of - * rows (after filtering) - * - * @dtopt Callbacks - * @name DataTable.defaults.rowCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "rowCallback": function( row, data, displayIndex, displayIndexFull ) { - * // Bold the grade for all 'A' grade browsers - * if ( data[4] == "A" ) { - * $('td:eq(4)', row).html( 'A' ); - * } - * } - * } ); - * } ); - */ - "fnRowCallback": null, - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * This parameter allows you to override the default function which obtains - * the data from the server so something more suitable for your application. - * For example you could use POST data, or pull information from a Gears or - * AIR database. - * @type function - * @member - * @param {string} source HTTP source to obtain the data from (`ajax`) - * @param {array} data A key/value pair object containing the data to send - * to the server - * @param {function} callback to be called on completion of the data get - * process that will draw the data on the page. - * @param {object} settings DataTables settings object - * - * @dtopt Callbacks - * @dtopt Server-side - * @name DataTable.defaults.serverData - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "fnServerData": null, - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * It is often useful to send extra data to the server when making an Ajax - * request - for example custom filtering information, and this callback - * function makes it trivial to send extra information to the server. The - * passed in parameter is the data set that has been constructed by - * DataTables, and you can add to this or modify it as you require. - * @type function - * @param {array} data Data array (array of objects which are name/value - * pairs) that has been constructed by DataTables and will be sent to the - * server. In the case of Ajax sourced data with server-side processing - * this will be an empty array, for server-side processing there will be a - * significant number of parameters! - * @returns {undefined} Ensure that you modify the data array passed in, - * as this is passed by reference. - * - * @dtopt Callbacks - * @dtopt Server-side - * @name DataTable.defaults.serverParams - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "fnServerParams": null, - - - /** - * Load the table state. With this function you can define from where, and how, the - * state of a table is loaded. By default DataTables will load from `localStorage` - * but you might wish to use a server-side database or cookies. - * @type function - * @member - * @param {object} settings DataTables settings object - * @param {object} callback Callback that can be executed when done. It - * should be passed the loaded state object. - * @return {object} The DataTables state object to be loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoadCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadCallback": function (settings, callback) { - * $.ajax( { - * "url": "/state_load", - * "dataType": "json", - * "success": function (json) { - * callback( json ); - * } - * } ); - * } - * } ); - * } ); - */ - "fnStateLoadCallback": function ( settings ) { - try { - return JSON.parse( - (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem( - 'DataTables_'+settings.sInstance+'_'+location.pathname - ) - ); - } catch (e) {} - }, - - - /** - * Callback which allows modification of the saved state prior to loading that state. - * This callback is called when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state. Note that for - * plug-in authors, you should use the `stateLoadParams` event to load parameters for - * a plug-in. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object that is to be loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoadParams - * - * @example - * // Remove a saved filter, so filtering is never loaded - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadParams": function (settings, data) { - * data.oSearch.sSearch = ""; - * } - * } ); - * } ); - * - * @example - * // Disallow state loading by returning false - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadParams": function (settings, data) { - * return false; - * } - * } ); - * } ); - */ - "fnStateLoadParams": null, - - - /** - * Callback that is called when the state has been loaded from the state saving method - * and the DataTables settings object has been modified as a result of the loaded state. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object that was loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoaded - * - * @example - * // Show an alert with the filtering value that was saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoaded": function (settings, data) { - * alert( 'Saved filter was: '+data.oSearch.sSearch ); - * } - * } ); - * } ); - */ - "fnStateLoaded": null, - - - /** - * Save the table state. This function allows you to define where and how the state - * information for the table is stored By default DataTables will use `localStorage` - * but you might wish to use a server-side database or cookies. - * @type function - * @member - * @param {object} settings DataTables settings object - * @param {object} data The state object to be saved - * - * @dtopt Callbacks - * @name DataTable.defaults.stateSaveCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateSaveCallback": function (settings, data) { - * // Send an Ajax request to the server with the state object - * $.ajax( { - * "url": "/state_save", - * "data": data, - * "dataType": "json", - * "method": "POST" - * "success": function () {} - * } ); - * } - * } ); - * } ); - */ - "fnStateSaveCallback": function ( settings, data ) { - try { - (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem( - 'DataTables_'+settings.sInstance+'_'+location.pathname, - JSON.stringify( data ) - ); - } catch (e) {} - }, - - - /** - * Callback which allows modification of the state to be saved. Called when the table - * has changed state a new state save is required. This method allows modification of - * the state saving object prior to actually doing the save, including addition or - * other state properties or modification. Note that for plug-in authors, you should - * use the `stateSaveParams` event to save parameters for a plug-in. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object to be saved - * - * @dtopt Callbacks - * @name DataTable.defaults.stateSaveParams - * - * @example - * // Remove a saved filter, so filtering is never saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateSaveParams": function (settings, data) { - * data.oSearch.sSearch = ""; - * } - * } ); - * } ); - */ - "fnStateSaveParams": null, - - - /** - * Duration for which the saved state information is considered valid. After this period - * has elapsed the state will be returned to the default. - * Value is given in seconds. - * @type int - * @default 7200 (2 hours) - * - * @dtopt Options - * @name DataTable.defaults.stateDuration - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateDuration": 60*60*24; // 1 day - * } ); - * } ) - */ - "iStateDuration": 7200, - - - /** - * When enabled DataTables will not make a request to the server for the first - * page draw - rather it will use the data already on the page (no sorting etc - * will be applied to it), thus saving on an XHR at load time. `deferLoading` - * is used to indicate that deferred loading is required, but it is also used - * to tell DataTables how many records there are in the full table (allowing - * the information element and pagination to be displayed correctly). In the case - * where a filtering is applied to the table on initial load, this can be - * indicated by giving the parameter as an array, where the first element is - * the number of records available after filtering and the second element is the - * number of records without filtering (allowing the table information element - * to be shown correctly). - * @type int | array - * @default null - * - * @dtopt Options - * @name DataTable.defaults.deferLoading - * - * @example - * // 57 records available in the table, no filtering applied - * $(document).ready( function() { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "scripts/server_processing.php", - * "deferLoading": 57 - * } ); - * } ); - * - * @example - * // 57 records after filtering, 100 without filtering (an initial filter applied) - * $(document).ready( function() { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "scripts/server_processing.php", - * "deferLoading": [ 57, 100 ], - * "search": { - * "search": "my_filter" - * } - * } ); - * } ); - */ - "iDeferLoading": null, - - - /** - * Number of rows to display on a single page when using pagination. If - * feature enabled (`lengthChange`) then the end user will be able to override - * this to a custom setting using a pop-up menu. - * @type int - * @default 10 - * - * @dtopt Options - * @name DataTable.defaults.pageLength - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "pageLength": 50 - * } ); - * } ) - */ - "iDisplayLength": 10, - - - /** - * Define the starting point for data display when using DataTables with - * pagination. Note that this parameter is the number of records, rather than - * the page number, so if you have 10 records per page and want to start on - * the third page, it should be "20". - * @type int - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.displayStart - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "displayStart": 20 - * } ); - * } ) - */ - "iDisplayStart": 0, - - - /** - * By default DataTables allows keyboard navigation of the table (sorting, paging, - * and filtering) by adding a `tabindex` attribute to the required elements. This - * allows you to tab through the controls and press the enter key to activate them. - * The tabindex is default 0, meaning that the tab follows the flow of the document. - * You can overrule this using this parameter if you wish. Use a value of -1 to - * disable built-in keyboard navigation. - * @type int - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.tabIndex - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "tabIndex": 1 - * } ); - * } ); - */ - "iTabIndex": 0, - - - /** - * Classes that DataTables assigns to the various components and features - * that it adds to the HTML table. This allows classes to be configured - * during initialisation in addition to through the static - * {@link DataTable.ext.oStdClasses} object). - * @namespace - * @name DataTable.defaults.classes - */ - "oClasses": {}, - - - /** - * All strings that DataTables uses in the user interface that it creates - * are defined in this object, allowing you to modified them individually or - * completely replace them all as required. - * @namespace - * @name DataTable.defaults.language - */ - "oLanguage": { - /** - * Strings that are used for WAI-ARIA labels and controls only (these are not - * actually visible on the page, but will be read by screenreaders, and thus - * must be internationalised as well). - * @namespace - * @name DataTable.defaults.language.aria - */ - "oAria": { - /** - * ARIA label that is added to the table headers when the column may be - * sorted ascending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * - * @dtopt Language - * @name DataTable.defaults.language.aria.sortAscending - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "aria": { - * "sortAscending": " - click/return to sort ascending" - * } - * } - * } ); - * } ); - */ - "sSortAscending": ": activate to sort column ascending", - - /** - * ARIA label that is added to the table headers when the column may be - * sorted descending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * - * @dtopt Language - * @name DataTable.defaults.language.aria.sortDescending - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "aria": { - * "sortDescending": " - click/return to sort descending" - * } - * } - * } ); - * } ); - */ - "sSortDescending": ": activate to sort column descending" - }, - - /** - * Pagination string used by DataTables for the built-in pagination - * control types. - * @namespace - * @name DataTable.defaults.language.paginate - */ - "oPaginate": { - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the first page. - * @type string - * @default First - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.first - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "first": "First page" - * } - * } - * } ); - * } ); - */ - "sFirst": "First", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the last page. - * @type string - * @default Last - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.last - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "last": "Last page" - * } - * } - * } ); - * } ); - */ - "sLast": "Last", - - - /** - * Text to use for the 'next' pagination button (to take the user to the - * next page). - * @type string - * @default Next - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.next - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "next": "Next page" - * } - * } - * } ); - * } ); - */ - "sNext": "Next", - - - /** - * Text to use for the 'previous' pagination button (to take the user to - * the previous page). - * @type string - * @default Previous - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.previous - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "previous": "Previous page" - * } - * } - * } ); - * } ); - */ - "sPrevious": "Previous" - }, - - /** - * This string is shown in preference to `zeroRecords` when the table is - * empty of data (regardless of filtering). Note that this is an optional - * parameter - if it is not given, the value of `zeroRecords` will be used - * instead (either the default or given value). - * @type string - * @default No data available in table - * - * @dtopt Language - * @name DataTable.defaults.language.emptyTable - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "emptyTable": "No data available in table" - * } - * } ); - * } ); - */ - "sEmptyTable": "No data available in table", - - - /** - * This string gives information to the end user about the information - * that is current on display on the page. The following tokens can be - * used in the string and will be dynamically replaced as the table - * display updates. This tokens can be placed anywhere in the string, or - * removed as needed by the language requires: - * - * * `\_START\_` - Display index of the first record on the current page - * * `\_END\_` - Display index of the last record on the current page - * * `\_TOTAL\_` - Number of records in the table after filtering - * * `\_MAX\_` - Number of records in the table without filtering - * * `\_PAGE\_` - Current page number - * * `\_PAGES\_` - Total number of pages of data in the table - * - * @type string - * @default Showing _START_ to _END_ of _TOTAL_ entries - * - * @dtopt Language - * @name DataTable.defaults.language.info - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "info": "Showing page _PAGE_ of _PAGES_" - * } - * } ); - * } ); - */ - "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", - - - /** - * Display information string for when the table is empty. Typically the - * format of this string should match `info`. - * @type string - * @default Showing 0 to 0 of 0 entries - * - * @dtopt Language - * @name DataTable.defaults.language.infoEmpty - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoEmpty": "No entries to show" - * } - * } ); - * } ); - */ - "sInfoEmpty": "Showing 0 to 0 of 0 entries", - - - /** - * When a user filters the information in a table, this string is appended - * to the information (`info`) to give an idea of how strong the filtering - * is. The variable _MAX_ is dynamically updated. - * @type string - * @default (filtered from _MAX_ total entries) - * - * @dtopt Language - * @name DataTable.defaults.language.infoFiltered - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoFiltered": " - filtering from _MAX_ records" - * } - * } ); - * } ); - */ - "sInfoFiltered": "(filtered from _MAX_ total entries)", - - - /** - * If can be useful to append extra information to the info string at times, - * and this variable does exactly that. This information will be appended to - * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are - * being used) at all times. - * @type string - * @default Empty string - * - * @dtopt Language - * @name DataTable.defaults.language.infoPostFix - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoPostFix": "All records shown are derived from real information." - * } - * } ); - * } ); - */ - "sInfoPostFix": "", - - - /** - * This decimal place operator is a little different from the other - * language options since DataTables doesn't output floating point - * numbers, so it won't ever use this for display of a number. Rather, - * what this parameter does is modify the sort methods of the table so - * that numbers which are in a format which has a character other than - * a period (`.`) as a decimal place will be sorted numerically. - * - * Note that numbers with different decimal places cannot be shown in - * the same table and still be sortable, the table must be consistent. - * However, multiple different tables on the page can use different - * decimal place characters. - * @type string - * @default - * - * @dtopt Language - * @name DataTable.defaults.language.decimal - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "decimal": "," - * "thousands": "." - * } - * } ); - * } ); - */ - "sDecimal": "", - - - /** - * DataTables has a build in number formatter (`formatNumber`) which is - * used to format large numbers that are used in the table information. - * By default a comma is used, but this can be trivially changed to any - * character you wish with this parameter. - * @type string - * @default , - * - * @dtopt Language - * @name DataTable.defaults.language.thousands - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "thousands": "'" - * } - * } ); - * } ); - */ - "sThousands": ",", - - - /** - * Detail the action that will be taken when the drop down menu for the - * pagination length option is changed. The '_MENU_' variable is replaced - * with a default select list of 10, 25, 50 and 100, and can be replaced - * with a custom select box if required. - * @type string - * @default Show _MENU_ entries - * - * @dtopt Language - * @name DataTable.defaults.language.lengthMenu - * - * @example - * // Language change only - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "lengthMenu": "Display _MENU_ records" - * } - * } ); - * } ); - * - * @example - * // Language and options change - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "lengthMenu": 'Display records' - * } - * } ); - * } ); - */ - "sLengthMenu": "Show _MENU_ entries", - - - /** - * When using Ajax sourced data and during the first draw when DataTables is - * gathering the data, this message is shown in an empty row in the table to - * indicate to the end user the the data is being loaded. Note that this - * parameter is not used when loading data by server-side processing, just - * Ajax sourced data with client-side processing. - * @type string - * @default Loading... - * - * @dtopt Language - * @name DataTable.defaults.language.loadingRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "loadingRecords": "Please wait - loading..." - * } - * } ); - * } ); - */ - "sLoadingRecords": "Loading...", - - - /** - * Text which is displayed when the table is processing a user action - * (usually a sort command or similar). - * @type string - * @default Processing... - * - * @dtopt Language - * @name DataTable.defaults.language.processing - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "processing": "DataTables is currently busy" - * } - * } ); - * } ); - */ - "sProcessing": "Processing...", - - - /** - * Details the actions that will be taken when the user types into the - * filtering input text box. The variable "_INPUT_", if used in the string, - * is replaced with the HTML text box for the filtering input allowing - * control over where it appears in the string. If "_INPUT_" is not given - * then the input box is appended to the string automatically. - * @type string - * @default Search: - * - * @dtopt Language - * @name DataTable.defaults.language.search - * - * @example - * // Input text box will be appended at the end automatically - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Filter records:" - * } - * } ); - * } ); - * - * @example - * // Specify where the filter should appear - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Apply filter _INPUT_ to table" - * } - * } ); - * } ); - */ - "sSearch": "Search:", - - - /** - * Assign a `placeholder` attribute to the search `input` element - * @type string - * @default - * - * @dtopt Language - * @name DataTable.defaults.language.searchPlaceholder - */ - "sSearchPlaceholder": "", - - - /** - * All of the language information can be stored in a file on the - * server-side, which DataTables will look up if this parameter is passed. - * It must store the URL of the language file, which is in a JSON format, - * and the object has the same properties as the oLanguage object in the - * initialiser object (i.e. the above parameters). Please refer to one of - * the example language files to see how this works in action. - * @type string - * @default Empty string - i.e. disabled - * - * @dtopt Language - * @name DataTable.defaults.language.url - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt" - * } - * } ); - * } ); - */ - "sUrl": "", - - - /** - * Text shown inside the table records when the is no information to be - * displayed after filtering. `emptyTable` is shown when there is simply no - * information in the table at all (regardless of filtering). - * @type string - * @default No matching records found - * - * @dtopt Language - * @name DataTable.defaults.language.zeroRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "zeroRecords": "No records to display" - * } - * } ); - * } ); - */ - "sZeroRecords": "No matching records found" - }, - - - /** - * This parameter allows you to have define the global filtering state at - * initialisation time. As an object the `search` parameter must be - * defined, but all other parameters are optional. When `regex` is true, - * the search string will be treated as a regular expression, when false - * (default) it will be treated as a straight string. When `smart` - * DataTables will use it's smart filtering methods (to word match at - * any point in the data), when false this will not be done. - * @namespace - * @extends DataTable.models.oSearch - * - * @dtopt Options - * @name DataTable.defaults.search - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "search": {"search": "Initial search"} - * } ); - * } ) - */ - "oSearch": $.extend( {}, DataTable.models.oSearch ), - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * By default DataTables will look for the property `data` (or `aaData` for - * compatibility with DataTables 1.9-) when obtaining data from an Ajax - * source or for server-side processing - this parameter allows that - * property to be changed. You can use Javascript dotted object notation to - * get a data source for multiple levels of nesting. - * @type string - * @default data - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxDataProp - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxDataProp": "data", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * You can instruct DataTables to load data from an external - * source using this parameter (use aData if you want to pass data in you - * already have). Simply provide a url a JSON object can be obtained from. - * @type string - * @default null - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxSource - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxSource": null, - - - /** - * This initialisation variable allows you to specify exactly where in the - * DOM you want DataTables to inject the various controls it adds to the page - * (for example you might want the pagination controls at the top of the - * table). DIV elements (with or without a custom class) can also be added to - * aid styling. The follow syntax is used: - *
      - *
    • The following options are allowed: - *
        - *
      • 'l' - Length changing
      • - *
      • 'f' - Filtering input
      • - *
      • 't' - The table!
      • - *
      • 'i' - Information
      • - *
      • 'p' - Pagination
      • - *
      • 'r' - pRocessing
      • - *
      - *
    • - *
    • The following constants are allowed: - *
        - *
      • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
      • - *
      • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
      • - *
      - *
    • - *
    • The following syntax is expected: - *
        - *
      • '<' and '>' - div elements
      • - *
      • '<"class" and '>' - div with a class
      • - *
      • '<"#id" and '>' - div with an ID
      • - *
      - *
    • - *
    • Examples: - *
        - *
      • '<"wrapper"flipt>'
      • - *
      • '<lf<t>ip>'
      • - *
      - *
    • - *
    - * @type string - * @default lfrtip (when `jQueryUI` is false) or - * <"H"lfr>t<"F"ip> (when `jQueryUI` is true) - * - * @dtopt Options - * @name DataTable.defaults.dom - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "dom": '<"top"i>rt<"bottom"flp><"clear">' - * } ); - * } ); - */ - "sDom": "lfrtip", - - - /** - * Search delay option. This will throttle full table searches that use the - * DataTables provided search input element (it does not effect calls to - * `dt-api search()`, providing a delay before the search is made. - * @type integer - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.searchDelay - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "searchDelay": 200 - * } ); - * } ) - */ - "searchDelay": null, - - - /** - * DataTables features six different built-in options for the buttons to - * display for pagination control: - * - * * `numbers` - Page number buttons only - * * `simple` - 'Previous' and 'Next' buttons only - * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers - * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons - * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers - * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers - * - * Further methods can be added using {@link DataTable.ext.oPagination}. - * @type string - * @default simple_numbers - * - * @dtopt Options - * @name DataTable.defaults.pagingType - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "pagingType": "full_numbers" - * } ); - * } ) - */ - "sPaginationType": "simple_numbers", - - - /** - * Enable horizontal scrolling. When a table is too wide to fit into a - * certain layout, or you have a large number of columns in the table, you - * can enable x-scrolling to show the table in a viewport, which can be - * scrolled. This property can be `true` which will allow the table to - * scroll horizontally when needed, or any CSS unit, or a number (in which - * case it will be treated as a pixel measurement). Setting as simply `true` - * is recommended. - * @type boolean|string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollX - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": true, - * "scrollCollapse": true - * } ); - * } ); - */ - "sScrollX": "", - - - /** - * This property can be used to force a DataTable to use more width than it - * might otherwise do when x-scrolling is enabled. For example if you have a - * table which requires to be well spaced, this parameter is useful for - * "over-sizing" the table, and thus forcing scrolling. This property can by - * any CSS unit, or a number (in which case it will be treated as a pixel - * measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Options - * @name DataTable.defaults.scrollXInner - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": "100%", - * "scrollXInner": "110%" - * } ); - * } ); - */ - "sScrollXInner": "", - - - /** - * Enable vertical scrolling. Vertical scrolling will constrain the DataTable - * to the given height, and enable scrolling for any data which overflows the - * current viewport. This can be used as an alternative to paging to display - * a lot of data in a small area (although paging and scrolling can both be - * enabled at the same time). This property can be any CSS unit, or a number - * (in which case it will be treated as a pixel measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollY - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollY": "200px", - * "paginate": false - * } ); - * } ); - */ - "sScrollY": "", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * Set the HTTP method that is used to make the Ajax call for server-side - * processing or Ajax sourced data. - * @type string - * @default GET - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.serverMethod - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sServerMethod": "GET", - - - /** - * DataTables makes use of renderers when displaying HTML elements for - * a table. These renderers can be added or modified by plug-ins to - * generate suitable mark-up for a site. For example the Bootstrap - * integration plug-in for DataTables uses a paging button renderer to - * display pagination buttons in the mark-up required by Bootstrap. - * - * For further information about the renderers available see - * DataTable.ext.renderer - * @type string|object - * @default null - * - * @name DataTable.defaults.renderer - * - */ - "renderer": null, - - - /** - * Set the data property name that DataTables should use to get a row's id - * to set as the `id` property in the node. - * @type string - * @default DT_RowId - * - * @name DataTable.defaults.rowId - */ - "rowId": "DT_RowId" - }; - - _fnHungarianMap( DataTable.defaults ); - - - - /* - * Developer note - See note in model.defaults.js about the use of Hungarian - * notation and camel case. - */ - - /** - * Column options that can be given to DataTables at initialisation time. - * @namespace - */ - DataTable.defaults.column = { - /** - * Define which column(s) an order will occur on for this column. This - * allows a column's ordering to take multiple columns into account when - * doing a sort or use the data from a different column. For example first - * name / last name columns make sense to do a multi-column sort over the - * two columns. - * @type array|int - * @default null Takes the value of the column index automatically - * - * @name DataTable.defaults.column.orderData - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderData": [ 0, 1 ], "targets": [ 0 ] }, - * { "orderData": [ 1, 0 ], "targets": [ 1 ] }, - * { "orderData": 2, "targets": [ 2 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderData": [ 0, 1 ] }, - * { "orderData": [ 1, 0 ] }, - * { "orderData": 2 }, - * null, - * null - * ] - * } ); - * } ); - */ - "aDataSort": null, - "iDataSort": -1, - - - /** - * You can control the default ordering direction, and even alter the - * behaviour of the sort handler (i.e. only allow ascending ordering etc) - * using this parameter. - * @type array - * @default [ 'asc', 'desc' ] - * - * @name DataTable.defaults.column.orderSequence - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderSequence": [ "asc" ], "targets": [ 1 ] }, - * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] }, - * { "orderSequence": [ "desc" ], "targets": [ 3 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * { "orderSequence": [ "asc" ] }, - * { "orderSequence": [ "desc", "asc", "asc" ] }, - * { "orderSequence": [ "desc" ] }, - * null - * ] - * } ); - * } ); - */ - "asSorting": [ 'asc', 'desc' ], - - - /** - * Enable or disable filtering on the data in this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.searchable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "searchable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "searchable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSearchable": true, - - - /** - * Enable or disable ordering on this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.orderable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSortable": true, - - - /** - * Enable or disable the display of this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.visible - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "visible": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "visible": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bVisible": true, - - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} td The TD node that has been created - * @param {*} cellData The Data for the cell - * @param {array|object} rowData The data for the whole row - * @param {int} row The row index for the aoData data store - * @param {int} col The column index for aoColumns - * - * @name DataTable.defaults.column.createdCell - * @dtopt Columns - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [3], - * "createdCell": function (td, cellData, rowData, row, col) { - * if ( cellData == "1.7" ) { - * $(td).css('color', 'blue') - * } - * } - * } ] - * }); - * } ); - */ - "fnCreatedCell": null, - - - /** - * This parameter has been replaced by `data` in DataTables to ensure naming - * consistency. `dataProp` can still be used, as there is backwards - * compatibility in DataTables for this option, but it is strongly - * recommended that you use `data` in preference to `dataProp`. - * @name DataTable.defaults.column.dataProp - */ - - - /** - * This property can be used to read data from any data source property, - * including deeply nested objects / properties. `data` can be given in a - * number of different ways which effect its behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. Note that - * function notation is recommended for use in `render` rather than - * `data` as it is much simpler to use as a renderer. - * * `null` - use the original data source for the row rather than plucking - * data directly from it. This action has effects on two other - * initialisation options: - * * `defaultContent` - When null is given as the `data` option and - * `defaultContent` is specified for the column, the value defined by - * `defaultContent` will be used for the cell. - * * `render` - When null is used for the `data` option and the `render` - * option is specified for the column, the whole data source for the - * row is used for the renderer. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * `{array|object}` The data source for the row - * * `{string}` The type call data requested - this will be 'set' when - * setting data or 'filter', 'display', 'type', 'sort' or undefined - * when gathering data. Note that when `undefined` is given for the - * type DataTables expects to get the raw data for the object back< - * * `{*}` Data to set when the second parameter is 'set'. - * * Return: - * * The return value from the function is not required when 'set' is - * the type of call, but otherwise the return is what will be used - * for the data requested. - * - * Note that `data` is a getter and setter option. If you just require - * formatting of data for output, you will likely want to use `render` which - * is simply a getter and thus simpler to use. - * - * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The - * name change reflects the flexibility of this property and is consistent - * with the naming of mRender. If 'mDataProp' is given, then it will still - * be used by DataTables, as it automatically maps the old name to the new - * if required. - * - * @type string|int|function|null - * @default null Use automatically calculated column index - * - * @name DataTable.defaults.column.data - * @dtopt Columns - * - * @example - * // Read table data from objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": {value}, - * // "version": {value}, - * // "grade": {value} - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/objects.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform" }, - * { "data": "version" }, - * { "data": "grade" } - * ] - * } ); - * } ); - * - * @example - * // Read information from deeply nested objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": { - * // "inner": {value} - * // }, - * // "details": [ - * // {value}, {value} - * // ] - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform.inner" }, - * { "data": "platform.details.0" }, - * { "data": "platform.details.1" } - * ] - * } ); - * } ); - * - * @example - * // Using `data` as a function to provide different information for - * // sorting, filtering and display. In this case, currency (price) - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": function ( source, type, val ) { - * if (type === 'set') { - * source.price = val; - * // Store the computed dislay and filter values for efficiency - * source.price_display = val=="" ? "" : "$"+numberFormat(val); - * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; - * return; - * } - * else if (type === 'display') { - * return source.price_display; - * } - * else if (type === 'filter') { - * return source.price_filter; - * } - * // 'sort', 'type' and undefined all just use the integer - * return source.price; - * } - * } ] - * } ); - * } ); - * - * @example - * // Using default content - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, - * "defaultContent": "Click to edit" - * } ] - * } ); - * } ); - * - * @example - * // Using array notation - outputting a list from an array - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "name[, ]" - * } ] - * } ); - * } ); - * - */ - "mData": null, - - - /** - * This property is the rendering partner to `data` and it is suggested that - * when you want to manipulate data for display (including filtering, - * sorting etc) without altering the underlying data for the table, use this - * property. `render` can be considered to be the the read only companion to - * `data` which is read / write (then as such more complex). Like `data` - * this option can be given in a number of different ways to effect its - * behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. - * * `object` - use different data for the different data types requested by - * DataTables ('filter', 'display', 'type' or 'sort'). The property names - * of the object is the data type the property refers to and the value can - * defined using an integer, string or function using the same rules as - * `render` normally does. Note that an `_` option _must_ be specified. - * This is the default value to use if you haven't specified a value for - * the data type requested by DataTables. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * {array|object} The data source for the row (based on `data`) - * * {string} The type call data requested - this will be 'filter', - * 'display', 'type' or 'sort'. - * * {array|object} The full data source for the row (not based on - * `data`) - * * Return: - * * The return value from the function is what will be used for the - * data requested. - * - * @type string|int|function|object|null - * @default null Use the data source value. - * - * @name DataTable.defaults.column.render - * @dtopt Columns - * - * @example - * // Create a comma separated list from an array of objects - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { - * "data": "platform", - * "render": "[, ].name" - * } - * ] - * } ); - * } ); - * - * @example - * // Execute a function to obtain data - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": "browserName()" - * } ] - * } ); - * } ); - * - * @example - * // As an object, extracting different data for the different types - * // This would be used with a data source such as: - * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" } - * // Here the `phone` integer is used for sorting and type detection, while `phone_filter` - * // (which has both forms) is used for filtering for if a user inputs either format, while - * // the formatted phone number is the one that is shown in the table. - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": { - * "_": "phone", - * "filter": "phone_filter", - * "display": "phone_display" - * } - * } ] - * } ); - * } ); - * - * @example - * // Use as a function to create a link from the data source - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "download_link", - * "render": function ( data, type, full ) { - * return 'Download'; - * } - * } ] - * } ); - * } ); - */ - "mRender": null, - - - /** - * Change the cell type created for the column - either TD cells or TH cells. This - * can be useful as TH cells have semantic meaning in the table body, allowing them - * to act as a header for a row (you may wish to add scope='row' to the TH elements). - * @type string - * @default td - * - * @name DataTable.defaults.column.cellType - * @dtopt Columns - * - * @example - * // Make the first column use TH cells - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "cellType": "th" - * } ] - * } ); - * } ); - */ - "sCellType": "td", - - - /** - * Class to give to each cell in this column. - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.class - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "class": "my_class", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "class": "my_class" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sClass": "", - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * Generally you shouldn't need this! - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.contentPadding - * @dtopt Columns - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "contentPadding": "mmm" - * } - * ] - * } ); - * } ); - */ - "sContentPadding": "", - - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because `data` - * is set to null, or because the data source itself is null). - * @type string - * @default null - * - * @name DataTable.defaults.column.defaultContent - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { - * "data": null, - * "defaultContent": "Edit", - * "targets": [ -1 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "data": null, - * "defaultContent": "Edit" - * } - * ] - * } ); - * } ); - */ - "sDefaultContent": null, - - - /** - * This parameter is only used in DataTables' server-side processing. It can - * be exceptionally useful to know what columns are being displayed on the - * client side, and to map these to database fields. When defined, the names - * also allow DataTables to reorder information from the server if it comes - * back in an unexpected order (i.e. if you switch your columns around on the - * client-side, your server-side code does not also need updating). - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.name - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "name": "engine", "targets": [ 0 ] }, - * { "name": "browser", "targets": [ 1 ] }, - * { "name": "platform", "targets": [ 2 ] }, - * { "name": "version", "targets": [ 3 ] }, - * { "name": "grade", "targets": [ 4 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "name": "engine" }, - * { "name": "browser" }, - * { "name": "platform" }, - * { "name": "version" }, - * { "name": "grade" } - * ] - * } ); - * } ); - */ - "sName": "", - - - /** - * Defines a data source type for the ordering which can be used to read - * real-time information from the table (updating the internally cached - * version) prior to ordering. This allows ordering to occur on user - * editable elements such as form inputs. - * @type string - * @default std - * - * @name DataTable.defaults.column.orderDataType - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderDataType": "dom-text", "targets": [ 2, 3 ] }, - * { "type": "numeric", "targets": [ 3 ] }, - * { "orderDataType": "dom-select", "targets": [ 4 ] }, - * { "orderDataType": "dom-checkbox", "targets": [ 5 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * { "orderDataType": "dom-text" }, - * { "orderDataType": "dom-text", "type": "numeric" }, - * { "orderDataType": "dom-select" }, - * { "orderDataType": "dom-checkbox" } - * ] - * } ); - * } ); - */ - "sSortDataType": "std", - - - /** - * The title of this column. - * @type string - * @default null Derived from the 'TH' value for this column in the - * original HTML table. - * - * @name DataTable.defaults.column.title - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "title": "My column title", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "title": "My column title" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sTitle": null, - - - /** - * The type allows you to specify how the data for this column will be - * ordered. Four types (string, numeric, date and html (which will strip - * HTML tags before ordering)) are currently available. Note that only date - * formats understood by Javascript's Date() object will be accepted as type - * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string', - * 'numeric', 'date' or 'html' (by default). Further types can be adding - * through plug-ins. - * @type string - * @default null Auto-detected from raw data - * - * @name DataTable.defaults.column.type - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "type": "html", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "type": "html" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sType": null, - - - /** - * Defining the width of the column, this parameter may take any CSS value - * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not - * been given a specific width through this interface ensuring that the table - * remains readable. - * @type string - * @default null Automatic - * - * @name DataTable.defaults.column.width - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "width": "20%", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "width": "20%" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sWidth": null - }; - - _fnHungarianMap( DataTable.defaults.column ); - - - - /** - * DataTables settings object - this holds all the information needed for a - * given table, including configuration, data and current application of the - * table options. DataTables does not have a single instance for each DataTable - * with the settings attached to that instance, but rather instances of the - * DataTable "class" are created on-the-fly as needed (typically by a - * $().dataTable() call) and the settings object is then applied to that - * instance. - * - * Note that this object is related to {@link DataTable.defaults} but this - * one is the internal data store for DataTables's cache of columns. It should - * NOT be manipulated outside of DataTables. Any configuration should be done - * through the initialisation options. - * @namespace - * @todo Really should attach the settings object to individual instances so we - * don't need to create new instances on each $().dataTable() call (if the - * table already exists). It would also save passing oSettings around and - * into every single function. However, this is a very significant - * architecture change for DataTables and will almost certainly break - * backwards compatibility with older installations. This is something that - * will be done in 2.0. - */ - DataTable.models.oSettings = { - /** - * Primary features of DataTables and their enablement state. - * @namespace - */ - "oFeatures": { - - /** - * Flag to say if DataTables should automatically try to calculate the - * optimum table and columns widths (true) or not (false). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoWidth": null, - - /** - * Delay the creation of TR and TD elements until they are actually - * needed by a driven page draw. This can give a significant speed - * increase for Ajax source and Javascript source data, but makes no - * difference at all fro DOM and server-side processing tables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bDeferRender": null, - - /** - * Enable filtering on the table or not. Note that if this is disabled - * then there is no filtering at all on the table, including fnFilter. - * To just remove the filtering input use sDom and remove the 'f' option. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bFilter": null, - - /** - * Table information element (the 'Showing x of y records' div) enable - * flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfo": null, - - /** - * Present a user control allowing the end user to change the page size - * when pagination is enabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bLengthChange": null, - - /** - * Pagination enabled or not. Note that if this is disabled then length - * changing must also be disabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bPaginate": null, - - /** - * Processing indicator enable flag whenever DataTables is enacting a - * user request - typically an Ajax request for server-side processing. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bProcessing": null, - - /** - * Server-side processing enabled flag - when enabled DataTables will - * get all data from the server for every draw - there is no filtering, - * sorting or paging done on the client-side. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bServerSide": null, - - /** - * Sorting enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSort": null, - - /** - * Multi-column sorting - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortMulti": null, - - /** - * Apply a class to the columns which are being sorted to provide a - * visual highlight or not. This can slow things down when enabled since - * there is a lot of DOM interaction. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortClasses": null, - - /** - * State saving enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bStateSave": null - }, - - - /** - * Scrolling settings for a table. - * @namespace - */ - "oScroll": { - /** - * When the table is shorter in height than sScrollY, collapse the - * table container down to the height of the table (when true). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bCollapse": null, - - /** - * Width of the scrollbar for the web-browser's platform. Calculated - * during table initialisation. - * @type int - * @default 0 - */ - "iBarWidth": 0, - - /** - * Viewport width for horizontal scrolling. Horizontal scrolling is - * disabled if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sX": null, - - /** - * Width to expand the table to when using x-scrolling. Typically you - * should not need to use this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @deprecated - */ - "sXInner": null, - - /** - * Viewport height for vertical scrolling. Vertical scrolling is disabled - * if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sY": null - }, - - /** - * Language information for the table. - * @namespace - * @extends DataTable.defaults.oLanguage - */ - "oLanguage": { - /** - * Information callback function. See - * {@link DataTable.defaults.fnInfoCallback} - * @type function - * @default null - */ - "fnInfoCallback": null - }, - - /** - * Browser support parameters - * @namespace - */ - "oBrowser": { - /** - * Indicate if the browser incorrectly calculates width:100% inside a - * scrolling element (IE6/7) - * @type boolean - * @default false - */ - "bScrollOversize": false, - - /** - * Determine if the vertical scrollbar is on the right or left of the - * scrolling container - needed for rtl language layout, although not - * all browsers move the scrollbar (Safari). - * @type boolean - * @default false - */ - "bScrollbarLeft": false, - - /** - * Flag for if `getBoundingClientRect` is fully supported or not - * @type boolean - * @default false - */ - "bBounding": false, - - /** - * Browser scrollbar width - * @type integer - * @default 0 - */ - "barWidth": 0 - }, - - - "ajax": null, - - - /** - * Array referencing the nodes which are used for the features. The - * parameters of this object match what is allowed by sDom - i.e. - *
      - *
    • 'l' - Length changing
    • - *
    • 'f' - Filtering input
    • - *
    • 't' - The table!
    • - *
    • 'i' - Information
    • - *
    • 'p' - Pagination
    • - *
    • 'r' - pRocessing
    • - *
    - * @type array - * @default [] - */ - "aanFeatures": [], - - /** - * Store data information - see {@link DataTable.models.oRow} for detailed - * information. - * @type array - * @default [] - */ - "aoData": [], - - /** - * Array of indexes which are in the current display (after filtering etc) - * @type array - * @default [] - */ - "aiDisplay": [], - - /** - * Array of indexes for display - no filtering - * @type array - * @default [] - */ - "aiDisplayMaster": [], - - /** - * Map of row ids to data indexes - * @type object - * @default {} - */ - "aIds": {}, - - /** - * Store information about each column that is in use - * @type array - * @default [] - */ - "aoColumns": [], - - /** - * Store information about the table's header - * @type array - * @default [] - */ - "aoHeader": [], - - /** - * Store information about the table's footer - * @type array - * @default [] - */ - "aoFooter": [], - - /** - * Store the applied global search information in case we want to force a - * research or compare the old search to a new one. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @namespace - * @extends DataTable.models.oSearch - */ - "oPreviousSearch": {}, - - /** - * Store the applied search for each column - see - * {@link DataTable.models.oSearch} for the format that is used for the - * filtering information for each column. - * @type array - * @default [] - */ - "aoPreSearchCols": [], - - /** - * Sorting that is applied to the table. Note that the inner arrays are - * used in the following manner: - *
      - *
    • Index 0 - column number
    • - *
    • Index 1 - current sorting direction
    • - *
    - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @todo These inner arrays should really be objects - */ - "aaSorting": null, - - /** - * Sorting that is always applied to the table (i.e. prefixed in front of - * aaSorting). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aaSortingFixed": [], - - /** - * Classes to use for the striping of a table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "asStripeClasses": null, - - /** - * If restoring a table - we should restore its striping classes as well - * @type array - * @default [] - */ - "asDestroyStripes": [], - - /** - * If restoring a table - we should restore its width - * @type int - * @default 0 - */ - "sDestroyWidth": 0, - - /** - * Callback functions array for every time a row is inserted (i.e. on a draw). - * @type array - * @default [] - */ - "aoRowCallback": [], - - /** - * Callback functions for the header on each draw. - * @type array - * @default [] - */ - "aoHeaderCallback": [], - - /** - * Callback function for the footer on each draw. - * @type array - * @default [] - */ - "aoFooterCallback": [], - - /** - * Array of callback functions for draw callback functions - * @type array - * @default [] - */ - "aoDrawCallback": [], - - /** - * Array of callback functions for row created function - * @type array - * @default [] - */ - "aoRowCreatedCallback": [], - - /** - * Callback functions for just before the table is redrawn. A return of - * false will be used to cancel the draw. - * @type array - * @default [] - */ - "aoPreDrawCallback": [], - - /** - * Callback functions for when the table has been initialised. - * @type array - * @default [] - */ - "aoInitComplete": [], - - - /** - * Callbacks for modifying the settings to be stored for state saving, prior to - * saving state. - * @type array - * @default [] - */ - "aoStateSaveParams": [], - - /** - * Callbacks for modifying the settings that have been stored for state saving - * prior to using the stored values to restore the state. - * @type array - * @default [] - */ - "aoStateLoadParams": [], - - /** - * Callbacks for operating on the settings object once the saved state has been - * loaded - * @type array - * @default [] - */ - "aoStateLoaded": [], - - /** - * Cache the table ID for quick access - * @type string - * @default Empty string - */ - "sTableId": "", - - /** - * The TABLE node for the main table - * @type node - * @default null - */ - "nTable": null, - - /** - * Permanent ref to the thead element - * @type node - * @default null - */ - "nTHead": null, - - /** - * Permanent ref to the tfoot element - if it exists - * @type node - * @default null - */ - "nTFoot": null, - - /** - * Permanent ref to the tbody element - * @type node - * @default null - */ - "nTBody": null, - - /** - * Cache the wrapper node (contains all DataTables controlled elements) - * @type node - * @default null - */ - "nTableWrapper": null, - - /** - * Indicate if when using server-side processing the loading of data - * should be deferred until the second draw. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - * @default false - */ - "bDeferLoading": false, - - /** - * Indicate if all required information has been read in - * @type boolean - * @default false - */ - "bInitialised": false, - - /** - * Information about open rows. Each object in the array has the parameters - * 'nTr' and 'nParent' - * @type array - * @default [] - */ - "aoOpenRows": [], - - /** - * Dictate the positioning of DataTables' control elements - see - * {@link DataTable.model.oInit.sDom}. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sDom": null, - - /** - * Search delay (in mS) - * @type integer - * @default null - */ - "searchDelay": null, - - /** - * Which type of pagination should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default two_button - */ - "sPaginationType": "two_button", - - /** - * The state duration (for `stateSave`) in seconds. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - * @default 0 - */ - "iStateDuration": 0, - - /** - * Array of callback functions for state saving. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the JSON string to save that has been thus far created. Returns - * a JSON string to be inserted into a json object - * (i.e. '"param": [ 0, 1, 2]')
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateSave": [], - - /** - * Array of callback functions for state loading. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the object stored. May return false to cancel state loading
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateLoad": [], - - /** - * State that was saved. Useful for back reference - * @type object - * @default null - */ - "oSavedState": null, - - /** - * State that was loaded. Useful for back reference - * @type object - * @default null - */ - "oLoadedState": null, - - /** - * Source url for AJAX data for the table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sAjaxSource": null, - - /** - * Property from a given object from which to read the table data from. This - * can be an empty string (when not server-side processing), in which case - * it is assumed an an array is given directly. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sAjaxDataProp": null, - - /** - * Note if draw should be blocked while getting data - * @type boolean - * @default true - */ - "bAjaxDataGet": true, - - /** - * The last jQuery XHR object that was used for server-side data gathering. - * This can be used for working with the XHR information in one of the - * callbacks - * @type object - * @default null - */ - "jqXHR": null, - - /** - * JSON returned from the server in the last Ajax request - * @type object - * @default undefined - */ - "json": undefined, - - /** - * Data submitted as part of the last Ajax request - * @type object - * @default undefined - */ - "oAjaxData": undefined, - - /** - * Function to get the server-side data. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnServerData": null, - - /** - * Functions which are called prior to sending an Ajax request so extra - * parameters can easily be sent to the server - * @type array - * @default [] - */ - "aoServerParams": [], - - /** - * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if - * required). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sServerMethod": null, - - /** - * Format numbers for display. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnFormatNumber": null, - - /** - * List of options that can be used for the user selectable length menu. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aLengthMenu": null, - - /** - * Counter for the draws that the table does. Also used as a tracker for - * server-side processing - * @type int - * @default 0 - */ - "iDraw": 0, - - /** - * Indicate if a redraw is being done - useful for Ajax - * @type boolean - * @default false - */ - "bDrawing": false, - - /** - * Draw index (iDraw) of the last error when parsing the returned data - * @type int - * @default -1 - */ - "iDrawError": -1, - - /** - * Paging display length - * @type int - * @default 10 - */ - "_iDisplayLength": 10, - - /** - * Paging start point - aiDisplay index - * @type int - * @default 0 - */ - "_iDisplayStart": 0, - - /** - * Server-side processing - number of records in the result set - * (i.e. before filtering), Use fnRecordsTotal rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type int - * @default 0 - * @private - */ - "_iRecordsTotal": 0, - - /** - * Server-side processing - number of records in the current display set - * (i.e. after filtering). Use fnRecordsDisplay rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type boolean - * @default 0 - * @private - */ - "_iRecordsDisplay": 0, - - /** - * The classes to use for the table - * @type object - * @default {} - */ - "oClasses": {}, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if filtering has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bFiltered": false, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if sorting has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bSorted": false, - - /** - * Indicate that if multiple rows are in the header and there is more than - * one unique cell per column, if the top one (true) or bottom one (false) - * should be used for sorting / title by DataTables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortCellsTop": null, - - /** - * Initialisation object that is used for the table - * @type object - * @default null - */ - "oInit": null, - - /** - * Destroy callback functions - for plug-ins to attach themselves to the - * destroy so they can clean up markup and events. - * @type array - * @default [] - */ - "aoDestroyCallback": [], - - - /** - * Get the number of records in the current record set, before filtering - * @type function - */ - "fnRecordsTotal": function () - { - return _fnDataSource( this ) == 'ssp' ? - this._iRecordsTotal * 1 : - this.aiDisplayMaster.length; - }, - - /** - * Get the number of records in the current record set, after filtering - * @type function - */ - "fnRecordsDisplay": function () - { - return _fnDataSource( this ) == 'ssp' ? - this._iRecordsDisplay * 1 : - this.aiDisplay.length; - }, - - /** - * Get the display end point - aiDisplay index - * @type function - */ - "fnDisplayEnd": function () - { - var - len = this._iDisplayLength, - start = this._iDisplayStart, - calc = start + len, - records = this.aiDisplay.length, - features = this.oFeatures, - paginate = features.bPaginate; - - if ( features.bServerSide ) { - return paginate === false || len === -1 ? - start + records : - Math.min( start+len, this._iRecordsDisplay ); - } - else { - return ! paginate || calc>records || len===-1 ? - records : - calc; - } - }, - - /** - * The DataTables object for this table - * @type object - * @default null - */ - "oInstance": null, - - /** - * Unique identifier for each instance of the DataTables object. If there - * is an ID on the table node, then it takes that value, otherwise an - * incrementing internal counter is used. - * @type string - * @default null - */ - "sInstance": null, - - /** - * tabindex attribute value that is added to DataTables control elements, allowing - * keyboard navigation of the table and its controls. - */ - "iTabIndex": 0, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollHead": null, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollFoot": null, - - /** - * Last applied sort - * @type array - * @default [] - */ - "aLastSort": [], - - /** - * Stored plug-in instances - * @type object - * @default {} - */ - "oPlugins": {}, - - /** - * Function used to get a row's id from the row's data - * @type function - * @default null - */ - "rowIdFn": null, - - /** - * Data location where to store a row's id - * @type string - * @default null - */ - "rowId": null - }; - - /** - * Extension object for DataTables that is used to provide all extension - * options. - * - * Note that the `DataTable.ext` object is available through - * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is - * also aliased to `jQuery.fn.dataTableExt` for historic reasons. - * @namespace - * @extends DataTable.models.ext - */ - - - /** - * DataTables extensions - * - * This namespace acts as a collection area for plug-ins that can be used to - * extend DataTables capabilities. Indeed many of the build in methods - * use this method to provide their own capabilities (sorting methods for - * example). - * - * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy - * reasons - * - * @namespace - */ - DataTable.ext = _ext = { - /** - * Buttons. For use with the Buttons extension for DataTables. This is - * defined here so other extensions can define buttons regardless of load - * order. It is _not_ used by DataTables core. - * - * @type object - * @default {} - */ - buttons: {}, - - - /** - * Element class names - * - * @type object - * @default {} - */ - classes: {}, - - - /** - * DataTables build type (expanded by the download builder) - * - * @type string - */ - builder: "-source-", - - - /** - * Error reporting. - * - * How should DataTables report an error. Can take the value 'alert', - * 'throw', 'none' or a function. - * - * @type string|function - * @default alert - */ - errMode: "alert", - - - /** - * Feature plug-ins. - * - * This is an array of objects which describe the feature plug-ins that are - * available to DataTables. These feature plug-ins are then available for - * use through the `dom` initialisation option. - * - * Each feature plug-in is described by an object which must have the - * following properties: - * - * * `fnInit` - function that is used to initialise the plug-in, - * * `cFeature` - a character so the feature can be enabled by the `dom` - * instillation option. This is case sensitive. - * - * The `fnInit` function has the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * - * And the following return is expected: - * - * * {node|null} The element which contains your feature. Note that the - * return may also be void if your plug-in does not require to inject any - * DOM elements into DataTables control (`dom`) - for example this might - * be useful when developing a plug-in which allows table control via - * keyboard entry - * - * @type array - * - * @example - * $.fn.dataTable.ext.features.push( { - * "fnInit": function( oSettings ) { - * return new TableTools( { "oDTSettings": oSettings } ); - * }, - * "cFeature": "T" - * } ); - */ - feature: [], - - - /** - * Row searching. - * - * This method of searching is complimentary to the default type based - * searching, and a lot more comprehensive as it allows you complete control - * over the searching logic. Each element in this array is a function - * (parameters described below) that is called for every row in the table, - * and your logic decides if it should be included in the searching data set - * or not. - * - * Searching functions have the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{array|object}` Data for the row to be processed (same as the - * original format that was passed in as the data source, or an array - * from a DOM data source - * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which - * can be useful to retrieve the `TR` element if you need DOM interaction. - * - * And the following return is expected: - * - * * {boolean} Include the row in the searched result set (true) or not - * (false) - * - * Note that as with the main search ability in DataTables, technically this - * is "filtering", since it is subtractive. However, for consistency in - * naming we call it searching here. - * - * @type array - * @default [] - * - * @example - * // The following example shows custom search being applied to the - * // fourth column (i.e. the data[3] index) based on two input values - * // from the end-user, matching the data in a certain range. - * $.fn.dataTable.ext.search.push( - * function( settings, data, dataIndex ) { - * var min = document.getElementById('min').value * 1; - * var max = document.getElementById('max').value * 1; - * var version = data[3] == "-" ? 0 : data[3]*1; - * - * if ( min == "" && max == "" ) { - * return true; - * } - * else if ( min == "" && version < max ) { - * return true; - * } - * else if ( min < version && "" == max ) { - * return true; - * } - * else if ( min < version && version < max ) { - * return true; - * } - * return false; - * } - * ); - */ - search: [], - - - /** - * Selector extensions - * - * The `selector` option can be used to extend the options available for the - * selector modifier options (`selector-modifier` object data type) that - * each of the three built in selector types offer (row, column and cell + - * their plural counterparts). For example the Select extension uses this - * mechanism to provide an option to select only rows, columns and cells - * that have been marked as selected by the end user (`{selected: true}`), - * which can be used in conjunction with the existing built in selector - * options. - * - * Each property is an array to which functions can be pushed. The functions - * take three attributes: - * - * * Settings object for the host table - * * Options object (`selector-modifier` object type) - * * Array of selected item indexes - * - * The return is an array of the resulting item indexes after the custom - * selector has been applied. - * - * @type object - */ - selector: { - cell: [], - column: [], - row: [] - }, - - - /** - * Internal functions, exposed for used in plug-ins. - * - * Please note that you should not need to use the internal methods for - * anything other than a plug-in (and even then, try to avoid if possible). - * The internal function may change between releases. - * - * @type object - * @default {} - */ - internal: {}, - - - /** - * Legacy configuration options. Enable and disable legacy options that - * are available in DataTables. - * - * @type object - */ - legacy: { - /** - * Enable / disable DataTables 1.9 compatible server-side processing - * requests - * - * @type boolean - * @default null - */ - ajax: null - }, - - - /** - * Pagination plug-in methods. - * - * Each entry in this object is a function and defines which buttons should - * be shown by the pagination rendering method that is used for the table: - * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the - * buttons are displayed in the document, while the functions here tell it - * what buttons to display. This is done by returning an array of button - * descriptions (what each button will do). - * - * Pagination types (the four built in options and any additional plug-in - * options defined here) can be used through the `paginationType` - * initialisation parameter. - * - * The functions defined take two parameters: - * - * 1. `{int} page` The current page index - * 2. `{int} pages` The number of pages in the table - * - * Each function is expected to return an array where each element of the - * array can be one of: - * - * * `first` - Jump to first page when activated - * * `last` - Jump to last page when activated - * * `previous` - Show previous page when activated - * * `next` - Show next page when activated - * * `{int}` - Show page of the index given - * * `{array}` - A nested array containing the above elements to add a - * containing 'DIV' element (might be useful for styling). - * - * Note that DataTables v1.9- used this object slightly differently whereby - * an object with two functions would be defined for each plug-in. That - * ability is still supported by DataTables 1.10+ to provide backwards - * compatibility, but this option of use is now decremented and no longer - * documented in DataTables 1.10+. - * - * @type object - * @default {} - * - * @example - * // Show previous, next and current page buttons only - * $.fn.dataTableExt.oPagination.current = function ( page, pages ) { - * return [ 'previous', page, 'next' ]; - * }; - */ - pager: {}, - - - renderer: { - pageButton: {}, - header: {} - }, - - - /** - * Ordering plug-ins - custom data source - * - * The extension options for ordering of data available here is complimentary - * to the default type based ordering that DataTables typically uses. It - * allows much greater control over the the data that is being used to - * order a column, but is necessarily therefore more complex. - * - * This type of ordering is useful if you want to do ordering based on data - * live from the DOM (for example the contents of an 'input' element) rather - * than just the static string that DataTables knows of. - * - * The way these plug-ins work is that you create an array of the values you - * wish to be ordering for the column in question and then return that - * array. The data in the array much be in the index order of the rows in - * the table (not the currently ordering order!). Which order data gathering - * function is run here depends on the `dt-init columns.orderDataType` - * parameter that is used for the column (if any). - * - * The functions defined take two parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{int}` Target column index - * - * Each function is expected to return an array: - * - * * `{array}` Data for the column to be ordering upon - * - * @type array - * - * @example - * // Ordering using `input` node values - * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col ) - * { - * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { - * return $('input', td).val(); - * } ); - * } - */ - order: {}, - - - /** - * Type based plug-ins. - * - * Each column in DataTables has a type assigned to it, either by automatic - * detection or by direct assignment using the `type` option for the column. - * The type of a column will effect how it is ordering and search (plug-ins - * can also make use of the column type if required). - * - * @namespace - */ - type: { - /** - * Type detection functions. - * - * The functions defined in this object are used to automatically detect - * a column's type, making initialisation of DataTables super easy, even - * when complex data is in the table. - * - * The functions defined take two parameters: - * - * 1. `{*}` Data from the column cell to be analysed - * 2. `{settings}` DataTables settings object. This can be used to - * perform context specific type detection - for example detection - * based on language settings such as using a comma for a decimal - * place. Generally speaking the options from the settings will not - * be required - * - * Each function is expected to return: - * - * * `{string|null}` Data type detected, or null if unknown (and thus - * pass it on to the other type detection functions. - * - * @type array - * - * @example - * // Currency type detection plug-in: - * $.fn.dataTable.ext.type.detect.push( - * function ( data, settings ) { - * // Check the numeric part - * if ( ! $.isNumeric( data.substring(1) ) ) { - * return null; - * } - * - * // Check prefixed by currency - * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) { - * return 'currency'; - * } - * return null; - * } - * ); - */ - detect: [], - - - /** - * Type based search formatting. - * - * The type based searching functions can be used to pre-format the - * data to be search on. For example, it can be used to strip HTML - * tags or to de-format telephone numbers for numeric only searching. - * - * Note that is a search is not defined for a column of a given type, - * no search formatting will be performed. - * - * Pre-processing of searching data plug-ins - When you assign the sType - * for a column (or have it automatically detected for you by DataTables - * or a type detection plug-in), you will typically be using this for - * custom sorting, but it can also be used to provide custom searching - * by allowing you to pre-processing the data and returning the data in - * the format that should be searched upon. This is done by adding - * functions this object with a parameter name which matches the sType - * for that target column. This is the corollary of afnSortData - * for searching data. - * - * The functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for searching - * - * Each function is expected to return: - * - * * `{string|null}` Formatted string that will be used for the searching. - * - * @type object - * @default {} - * - * @example - * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) { - * return d.replace(/\n/g," ").replace( /<.*?>/g, "" ); - * } - */ - search: {}, - - - /** - * Type based ordering. - * - * The column type tells DataTables what ordering to apply to the table - * when a column is sorted upon. The order for each type that is defined, - * is defined by the functions available in this object. - * - * Each ordering option can be described by three properties added to - * this object: - * - * * `{type}-pre` - Pre-formatting function - * * `{type}-asc` - Ascending order function - * * `{type}-desc` - Descending order function - * - * All three can be used together, only `{type}-pre` or only - * `{type}-asc` and `{type}-desc` together. It is generally recommended - * that only `{type}-pre` is used, as this provides the optimal - * implementation in terms of speed, although the others are provided - * for compatibility with existing Javascript sort functions. - * - * `{type}-pre`: Functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for ordering - * - * And return: - * - * * `{*}` Data to be sorted upon - * - * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort - * functions, taking two parameters: - * - * 1. `{*}` Data to compare to the second parameter - * 2. `{*}` Data to compare to the first parameter - * - * And returning: - * - * * `{*}` Ordering match: <0 if first parameter should be sorted lower - * than the second parameter, ===0 if the two parameters are equal and - * >0 if the first parameter should be sorted height than the second - * parameter. - * - * @type object - * @default {} - * - * @example - * // Numeric ordering of formatted numbers with a pre-formatter - * $.extend( $.fn.dataTable.ext.type.order, { - * "string-pre": function(x) { - * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" ); - * return parseFloat( a ); - * } - * } ); - * - * @example - * // Case-sensitive string ordering, with no pre-formatting method - * $.extend( $.fn.dataTable.ext.order, { - * "string-case-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-case-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - */ - order: {} - }, - - /** - * Unique DataTables instance counter - * - * @type int - * @private - */ - _unique: 0, - - - // - // Depreciated - // The following properties are retained for backwards compatiblity only. - // The should not be used in new projects and will be removed in a future - // version - // - - /** - * Version check function. - * @type function - * @depreciated Since 1.10 - */ - fnVersionCheck: DataTable.fnVersionCheck, - - - /** - * Index for what 'this' index API functions should use - * @type int - * @deprecated Since v1.10 - */ - iApiIndex: 0, - - - /** - * jQuery UI class container - * @type object - * @deprecated Since v1.10 - */ - oJUIClasses: {}, - - - /** - * Software version - * @type string - * @deprecated Since v1.10 - */ - sVersion: DataTable.version - }; - - - // - // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts - // - $.extend( _ext, { - afnFiltering: _ext.search, - aTypes: _ext.type.detect, - ofnSearch: _ext.type.search, - oSort: _ext.type.order, - afnSortData: _ext.order, - aoFeatures: _ext.feature, - oApi: _ext.internal, - oStdClasses: _ext.classes, - oPagination: _ext.pager - } ); - - - $.extend( DataTable.ext.classes, { - "sTable": "dataTable", - "sNoFooter": "no-footer", - - /* Paging buttons */ - "sPageButton": "paginate_button", - "sPageButtonActive": "current", - "sPageButtonDisabled": "disabled", - - /* Striping classes */ - "sStripeOdd": "odd", - "sStripeEven": "even", - - /* Empty row */ - "sRowEmpty": "dataTables_empty", - - /* Features */ - "sWrapper": "dataTables_wrapper", - "sFilter": "dataTables_filter", - "sInfo": "dataTables_info", - "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ - "sLength": "dataTables_length", - "sProcessing": "dataTables_processing", - - /* Sorting */ - "sSortAsc": "sorting_asc", - "sSortDesc": "sorting_desc", - "sSortable": "sorting", /* Sortable in both directions */ - "sSortableAsc": "sorting_asc_disabled", - "sSortableDesc": "sorting_desc_disabled", - "sSortableNone": "sorting_disabled", - "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ - - /* Filtering */ - "sFilterInput": "", - - /* Page length */ - "sLengthSelect": "", - - /* Scrolling */ - "sScrollWrapper": "dataTables_scroll", - "sScrollHead": "dataTables_scrollHead", - "sScrollHeadInner": "dataTables_scrollHeadInner", - "sScrollBody": "dataTables_scrollBody", - "sScrollFoot": "dataTables_scrollFoot", - "sScrollFootInner": "dataTables_scrollFootInner", - - /* Misc */ - "sHeaderTH": "", - "sFooterTH": "", - - // Deprecated - "sSortJUIAsc": "", - "sSortJUIDesc": "", - "sSortJUI": "", - "sSortJUIAscAllowed": "", - "sSortJUIDescAllowed": "", - "sSortJUIWrapper": "", - "sSortIcon": "", - "sJUIHeader": "", - "sJUIFooter": "" - } ); - - - var extPagination = DataTable.ext.pager; - - function _numbers ( page, pages ) { - var - numbers = [], - buttons = extPagination.numbers_length, - half = Math.floor( buttons / 2 ), - i = 1; - - if ( pages <= buttons ) { - numbers = _range( 0, pages ); - } - else if ( page <= half ) { - numbers = _range( 0, buttons-2 ); - numbers.push( 'ellipsis' ); - numbers.push( pages-1 ); - } - else if ( page >= pages - 1 - half ) { - numbers = _range( pages-(buttons-2), pages ); - numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6 - numbers.splice( 0, 0, 0 ); - } - else { - numbers = _range( page-half+2, page+half-1 ); - numbers.push( 'ellipsis' ); - numbers.push( pages-1 ); - numbers.splice( 0, 0, 'ellipsis' ); - numbers.splice( 0, 0, 0 ); - } - - numbers.DT_el = 'span'; - return numbers; - } - - - $.extend( extPagination, { - simple: function ( page, pages ) { - return [ 'previous', 'next' ]; - }, - - full: function ( page, pages ) { - return [ 'first', 'previous', 'next', 'last' ]; - }, - - numbers: function ( page, pages ) { - return [ _numbers(page, pages) ]; - }, - - simple_numbers: function ( page, pages ) { - return [ 'previous', _numbers(page, pages), 'next' ]; - }, - - full_numbers: function ( page, pages ) { - return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ]; - }, - - first_last_numbers: function (page, pages) { - return ['first', _numbers(page, pages), 'last']; - }, - - // For testing and plug-ins to use - _numbers: _numbers, - - // Number of number buttons (including ellipsis) to show. _Must be odd!_ - numbers_length: 7 - } ); - - - $.extend( true, DataTable.ext.renderer, { - pageButton: { - _: function ( settings, host, idx, buttons, page, pages ) { - var classes = settings.oClasses; - var lang = settings.oLanguage.oPaginate; - var aria = settings.oLanguage.oAria.paginate || {}; - var btnDisplay, btnClass, counter=0; - - var attach = function( container, buttons ) { - var i, ien, node, button; - var clickHandler = function ( e ) { - _fnPageChange( settings, e.data.action, true ); - }; - - for ( i=0, ien=buttons.length ; i' ) - .appendTo( container ); - attach( inner, button ); - } - else { - btnDisplay = null; - btnClass = ''; - - switch ( button ) { - case 'ellipsis': - container.append(''); - break; - - case 'first': - btnDisplay = lang.sFirst; - btnClass = button + (page > 0 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - case 'previous': - btnDisplay = lang.sPrevious; - btnClass = button + (page > 0 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - case 'next': - btnDisplay = lang.sNext; - btnClass = button + (page < pages-1 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - case 'last': - btnDisplay = lang.sLast; - btnClass = button + (page < pages-1 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - default: - btnDisplay = button + 1; - btnClass = page === button ? - classes.sPageButtonActive : ''; - break; - } - - if ( btnDisplay !== null ) { - node = $('', { - 'class': classes.sPageButton+' '+btnClass, - 'aria-controls': settings.sTableId, - 'aria-label': aria[ button ], - 'data-dt-idx': counter, - 'tabindex': settings.iTabIndex, - 'id': idx === 0 && typeof button === 'string' ? - settings.sTableId +'_'+ button : - null - } ) - .html( btnDisplay ) - .appendTo( container ); - - _fnBindAction( - node, {action: button}, clickHandler - ); - - counter++; - } - } - } - }; - - // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. Try / catch the error. Not good for - // accessibility, but neither are frames. - var activeEl; - - try { - // Because this approach is destroying and recreating the paging - // elements, focus is lost on the select button which is bad for - // accessibility. So we want to restore focus once the draw has - // completed - activeEl = $(host).find(document.activeElement).data('dt-idx'); - } - catch (e) {} - - attach( $(host).empty(), buttons ); - - if ( activeEl !== undefined ) { - $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); - } - } - } - } ); - - - - // Built in type detection. See model.ext.aTypes for information about - // what is required from this methods. - $.extend( DataTable.ext.type.detect, [ - // Plain numbers - first since V8 detects some plain numbers as dates - // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...). - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _isNumber( d, decimal ) ? 'num'+decimal : null; - }, - - // Dates (only those recognised by the browser's Date.parse) - function ( d, settings ) - { - // V8 tries _very_ hard to make a string passed into `Date.parse()` - // valid, so we need to use a regex to restrict date formats. Use a - // plug-in for anything other than ISO8601 style strings - if ( d && !(d instanceof Date) && ! _re_date.test(d) ) { - return null; - } - var parsed = Date.parse(d); - return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null; - }, - - // Formatted numbers - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null; - }, - - // HTML numeric - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null; - }, - - // HTML numeric, formatted - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null; - }, - - // HTML (this is strict checking - there must be html) - function ( d, settings ) - { - return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ? - 'html' : null; - } - ] ); - - - - // Filter formatting functions. See model.ext.ofnSearch for information about - // what is required from these methods. - // - // Note that additional search methods are added for the html numbers and - // html formatted numbers by `_addNumericSort()` when we know what the decimal - // place is - - - $.extend( DataTable.ext.type.search, { - html: function ( data ) { - return _empty(data) ? - data : - typeof data === 'string' ? - data - .replace( _re_new_lines, " " ) - .replace( _re_html, "" ) : - ''; - }, - - string: function ( data ) { - return _empty(data) ? - data : - typeof data === 'string' ? - data.replace( _re_new_lines, " " ) : - data; - } - } ); - - - - var __numericReplace = function ( d, decimalPlace, re1, re2 ) { - if ( d !== 0 && (!d || d === '-') ) { - return -Infinity; - } - - // If a decimal place other than `.` is used, it needs to be given to the - // function so we can detect it and replace with a `.` which is the only - // decimal place Javascript recognises - it is not locale aware. - if ( decimalPlace ) { - d = _numToDecimal( d, decimalPlace ); - } - - if ( d.replace ) { - if ( re1 ) { - d = d.replace( re1, '' ); - } - - if ( re2 ) { - d = d.replace( re2, '' ); - } - } - - return d * 1; - }; - - - // Add the numeric 'deformatting' functions for sorting and search. This is done - // in a function to provide an easy ability for the language options to add - // additional methods if a non-period decimal place is used. - function _addNumericSort ( decimalPlace ) { - $.each( - { - // Plain numbers - "num": function ( d ) { - return __numericReplace( d, decimalPlace ); - }, - - // Formatted numbers - "num-fmt": function ( d ) { - return __numericReplace( d, decimalPlace, _re_formatted_numeric ); - }, - - // HTML numeric - "html-num": function ( d ) { - return __numericReplace( d, decimalPlace, _re_html ); - }, - - // HTML numeric, formatted - "html-num-fmt": function ( d ) { - return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric ); - } - }, - function ( key, fn ) { - // Add the ordering method - _ext.type.order[ key+decimalPlace+'-pre' ] = fn; - - // For HTML types add a search formatter that will strip the HTML - if ( key.match(/^html\-/) ) { - _ext.type.search[ key+decimalPlace ] = _ext.type.search.html; - } - } - ); - } - - - // Default sort methods - $.extend( _ext.type.order, { - // Dates - "date-pre": function ( d ) { - return Date.parse( d ) || -Infinity; - }, - - // html - "html-pre": function ( a ) { - return _empty(a) ? - '' : - a.replace ? - a.replace( /<.*?>/g, "" ).toLowerCase() : - a+''; - }, - - // string - "string-pre": function ( a ) { - // This is a little complex, but faster than always calling toString, - // http://jsperf.com/tostring-v-check - return _empty(a) ? - '' : - typeof a === 'string' ? - a.toLowerCase() : - ! a.toString ? - '' : - a.toString(); - }, - - // string-asc and -desc are retained only for compatibility with the old - // sort methods - "string-asc": function ( x, y ) { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "string-desc": function ( x, y ) { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - } - } ); - - - // Numeric sorting types - order doesn't matter here - _addNumericSort( '' ); - - - $.extend( true, DataTable.ext.renderer, { - header: { - _: function ( settings, cell, column, classes ) { - // No additional mark-up required - // Attach a sort listener to update on sort - note that using the - // `DT` namespace will allow the event to be removed automatically - // on destroy, while the `dt` namespaced event is the one we are - // listening for - $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { - if ( settings !== ctx ) { // need to check this this is the host - return; // table, not a nested one - } - - var colIdx = column.idx; - - cell - .removeClass( - column.sSortingClass +' '+ - classes.sSortAsc +' '+ - classes.sSortDesc - ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortAsc : columns[ colIdx ] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - } ); - }, - - jqueryui: function ( settings, cell, column, classes ) { - $('
    ') - .addClass( classes.sSortJUIWrapper ) - .append( cell.contents() ) - .append( $('') - .addClass( classes.sSortIcon+' '+column.sSortingClassJUI ) - ) - .appendTo( cell ); - - // Attach a sort listener to update on sort - $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { - if ( settings !== ctx ) { - return; - } - - var colIdx = column.idx; - - cell - .removeClass( classes.sSortAsc +" "+classes.sSortDesc ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortAsc : columns[ colIdx ] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - - cell - .find( 'span.'+classes.sSortIcon ) - .removeClass( - classes.sSortJUIAsc +" "+ - classes.sSortJUIDesc +" "+ - classes.sSortJUI +" "+ - classes.sSortJUIAscAllowed +" "+ - classes.sSortJUIDescAllowed - ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ? - classes.sSortJUIDesc : - column.sSortingClassJUI - ); - } ); - } - } - } ); - - /* - * Public helper functions. These aren't used internally by DataTables, or - * called by any of the options passed into DataTables, but they can be used - * externally by developers working with DataTables. They are helper functions - * to make working with DataTables a little bit easier. - */ - - var __htmlEscapeEntities = function ( d ) { - return typeof d === 'string' ? - d.replace(//g, '>').replace(/"/g, '"') : - d; - }; - - /** - * Helpers for `columns.render`. - * - * The options defined here can be used with the `columns.render` initialisation - * option to provide a display renderer. The following functions are defined: - * - * * `number` - Will format numeric data (defined by `columns.data`) for - * display, retaining the original unformatted data for sorting and filtering. - * It takes 5 parameters: - * * `string` - Thousands grouping separator - * * `string` - Decimal point indicator - * * `integer` - Number of decimal points to show - * * `string` (optional) - Prefix. - * * `string` (optional) - Postfix (/suffix). - * * `text` - Escape HTML to help prevent XSS attacks. It has no optional - * parameters. - * - * @example - * // Column definition using the number renderer - * { - * data: "salary", - * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' ) - * } - * - * @namespace - */ - DataTable.render = { - number: function ( thousands, decimal, precision, prefix, postfix ) { - return { - display: function ( d ) { - if ( typeof d !== 'number' && typeof d !== 'string' ) { - return d; - } - - var negative = d < 0 ? '-' : ''; - var flo = parseFloat( d ); - - // If NaN then there isn't much formatting that we can do - just - // return immediately, escaping any HTML (this was supposed to - // be a number after all) - if ( isNaN( flo ) ) { - return __htmlEscapeEntities( d ); - } - - flo = flo.toFixed( precision ); - d = Math.abs( flo ); - - var intPart = parseInt( d, 10 ); - var floatPart = precision ? - decimal+(d - intPart).toFixed( precision ).substring( 2 ): - ''; - - return negative + (prefix||'') + - intPart.toString().replace( - /\B(?=(\d{3})+(?!\d))/g, thousands - ) + - floatPart + - (postfix||''); - } - }; - }, - - text: function () { - return { - display: __htmlEscapeEntities - }; - } - }; - - - /* - * This is really a good bit rubbish this method of exposing the internal methods - * publicly... - To be fixed in 2.0 using methods on the prototype - */ - - - /** - * Create a wrapper function for exporting an internal functions to an external API. - * @param {string} fn API function name - * @returns {function} wrapped function - * @memberof DataTable#internal - */ - function _fnExternApiFunc (fn) - { - return function() { - var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat( - Array.prototype.slice.call(arguments) - ); - return DataTable.ext.internal[fn].apply( this, args ); - }; - } - - - /** - * Reference to internal functions for use by plug-in developers. Note that - * these methods are references to internal functions and are considered to be - * private. If you use these methods, be aware that they are liable to change - * between versions. - * @namespace - */ - $.extend( DataTable.ext.internal, { - _fnExternApiFunc: _fnExternApiFunc, - _fnBuildAjax: _fnBuildAjax, - _fnAjaxUpdate: _fnAjaxUpdate, - _fnAjaxParameters: _fnAjaxParameters, - _fnAjaxUpdateDraw: _fnAjaxUpdateDraw, - _fnAjaxDataSrc: _fnAjaxDataSrc, - _fnAddColumn: _fnAddColumn, - _fnColumnOptions: _fnColumnOptions, - _fnAdjustColumnSizing: _fnAdjustColumnSizing, - _fnVisibleToColumnIndex: _fnVisibleToColumnIndex, - _fnColumnIndexToVisible: _fnColumnIndexToVisible, - _fnVisbleColumns: _fnVisbleColumns, - _fnGetColumns: _fnGetColumns, - _fnColumnTypes: _fnColumnTypes, - _fnApplyColumnDefs: _fnApplyColumnDefs, - _fnHungarianMap: _fnHungarianMap, - _fnCamelToHungarian: _fnCamelToHungarian, - _fnLanguageCompat: _fnLanguageCompat, - _fnBrowserDetect: _fnBrowserDetect, - _fnAddData: _fnAddData, - _fnAddTr: _fnAddTr, - _fnNodeToDataIndex: _fnNodeToDataIndex, - _fnNodeToColumnIndex: _fnNodeToColumnIndex, - _fnGetCellData: _fnGetCellData, - _fnSetCellData: _fnSetCellData, - _fnSplitObjNotation: _fnSplitObjNotation, - _fnGetObjectDataFn: _fnGetObjectDataFn, - _fnSetObjectDataFn: _fnSetObjectDataFn, - _fnGetDataMaster: _fnGetDataMaster, - _fnClearTable: _fnClearTable, - _fnDeleteIndex: _fnDeleteIndex, - _fnInvalidate: _fnInvalidate, - _fnGetRowElements: _fnGetRowElements, - _fnCreateTr: _fnCreateTr, - _fnBuildHead: _fnBuildHead, - _fnDrawHead: _fnDrawHead, - _fnDraw: _fnDraw, - _fnReDraw: _fnReDraw, - _fnAddOptionsHtml: _fnAddOptionsHtml, - _fnDetectHeader: _fnDetectHeader, - _fnGetUniqueThs: _fnGetUniqueThs, - _fnFeatureHtmlFilter: _fnFeatureHtmlFilter, - _fnFilterComplete: _fnFilterComplete, - _fnFilterCustom: _fnFilterCustom, - _fnFilterColumn: _fnFilterColumn, - _fnFilter: _fnFilter, - _fnFilterCreateSearch: _fnFilterCreateSearch, - _fnEscapeRegex: _fnEscapeRegex, - _fnFilterData: _fnFilterData, - _fnFeatureHtmlInfo: _fnFeatureHtmlInfo, - _fnUpdateInfo: _fnUpdateInfo, - _fnInfoMacros: _fnInfoMacros, - _fnInitialise: _fnInitialise, - _fnInitComplete: _fnInitComplete, - _fnLengthChange: _fnLengthChange, - _fnFeatureHtmlLength: _fnFeatureHtmlLength, - _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate, - _fnPageChange: _fnPageChange, - _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing, - _fnProcessingDisplay: _fnProcessingDisplay, - _fnFeatureHtmlTable: _fnFeatureHtmlTable, - _fnScrollDraw: _fnScrollDraw, - _fnApplyToChildren: _fnApplyToChildren, - _fnCalculateColumnWidths: _fnCalculateColumnWidths, - _fnThrottle: _fnThrottle, - _fnConvertToWidth: _fnConvertToWidth, - _fnGetWidestNode: _fnGetWidestNode, - _fnGetMaxLenString: _fnGetMaxLenString, - _fnStringToCss: _fnStringToCss, - _fnSortFlatten: _fnSortFlatten, - _fnSort: _fnSort, - _fnSortAria: _fnSortAria, - _fnSortListener: _fnSortListener, - _fnSortAttachListener: _fnSortAttachListener, - _fnSortingClasses: _fnSortingClasses, - _fnSortData: _fnSortData, - _fnSaveState: _fnSaveState, - _fnLoadState: _fnLoadState, - _fnSettingsFromNode: _fnSettingsFromNode, - _fnLog: _fnLog, - _fnMap: _fnMap, - _fnBindAction: _fnBindAction, - _fnCallbackReg: _fnCallbackReg, - _fnCallbackFire: _fnCallbackFire, - _fnLengthOverflow: _fnLengthOverflow, - _fnRenderer: _fnRenderer, - _fnDataSource: _fnDataSource, - _fnRowAttributes: _fnRowAttributes, - _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant - // in 1.10, so this dead-end function is - // added to prevent errors - } ); - - - // jQuery access - $.fn.dataTable = DataTable; - - // Provide access to the host jQuery object (circular reference) - DataTable.$ = $; - - // Legacy aliases - $.fn.dataTableSettings = DataTable.settings; - $.fn.dataTableExt = DataTable.ext; - - // With a capital `D` we return a DataTables API instance rather than a - // jQuery object - $.fn.DataTable = function ( opts ) { - return $(this).dataTable( opts ).api(); - }; - - // All properties that are available to $.fn.dataTable should also be - // available on $.fn.DataTable - $.each( DataTable, function ( prop, val ) { - $.fn.DataTable[ prop ] = val; - } ); - - - // Information about events fired by DataTables - for documentation. - /** - * Draw event, fired whenever the table is redrawn on the page, at the same - * point as fnDrawCallback. This may be useful for binding events or - * performing calculations when the table is altered at all. - * @name DataTable#draw.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Search event, fired when the searching applied to the table (using the - * built-in global search, or column filters) is altered. - * @name DataTable#search.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Page change event, fired when the paging of the table is altered. - * @name DataTable#page.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Order event, fired when the ordering applied to the table is altered. - * @name DataTable#order.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * DataTables initialisation complete event, fired when the table is fully - * drawn, including Ajax data loaded, if Ajax data is required. - * @name DataTable#init.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - */ - - /** - * State save event, fired when the table has changed state a new state save - * is required. This event allows modification of the state saving object - * prior to actually doing the save, including addition or other state - * properties (for plug-ins) or modification of a DataTables core property. - * @name DataTable#stateSaveParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The state information to be saved - */ - - /** - * State load event, fired when the table is loading state from the stored - * data, but prior to the settings object being modified by the saved state - * - allowing modification of the saved state is required or loading of - * state for a plug-in. - * @name DataTable#stateLoadParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * State loaded event, fired when state has been loaded from stored data and - * the settings object has been modified by the loaded data. - * @name DataTable#stateLoaded.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * Processing event, fired when DataTables is doing some kind of processing - * (be it, order, searcg or anything else). It can be used to indicate to - * the end user that there is something happening, or that something has - * finished. - * @name DataTable#processing.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {boolean} bShow Flag for if DataTables is doing processing or not - */ - - /** - * Ajax (XHR) event, fired whenever an Ajax request is completed from a - * request to made to the server for new data. This event is called before - * DataTables processed the returned data, so it can also be used to pre- - * process the data returned from the server, if needed. - * - * Note that this trigger is called in `fnServerData`, if you override - * `fnServerData` and which to use this event, you need to trigger it in you - * success function. - * @name DataTable#xhr.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - * @param {object} json JSON returned from the server - * - * @example - * // Use a custom property returned from the server in another DOM element - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * $('#status').html( json.status ); - * } ); - * - * @example - * // Pre-process the data returned from the server - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * for ( var i=0, ien=json.aaData.length ; i */function( $ ) { "use strict"; - /** - * DataTables is a plug-in for the jQuery Javascript library. It is a - * highly flexible tool, based upon the foundations of progressive - * enhancement, which will add advanced interaction controls to any + /** + * DataTables is a plug-in for the jQuery Javascript library. It is a + * highly flexible tool, based upon the foundations of progressive + * enhancement, which will add advanced interaction controls to any * HTML table. For a full list of features please refer to * DataTables.net. * * Note that the DataTable object is not a global variable but is - * aliased to jQuery.fn.DataTable and jQuery.fn.dataTable through which + * aliased to jQuery.fn.DataTable and jQuery.fn.dataTable through which * it may be accessed. * * @class * @param {object} [oInit={}] Configuration object for DataTables. Options * are defined by {@link DataTable.defaults} * @requires jQuery 1.3+ - * + * * @example * // Basic initialisation * $(document).ready( function { * $('#example').dataTable(); * } ); - * + * * @example * // Initialisation with configuration options - in this case, disable * // pagination and sorting. * $(document).ready( function { * $('#example').dataTable( { * "bPaginate": false, - * "bSort": false + * "bSort": false * } ); * } ); */ @@ -216,7 +216,7 @@ /** - * Adjust the table column widths for new data. Note: you would probably want to + * Adjust the table column widths for new data. Note: you would probably want to * do a redraw after calling this function! * @param {object} oSettings dataTables settings object * @memberof DataTable#oApi @@ -287,7 +287,7 @@ /** * Get an array of column indexes that match a given property * @param {object} oSettings dataTables settings object - * @param {string} sParam Parameter in aoColumns to look for - typically + * @param {string} sParam Parameter in aoColumns to look for - typically * bVisible or bSearchable * @returns {array} Array of indexes with matched properties * @memberof DataTable#oApi @@ -451,7 +451,7 @@ } /** - * Add a data array to the table, creating DOM node etc. This is the parallel to + * Add a data array to the table, creating DOM node etc. This is the parallel to * _fnGatherData, but for adding rows from a Javascript source, rather than a * DOM source. * @param {object} oSettings dataTables settings object @@ -629,7 +629,7 @@ { oCol.sType = sThisType; } - else if ( oCol.sType != sThisType && + else if ( oCol.sType != sThisType && oCol.sType != "html" ) { /* String is always the 'fallback' option */ @@ -848,7 +848,7 @@ } else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) ) { - /* If there is a . in the source string then the data source is in a + /* If there is a . in the source string then the data source is in a * nested object so we loop over the data for each level to get the next * level down. On each loop we test for undefined, and if found immediately * return. This allows entire objects to be missing and sDefaultContent to @@ -1034,7 +1034,7 @@ /** - * Take an array of integers (index array) and remove a target integer (value - not + * Take an array of integers (index array) and remove a target integer (value - not * the key!) * @param {array} a Index array to target * @param {int} iTarget value to find @@ -1282,13 +1282,13 @@ * Draw the header (or footer) element based on the column visibility states. The * methodology here is to use the layout array from _fnDetectHeader, modified for * the instantaneous column visibility, to construct the new layout. The grid is - * traversed over cell at a time in a rows x columns grid fashion, although each + * traversed over cell at a time in a rows x columns grid fashion, although each * cell insert can cover multiple elements in the grid - which is tracks using the * aApplied array. Cell inserts in the grid will only occur where there isn't * already a cell in that position. * @param {object} oSettings dataTables settings object * @param array {objects} aoSource Layout array from _fnDetectHeader - * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, + * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, * @memberof DataTable#oApi */ function _fnDrawHead( oSettings, aoSource, bIncludeHidden ) @@ -1465,7 +1465,7 @@ } /* Row callback functions - might want to manipulate the row */ - _fnCallbackFire( oSettings, 'aoRowCallback', null, + _fnCallbackFire( oSettings, 'aoRowCallback', null, [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] ); anRows.push( nRow ); @@ -1516,15 +1516,15 @@ } /* Header and footer callbacks */ - _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], + _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] ); - _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], + _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] ); - /* + /* * Need to remove any old row from the display - note we can't just empty the tbody using - * $().html('') since this will unbind the jQuery event handlers (even although the node + * $().html('') since this will unbind the jQuery event handlers (even although the node * still exists!) - equally we can't use innerHTML, since IE throws an exception. */ var @@ -1620,7 +1620,7 @@ var nHolding = $('
    ')[0]; oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable ); - /* + /* * All DataTables are wrapped in a div */ oSettings.nTableWrapper = $('
    ')[0]; @@ -1813,7 +1813,7 @@ iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan; iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan; - /* There might be colspan cells already in this row, so shift our target + /* There might be colspan cells already in this row, so shift our target * accordingly */ iColShifted = fnShiftCol( aLayout, i, iColumn ); @@ -1865,7 +1865,7 @@ { for ( var j=0, jLen=aLayout[i].length ; j + if ( $(this).scrollTop() + $(this).height() > $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap ) { /* Only do the redraw if we have to - we might be at the end of the data */ @@ -3281,7 +3281,7 @@ * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this * into account. */ - if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || + if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) { o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth); @@ -3322,16 +3322,16 @@ * set the width based on the real headers */ - // Apply all styles in one pass. Invalidates layout only once because we don't read any + // Apply all styles in one pass. Invalidates layout only once because we don't read any // DOM properties. _fnApplyToChildren( zeroOut, anHeadSizers ); - - // Read all widths in next pass. Forces layout only once because we do not change + + // Read all widths in next pass. Forces layout only once because we do not change // any DOM properties. _fnApplyToChildren( function(nSizer) { aApplied.push( _fnStringToCss( $(nSizer).width() ) ); }, anHeadSizers ); - + // Apply all widths in final pass. Invalidates layout only once because we do not // read any DOM properties. _fnApplyToChildren( function(nToSize, i) { @@ -3344,11 +3344,11 @@ if ( o.nTFoot !== null ) { _fnApplyToChildren( zeroOut, anFootSizers ); - + _fnApplyToChildren( function(nSizer) { aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) ); }, anFootSizers ); - + _fnApplyToChildren( function(nToSize, i) { nToSize.style.width = aAppliedFooter[i]; }, anFootToSize ); @@ -3382,12 +3382,12 @@ if ( $(o.nTable).outerWidth() < iSanityWidth ) { /* The min width depends upon if we have a vertical scrollbar visible or not */ - var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || + var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll")) ? iSanityWidth+o.oScroll.iBarWidth : iSanityWidth; /* IE6/7 are a law unto themselves... */ - if ( ie67 && (nScrollBody.scrollHeight > + if ( ie67 && (nScrollBody.scrollHeight > nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) { o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth ); @@ -3577,7 +3577,7 @@ if ( oSettings.aoColumns[i].sWidth !== null ) { - iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, + iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig, nWrapper ); if ( iTmpWidth !== null ) { @@ -3589,8 +3589,8 @@ } } - /* If the number of columns in the DOM equals the number that we have to process in - * DataTables, then we can use the offsets that are created by the web-browser. No custom + /* If the number of columns in the DOM equals the number that we have to process in + * DataTables, then we can use the offsets that are created by the web-browser. No custom * sizes can be set in order for this to happen, nor scrolling used */ if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums && @@ -3719,7 +3719,7 @@ oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] ); } - /* Browsers need a bit of a hand when a width is assigned to any columns when + /* Browsers need a bit of a hand when a width is assigned to any columns when * x-scrolling as they tend to collapse the table to the min-width, even if * we sent the column widths. So we need to keep track of what the table width * should be by summing the user given values, and the automatic values @@ -3891,7 +3891,7 @@ * @memberof DataTable#oApi */ function _fnScrollBarWidth () - { + { var inner = document.createElement('p'); var style = inner.style; style.width = "100%"; @@ -3920,7 +3920,7 @@ } document.body.removeChild(outer); - return (w1 - w2); + return (w1 - w2); } /** @@ -3942,7 +3942,7 @@ oAria = oSettings.oLanguage.oAria; /* No sorting required if server-side or no sorting array */ - if ( !oSettings.oFeatures.bServerSide && + if ( !oSettings.oFeatures.bServerSide && (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) ) { aaSort = ( oSettings.aaSortingFixed !== null ) ? @@ -3959,7 +3959,7 @@ sDataType = oSettings.aoColumns[ iColumn ].sSortDataType; if ( DataTable.ext.afnSortData[sDataType] ) { - var aData = DataTable.ext.afnSortData[sDataType].call( + var aData = DataTable.ext.afnSortData[sDataType].call( oSettings.oInstance, oSettings, iColumn, iVisColumn ); if ( aData.length === aoData.length ) @@ -4022,7 +4022,7 @@ * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); * } * Basically we have a test for each sorting column, if the data in that column is equal, - * test the next column. If all columns match, then we use a numeric sort on the row + * test the next column. If all columns match, then we use a numeric sort on the row * positions in the original data array to provide a stable sort. */ oSettings.aiDisplayMaster.sort( function ( a, b ) { @@ -4071,7 +4071,7 @@ { nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" ); - var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? + var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0]; nTh.setAttribute('aria-label', sTitle+ (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); @@ -4127,14 +4127,14 @@ /* * This is a little bit odd I admit... I declare a temporary function inside the scope of - * _fnBuildHead and the click handler in order that the code presented here can be used - * twice - once for when bProcessing is enabled, and another time for when it is + * _fnBuildHead and the click handler in order that the code presented here can be used + * twice - once for when bProcessing is enabled, and another time for when it is * disabled, as we need to perform slightly different actions. - * Basically the issue here is that the Javascript engine in modern browsers don't + * Basically the issue here is that the Javascript engine in modern browsers don't * appear to allow the rendering engine to update the display while it is still executing - * it's thread (well - it does but only after long intervals). This means that the + * it's thread (well - it does but only after long intervals). This means that the * 'processing' display doesn't appear for a table sort. To break the js thread up a bit - * I force an execution break by using setTimeout - but this breaks the expected + * I force an execution break by using setTimeout - but this breaks the expected * thread continuation for the end-developer's point of view (their code would execute * too early), so we only do it when we absolutely have to. */ @@ -4172,7 +4172,7 @@ /* No sort yet - add it in */ if ( bFound === false ) { - oSettings.aaSorting.push( [ iDataIndex, + oSettings.aaSorting.push( [ iDataIndex, oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] ); } } @@ -4193,7 +4193,7 @@ else { oSettings.aaSorting.splice( 0, oSettings.aaSorting.length ); - oSettings.aaSorting.push( [ iDataIndex, + oSettings.aaSorting.push( [ iDataIndex, oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] ); } } @@ -4228,7 +4228,7 @@ /** - * Set the sorting classes on the header, Note: it is safe to call this function + * Set the sorting classes on the header, Note: it is safe to call this function * when bSort and bSortClasses are false * @param {object} oSettings dataTables settings object * @memberof DataTable#oApi @@ -4281,7 +4281,7 @@ { /* jQuery UI uses extra markup */ var jqSpan = $("span."+oClasses.sSortIcon, oSettings.aoColumns[i].nTh); - jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ + jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+ oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed ); var sSpanClass; @@ -4310,11 +4310,11 @@ } } - /* + /* * Apply the required classes to the table body * Note that this is given as a feature switch since it can significantly slow down a sort * on large data sets (adding and removing of classes is always slow at the best of times..) - * Further to this, note that this code is admittedly fairly ugly. It could be made a lot + * Further to this, note that this code is admittedly fairly ugly. It could be made a lot * simpler using jQuery selectors and add/removeClass, but that is significantly slower * (on the order of 5 times slower) - hence the direct DOM manipulation here. * Note that for deferred drawing we do use jQuery - the reason being that taking the first @@ -4484,7 +4484,7 @@ var date = new Date(); date.setTime( date.getTime()+(iSecs*1000) ); - /* + /* * Shocking but true - it would appear IE has major issues with having the path not having * a trailing slash on it. We need the cookie to be available based on the path, so we * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the @@ -4496,7 +4496,7 @@ if ( fnCallback !== null ) { - oData = (typeof $.parseJSON === 'function') ? + oData = (typeof $.parseJSON === 'function') ? $.parseJSON( sValue ) : eval( '('+sValue+')' ); sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(), aParts.join('/')+"/" ); @@ -4635,7 +4635,7 @@ /** * Return an flat array with all TD nodes for the table, or row * @param {object} oSettings dataTables settings object - * @param {int} [iIndividualRow] aoData index to get the nodes for - optional + * @param {int} [iIndividualRow] aoData index to get the nodes for - optional * if not given then the return array will contain all nodes for the table * @returns {array} TD array * @memberof DataTable#oApi @@ -4862,7 +4862,7 @@ /** * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other - * library, then we use that as it is fast, safe and accurate. If the function isn't + * library, then we use that as it is fast, safe and accurate. If the function isn't * available then we need to built it ourselves - the inspiration for this function comes * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is * not perfect and absolutely should not be used as a replacement to json2.js - but it does @@ -4948,7 +4948,7 @@ * Can be either 'current', whereby the current sorting of the table is used, or * 'original' whereby the original order the data was read into the table is used. * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page - * ("current") or not ("all"). If 'current' is given, then order is assumed to be + * ("current") or not ("all"). If 'current' is given, then order is assumed to be * 'current' and filter is 'applied', regardless of what they might be given as. * @returns {object} jQuery object, filtered by the given selector. * @dtopt API @@ -5069,7 +5069,7 @@ * Almost identical to $ in operation, but in this case returns the data for the matched * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes * rather than any descendants, so the data can be obtained for the row/cell. If matching - * rows are found, the data returned is the original data array/object that was used to + * rows are found, the data returned is the original data array/object that was used to * create the row (or a generated array if from a DOM source). * * This method is often useful in-combination with $ where both functions are given the @@ -5082,10 +5082,10 @@ * Can be either 'current', whereby the current sorting of the table is used, or * 'original' whereby the original order the data was read into the table is used. * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page - * ("current") or not ("all"). If 'current' is given, then order is assumed to be + * ("current") or not ("all"). If 'current' is given, then order is assumed to be * 'current' and filter is 'applied', regardless of what they might be given as. * @returns {array} Data for the matched elements. If any elements, as a result of the - * selector, were not TR, TD or TH elements in the DataTable, they will have a null + * selector, were not TR, TD or TH elements in the DataTable, they will have a null * entry in the array. * @dtopt API * @@ -5104,10 +5104,10 @@ * $(document).ready(function() { * var oTable = $('#example').dataTable(); * - * // Filter to 'Webkit' and get all data for + * // Filter to 'Webkit' and get all data for * oTable.fnFilter('Webkit'); * var data = oTable._('tr', {"filter": "applied"}); - * + * * // Do something with the data * alert( data.length+" rows matched the filter" ); * } ); @@ -5129,7 +5129,7 @@ /** * Add a single new row or multiple rows of data to the table. Please note - * that this is suitable for client-side processing only - if you are using + * that this is suitable for client-side processing only - if you are using * server-side processing (i.e. "bServerSide": true), then to add data, you * must add it to the data source, i.e. the server-side, through an Ajax call. * @param {array|object} mData The data to be added to the table. This can be: @@ -5140,19 +5140,19 @@ *
  • array of objects - multiple data objects when using mData
  • * * @param {bool} [bRedraw=true] redraw the table or not - * @returns {array} An array of integers, representing the list of indexes in - * aoData ({@link DataTable.models.oSettings}) that have been added to + * @returns {array} An array of integers, representing the list of indexes in + * aoData ({@link DataTable.models.oSettings}) that have been added to * the table. * @dtopt API * * @example * // Global var for counter * var giCount = 2; - * + * * $(document).ready(function() { * $('#example').dataTable(); * } ); - * + * * function fnClickAddRow() { * $('#example').dataTable().fnAddData( [ * giCount+".1", @@ -5160,7 +5160,7 @@ * giCount+".3", * giCount+".4" ] * ); - * + * * giCount++; * } */ @@ -5211,9 +5211,9 @@ /** - * This function will make DataTables recalculate the column sizes, based on the data - * contained in the table and the sizes applied to the columns (in the DOM, CSS or - * through the sWidth parameter). This can be useful when the width of the table's + * This function will make DataTables recalculate the column sizes, based on the data + * contained in the table and the sizes applied to the columns (in the DOM, CSS or + * through the sWidth parameter). This can be useful when the width of the table's * parent element changes (for example a window resize). * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to * @dtopt API @@ -5224,7 +5224,7 @@ * "sScrollY": "200px", * "bPaginate": false * } ); - * + * * $(window).bind('resize', function () { * oTable.fnAdjustColumnSizing(); * } ); @@ -5255,7 +5255,7 @@ * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...) * oTable.fnClearTable(); * } ); @@ -5274,7 +5274,7 @@ /** - * The exact opposite of 'opening' a row, this function will close any rows which + * The exact opposite of 'opening' a row, this function will close any rows which * are currently 'open'. * @param {node} nTr the table row to 'close' * @returns {int} 0 on success, or 1 if failed (can't find the row) @@ -5283,7 +5283,7 @@ * @example * $(document).ready(function() { * var oTable; - * + * * // 'open' an information row when a row is clicked on * $('#example tbody tr').click( function () { * if ( oTable.fnIsOpen(this) ) { @@ -5292,7 +5292,7 @@ * oTable.fnOpen( this, "Temporary row opened", "info_row" ); * } * } ); - * + * * oTable = $('#example').dataTable(); * } ); */ @@ -5331,7 +5331,7 @@ * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Immediately remove the first row * oTable.fnDeleteRow( 0 ); * } ); @@ -5342,7 +5342,7 @@ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); var i, iLen, iAODataIndex; - iAODataIndex = (typeof mTarget === 'object') ? + iAODataIndex = (typeof mTarget === 'object') ? _fnNodeToDataIndex(oSettings, mTarget) : mTarget; /* Return the data array from this row */ @@ -5392,7 +5392,7 @@ /** - * Restore the table to it's original state in the DOM by removing all of DataTables + * Restore the table to it's original state in the DOM by removing all of DataTables * enhancements, alterations to the DOM structure of the table and event listeners. * @param {boolean} [bRemove=false] Completely remove the table from the DOM * @dtopt API @@ -5540,7 +5540,7 @@ * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Re-draw the table - you wouldn't want to do it here, but it's an example :-) * oTable.fnDraw(); * } ); @@ -5573,7 +5573,7 @@ * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Sometime later - filter... * oTable.fnFilter( 'test string' ); * } ); @@ -5651,7 +5651,7 @@ /** - * Get the data for the whole table, an individual row or an individual cell based on the + * Get the data for the whole table, an individual row or an individual cell based on the * provided parameters. * @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as * a TR node then the data source for the whole row will be returned. If given as a @@ -5719,8 +5719,8 @@ /** - * Get an array of the TR nodes that are used in the table's body. Note that you will - * typically want to use the '$' API method in preference to this as it is more + * Get an array of the TR nodes that are used in the table's body. Note that you will + * typically want to use the '$' API method in preference to this as it is more * flexible. * @param {int} [iRow] Optional row index for the TR element you want * @returns {array|node} If iRow is undefined, returns an array of all TR elements @@ -5730,7 +5730,7 @@ * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Get the nodes from the table * var nNodes = oTable.fnGetNodes( ); * } ); @@ -5752,7 +5752,7 @@ * and column index including hidden columns * @param {node} nNode this can either be a TR, TD or TH in the table's body * @returns {int} If nNode is given as a TR, then a single index is returned, or - * if given as a cell, an array of [row index, column index (visible), + * if given as a cell, an array of [row index, column index (visible), * column index (all)] is given. * @dtopt API * @@ -5761,15 +5761,15 @@ * $('#example tbody td').click( function () { * // Get the position of the current data from the node * var aPos = oTable.fnGetPosition( this ); - * + * * // Get the data array for this row * var aData = oTable.fnGetData( aPos[0] ); - * + * * // Update the data array and return the value * aData[ aPos[1] ] = 'clicked'; * this.innerHTML = 'clicked'; * } ); - * + * * // Init DataTables * oTable = $('#example').dataTable(); * } ); @@ -5802,7 +5802,7 @@ * @example * $(document).ready(function() { * var oTable; - * + * * // 'open' an information row when a row is clicked on * $('#example tbody tr').click( function () { * if ( oTable.fnIsOpen(this) ) { @@ -5811,7 +5811,7 @@ * oTable.fnOpen( this, "Temporary row opened", "info_row" ); * } * } ); - * + * * oTable = $('#example').dataTable(); * } ); */ @@ -5832,9 +5832,9 @@ /** - * This function will place a new row directly after a row which is currently - * on display on the page, with the HTML contents that is passed into the - * function. This can be used, for example, to ask for confirmation that a + * This function will place a new row directly after a row which is currently + * on display on the page, with the HTML contents that is passed into the + * function. This can be used, for example, to ask for confirmation that a * particular record should be deleted. * @param {node} nTr The table row to 'open' * @param {string|node|jQuery} mHtml The HTML to put into the row @@ -5847,7 +5847,7 @@ * @example * $(document).ready(function() { * var oTable; - * + * * // 'open' an information row when a row is clicked on * $('#example tbody tr').click( function () { * if ( oTable.fnIsOpen(this) ) { @@ -5856,7 +5856,7 @@ * oTable.fnOpen( this, "Temporary row opened", "info_row" ); * } * } ); - * + * * oTable = $('#example').dataTable(); * } ); */ @@ -5907,8 +5907,8 @@ /** - * Change the pagination - provides the internal logic for pagination in a simple API - * function. With this function you can have a DataTables table go to the next, + * Change the pagination - provides the internal logic for pagination in a simple API + * function. With this function you can have a DataTables table go to the next, * previous, first or last pages. * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" * or page number to jump to (integer), note that page 0 is the first page. @@ -5944,7 +5944,7 @@ * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Hide the second column after initialisation * oTable.fnSetColumnVis( 1, false ); * } ); @@ -5997,14 +5997,14 @@ { if ( bAppend ) { - aoData[i].nTr.appendChild( + aoData[i].nTr.appendChild( aoData[i]._anHidden[iCol] ); } else { aoData[i].nTr.insertBefore( - aoData[i]._anHidden[iCol], + aoData[i]._anHidden[iCol], _fnGetTdNodes( oSettings, i )[iBefore] ); } } @@ -6040,8 +6040,8 @@ oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings ); } - /* Do a redraw incase anything depending on the table columns needs it - * (built-in: scrolling) + /* Do a redraw incase anything depending on the table columns needs it + * (built-in: scrolling) */ if ( bRedraw === undefined || bRedraw ) { @@ -6055,7 +6055,7 @@ /** * Get the settings for a particular table for external manipulation - * @returns {object} DataTables settings object. See + * @returns {object} DataTables settings object. See * {@link DataTable.models.oSettings} * @dtopt API * @@ -6063,7 +6063,7 @@ * $(document).ready(function() { * var oTable = $('#example').dataTable(); * var oSettings = oTable.fnSettings(); - * + * * // Show an example parameter from the settings * alert( oSettings._iDisplayStart ); * } ); @@ -6076,14 +6076,14 @@ /** * Sort the table by a particular column - * @param {int} iCol the data index to sort on. Note that this will not match the + * @param {int} iCol the data index to sort on. Note that this will not match the * 'display index' if you have hidden data entries * @dtopt API * * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Sort immediately with columns 0 and 1 * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] ); * } ); @@ -6106,7 +6106,7 @@ * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); - * + * * // Sort on column 1, when 'sorter' is clicked on * oTable.fnSortListener( document.getElementById('sorter'), 1 ); * } ); @@ -6142,7 +6142,7 @@ { var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); var i, iLen, sDisplay; - var iRow = (typeof mRow === 'object') ? + var iRow = (typeof mRow === 'object') ? _fnNodeToDataIndex(oSettings, mRow) : mRow; if ( $.isArray(mData) && iColumn === undefined ) @@ -6194,7 +6194,7 @@ */ var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay ); oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( - oSettings, + oSettings, _fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) ) ); @@ -6247,7 +6247,7 @@ function _fnExternApiFunc (sFunc) { return function() { - var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( + var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat( Array.prototype.slice.call(arguments) ); return DataTable.ext.oApi[sFunc].apply( this, aArgs ); }; @@ -6521,5579 +6521,4 @@ if ( oInit.bJQueryUI ) { - /* Use the JUI classes object for display. You could clone the oStdClasses object if - * you want to have multiple tables with multiple independent classes - */ - $.extend( oSettings.oClasses, DataTable.ext.oJUIClasses ); - - if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" ) - { - /* Set the DOM to use a layout suitable for jQuery UI's theming */ - oSettings.sDom = '<"H"lfr>t<"F"ip>'; - } - } - else - { - $.extend( oSettings.oClasses, DataTable.ext.oStdClasses ); - } - $(this).addClass( oSettings.oClasses.sTable ); - - /* Calculate the scroll bar width and cache it for use later on */ - if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" ) - { - oSettings.oScroll.iBarWidth = _fnScrollBarWidth(); - } - - if ( oSettings.iInitDisplayStart === undefined ) - { - /* Display start point, taking into account the save saving */ - oSettings.iInitDisplayStart = oInit.iDisplayStart; - oSettings._iDisplayStart = oInit.iDisplayStart; - } - - /* Must be done after everything which can be overridden by a cookie! */ - if ( oInit.bStateSave ) - { - oSettings.oFeatures.bStateSave = true; - _fnLoadState( oSettings, oInit ); - _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' ); - } - - if ( oInit.iDeferLoading !== null ) - { - oSettings.bDeferLoading = true; - var tmp = $.isArray( oInit.iDeferLoading ); - oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading; - oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading; - } - - if ( oInit.aaData !== null ) - { - bUsePassedData = true; - } - - /* Language definitions */ - if ( oInit.oLanguage.sUrl !== "" ) - { - /* Get the language definitions from a file - because this Ajax call makes the language - * get async to the remainder of this function we use bInitHandedOff to indicate that - * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor - */ - oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl; - $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) { - _fnLanguageCompat( json ); - $.extend( true, oSettings.oLanguage, oInit.oLanguage, json ); - _fnInitialise( oSettings ); - } ); - bInitHandedOff = true; - } - else - { - $.extend( true, oSettings.oLanguage, oInit.oLanguage ); - } - - - /* - * Stripes - */ - if ( oInit.asStripeClasses === null ) - { - oSettings.asStripeClasses =[ - oSettings.oClasses.sStripeOdd, - oSettings.oClasses.sStripeEven - ]; - } - - /* Remove row stripe classes if they are already on the table row */ - iLen=oSettings.asStripeClasses.length; - oSettings.asDestroyStripes = []; - if (iLen) - { - var bStripeRemove = false; - var anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')'); - for ( i=0 ; i= oSettings.aoColumns.length ) - { - oSettings.aaSorting[i][0] = 0; - } - var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ]; - - /* Add a default sorting index */ - if ( oSettings.aaSorting[i][2] === undefined ) - { - oSettings.aaSorting[i][2] = 0; - } - - /* If aaSorting is not defined, then we use the first indicator in asSorting */ - if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined ) - { - oSettings.aaSorting[i][1] = oColumn.asSorting[0]; - } - - /* Set the current sorting index based on aoColumns.asSorting */ - for ( j=0, jLen=oColumn.asSorting.length ; j 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) - { - // If we are a scrolling table, and no footer has been given, then we need to create - // a tfoot element for the caption element to be appended to - tfoot = [ document.createElement( 'tfoot' ) ]; - this.appendChild( tfoot[0] ); - } - - if ( tfoot.length > 0 ) - { - oSettings.nTFoot = tfoot[0]; - _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot ); - } - - /* Check if there is data passing into the constructor */ - if ( bUsePassedData ) - { - for ( i=0 ; i= parseInt(sThat, 10); - }; - - - /** - * Check if a TABLE node is a DataTable table already or not. - * @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other - * node types can be passed in, but will always return false). - * @returns {boolean} true the table given is a DataTable, or false otherwise - * @static - * @dtopt API-Static - * - * @example - * var ex = document.getElementById('example'); - * if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) { - * $(ex).dataTable(); - * } - */ - DataTable.fnIsDataTable = function ( nTable ) - { - var o = DataTable.settings; - - for ( var i=0 ; i 0 ) { - * $(table).dataTable().fnAdjustColumnSizing(); - * } - */ - DataTable.fnTables = function ( bVisible ) - { - var out = []; - - jQuery.each( DataTable.settings, function (i, o) { - if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) ) - { - out.push( o.nTable ); - } - } ); - - return out; - }; - - - /** - * Version string for plug-ins to check compatibility. Allowed format is - * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and - * e are optional - * @member - * @type string - * @default Version number - */ - DataTable.version = "1.9.4"; - - /** - * Private data store, containing all of the settings objects that are created for the - * tables on a given page. - * - * Note that the DataTable.settings object is aliased to jQuery.fn.dataTableExt - * through which it may be accessed and manipulated, or jQuery.fn.dataTable.settings. - * @member - * @type array - * @default [] - * @private - */ - DataTable.settings = []; - - /** - * Object models container, for the various models that DataTables has available - * to it. These models define the objects that are used to hold the active state - * and configuration of the table. - * @namespace - */ - DataTable.models = {}; - - - /** - * DataTables extension options and plug-ins. This namespace acts as a collection "area" - * for plug-ins that can be used to extend the default DataTables behaviour - indeed many - * of the build in methods use this method to provide their own capabilities (sorting methods - * for example). - * - * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed - * and modified by plug-ins. - * @namespace - */ - DataTable.models.ext = { - /** - * Plug-in filtering functions - this method of filtering is complimentary to the default - * type based filtering, and a lot more comprehensive as it allows you complete control - * over the filtering logic. Each element in this array is a function (parameters - * described below) that is called for every row in the table, and your logic decides if - * it should be included in the filtered data set or not. - *
      - *
    • - * Function input parameters: - *
        - *
      • {object} DataTables settings object: see {@link DataTable.models.oSettings}.
      • - *
      • {array|object} Data for the row to be processed (same as the original format - * that was passed in as the data source, or an array from a DOM data source
      • - *
      • {int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can - * be useful to retrieve the TR element if you need DOM interaction.
      • - *
      - *
    • - *
    • - * Function return: - *
        - *
      • {boolean} Include the row in the filtered result set (true) or not (false)
      • - *
      - * - *
    - * @type array - * @default [] - * - * @example - * // The following example shows custom filtering being applied to the fourth column (i.e. - * // the aData[3] index) based on two input values from the end-user, matching the data in - * // a certain range. - * $.fn.dataTableExt.afnFiltering.push( - * function( oSettings, aData, iDataIndex ) { - * var iMin = document.getElementById('min').value * 1; - * var iMax = document.getElementById('max').value * 1; - * var iVersion = aData[3] == "-" ? 0 : aData[3]*1; - * if ( iMin == "" && iMax == "" ) { - * return true; - * } - * else if ( iMin == "" && iVersion < iMax ) { - * return true; - * } - * else if ( iMin < iVersion && "" == iMax ) { - * return true; - * } - * else if ( iMin < iVersion && iVersion < iMax ) { - * return true; - * } - * return false; - * } - * ); - */ - "afnFiltering": [], - - - /** - * Plug-in sorting functions - this method of sorting is complimentary to the default type - * based sorting that DataTables does automatically, allowing much greater control over the - * the data that is being used to sort a column. This is useful if you want to do sorting - * based on live data (for example the contents of an 'input' element) rather than just the - * static string that DataTables knows of. The way these plug-ins work is that you create - * an array of the values you wish to be sorted for the column in question and then return - * that array. Which pre-sorting function is run here depends on the sSortDataType parameter - * that is used for the column (if any). This is the corollary of ofnSearch for sort - * data. - *
      - *
    • - * Function input parameters: - *
        - *
      • {object} DataTables settings object: see {@link DataTable.models.oSettings}.
      • - *
      • {int} Target column index
      • - *
      - *
    • - *
    • - * Function return: - *
        - *
      • {array} Data for the column to be sorted upon
      • - *
      - * - *
    - * - * Note that as of v1.9, it is typically preferable to use mData to prepare data for - * the different uses that DataTables can put the data to. Specifically mData when - * used as a function will give you a 'type' (sorting, filtering etc) that you can use to - * prepare the data as required for the different types. As such, this method is deprecated. - * @type array - * @default [] - * @deprecated - * - * @example - * // Updating the cached sorting information with user entered values in HTML input elements - * jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn ) - * { - * var aData = []; - * $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () { - * aData.push( this.value ); - * } ); - * return aData; - * } - */ - "afnSortData": [], - - - /** - * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are - * available to DataTables. These feature plug-ins are accessible through the sDom initialisation - * option. As such, each feature plug-in must describe a function that is used to initialise - * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name - * of the feature (sFeature). Thus the objects attached to this method must provide: - *
      - *
    • {function} fnInit Initialisation of the plug-in - *
        - *
      • - * Function input parameters: - *
          - *
        • {object} DataTables settings object: see {@link DataTable.models.oSettings}.
        • - *
        - *
      • - *
      • - * Function return: - *
          - *
        • {node|null} The element which contains your feature. Note that the return - * may also be void if your plug-in does not require to inject any DOM elements - * into DataTables control (sDom) - for example this might be useful when - * developing a plug-in which allows table control via keyboard entry.
        • - *
        - * - *
      - *
    • - *
    • {character} cFeature Character that will be matched in sDom - case sensitive
    • - *
    • {string} sFeature Feature name
    • - *
    - * @type array - * @default [] - * - * @example - * // How TableTools initialises itself. - * $.fn.dataTableExt.aoFeatures.push( { - * "fnInit": function( oSettings ) { - * return new TableTools( { "oDTSettings": oSettings } ); - * }, - * "cFeature": "T", - * "sFeature": "TableTools" - * } ); - */ - "aoFeatures": [], - - - /** - * Type detection plug-in functions - DataTables utilises types to define how sorting and - * filtering behave, and types can be either be defined by the developer (sType for the - * column) or they can be automatically detected by the methods in this array. The functions - * defined in the array are quite simple, taking a single parameter (the data to analyse) - * and returning the type if it is a known type, or null otherwise. - *
      - *
    • - * Function input parameters: - *
        - *
      • {*} Data from the column cell to be analysed
      • - *
      - *
    • - *
    • - * Function return: - *
        - *
      • {string|null} Data type detected, or null if unknown (and thus pass it - * on to the other type detection functions.
      • - *
      - * - *
    - * @type array - * @default [] - * - * @example - * // Currency type detection plug-in: - * jQuery.fn.dataTableExt.aTypes.push( - * function ( sData ) { - * var sValidChars = "0123456789.-"; - * var Char; - * - * // Check the numeric part - * for ( i=1 ; iafnSortData
    for filtering data. - *
      - *
    • - * Function input parameters: - *
        - *
      • {*} Data from the column cell to be prepared for filtering
      • - *
      - *
    • - *
    • - * Function return: - *
        - *
      • {string|null} Formatted string that will be used for the filtering.
      • - *
      - * - *
    - * - * Note that as of v1.9, it is typically preferable to use mData to prepare data for - * the different uses that DataTables can put the data to. Specifically mData when - * used as a function will give you a 'type' (sorting, filtering etc) that you can use to - * prepare the data as required for the different types. As such, this method is deprecated. - * @type object - * @default {} - * @deprecated - * - * @example - * $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) { - * return sData.replace(/\n/g," ").replace( /<.*?>/g, "" ); - * } - */ - "ofnSearch": {}, - - - /** - * Container for all private functions in DataTables so they can be exposed externally - * @type object - * @default {} - */ - "oApi": {}, - - - /** - * Storage for the various classes that DataTables uses - * @type object - * @default {} - */ - "oStdClasses": {}, - - - /** - * Storage for the various classes that DataTables uses - jQuery UI suitable - * @type object - * @default {} - */ - "oJUIClasses": {}, - - - /** - * Pagination plug-in methods - The style and controls of the pagination can significantly - * impact on how the end user interacts with the data in your table, and DataTables allows - * the addition of pagination controls by extending this object, which can then be enabled - * through the sPaginationType initialisation parameter. Each pagination type that - * is added is an object (the property name of which is what sPaginationType refers - * to) that has two properties, both methods that are used by DataTables to update the - * control's state. - *
      - *
    • - * fnInit - Initialisation of the paging controls. Called only during initialisation - * of the table. It is expected that this function will add the required DOM elements - * to the page for the paging controls to work. The element pointer - * 'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging - * controls (note that this is a 2D array to allow for multiple instances of each - * DataTables DOM element). It is suggested that you add the controls to this element - * as children - *
        - *
      • - * Function input parameters: - *
          - *
        • {object} DataTables settings object: see {@link DataTable.models.oSettings}.
        • - *
        • {node} Container into which the pagination controls must be inserted
        • - *
        • {function} Draw callback function - whenever the controls cause a page - * change, this method must be called to redraw the table.
        • - *
        - *
      • - *
      • - * Function return: - *
          - *
        • No return required
        • - *
        - * - *
      - * - *
    • - * fnInit - This function is called whenever the paging status of the table changes and is - * typically used to update classes and/or text of the paging controls to reflex the new - * status. - *
        - *
      • - * Function input parameters: - *
          - *
        • {object} DataTables settings object: see {@link DataTable.models.oSettings}.
        • - *
        • {function} Draw callback function - in case you need to redraw the table again - * or attach new event listeners
        • - *
        - *
      • - *
      • - * Function return: - *
          - *
        • No return required
        • - *
        - * - *
      - * - *
    - * @type object - * @default {} - * - * @example - * $.fn.dataTableExt.oPagination.four_button = { - * "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) { - * nFirst = document.createElement( 'span' ); - * nPrevious = document.createElement( 'span' ); - * nNext = document.createElement( 'span' ); - * nLast = document.createElement( 'span' ); - * - * nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) ); - * nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) ); - * nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) ); - * nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) ); - * - * nFirst.className = "paginate_button first"; - * nPrevious.className = "paginate_button previous"; - * nNext.className="paginate_button next"; - * nLast.className = "paginate_button last"; - * - * nPaging.appendChild( nFirst ); - * nPaging.appendChild( nPrevious ); - * nPaging.appendChild( nNext ); - * nPaging.appendChild( nLast ); - * - * $(nFirst).click( function () { - * oSettings.oApi._fnPageChange( oSettings, "first" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nPrevious).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "previous" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nNext).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "next" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nLast).click( function() { - * oSettings.oApi._fnPageChange( oSettings, "last" ); - * fnCallbackDraw( oSettings ); - * } ); - * - * $(nFirst).bind( 'selectstart', function () { return false; } ); - * $(nPrevious).bind( 'selectstart', function () { return false; } ); - * $(nNext).bind( 'selectstart', function () { return false; } ); - * $(nLast).bind( 'selectstart', function () { return false; } ); - * }, - * - * "fnUpdate": function ( oSettings, fnCallbackDraw ) { - * if ( !oSettings.aanFeatures.p ) { - * return; - * } - * - * // Loop over each instance of the pager - * var an = oSettings.aanFeatures.p; - * for ( var i=0, iLen=an.length ; i - *
  • - * Function input parameters: - *
      - *
    • {*} Data to compare to the second parameter
    • - *
    • {*} Data to compare to the first parameter
    • - *
    - *
  • - *
  • - * Function return: - *
      - *
    • {int} Sorting match: <0 if first parameter should be sorted lower than - * the second parameter, ===0 if the two parameters are equal and >0 if - * the first parameter should be sorted height than the second parameter.
    • - *
    - * - * - * @type object - * @default {} - * - * @example - * // Case-sensitive string sorting, with no pre-formatting method - * $.extend( $.fn.dataTableExt.oSort, { - * "string-case-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-case-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - * - * @example - * // Case-insensitive string sorting, with pre-formatting - * $.extend( $.fn.dataTableExt.oSort, { - * "string-pre": function(x) { - * return x.toLowerCase(); - * }, - * "string-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - */ - "oSort": {}, - - - /** - * Version string for plug-ins to check compatibility. Allowed format is - * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and - * e are optional - * @type string - * @default Version number - */ - "sVersion": DataTable.version, - - - /** - * How should DataTables report an error. Can take the value 'alert' or 'throw' - * @type string - * @default alert - */ - "sErrMode": "alert", - - - /** - * Store information for DataTables to access globally about other instances - * @namespace - * @private - */ - "_oExternConfig": { - /* int:iNextUnique - next unique number for an instance */ - "iNextUnique": 0 - } - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * search information for the global filter and individual column filters. - * @namespace - */ - DataTable.models.oSearch = { - /** - * Flag to indicate if the filtering should be case insensitive or not - * @type boolean - * @default true - */ - "bCaseInsensitive": true, - - /** - * Applied search term - * @type string - * @default Empty string - */ - "sSearch": "", - - /** - * Flag to indicate if the search term should be interpreted as a - * regular expression (true) or not (false) and therefore and special - * regex characters escaped. - * @type boolean - * @default false - */ - "bRegex": false, - - /** - * Flag to indicate if DataTables is to use its smart filtering or not. - * @type boolean - * @default true - */ - "bSmart": true - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * each individual row. This is the object format used for the settings - * aoData array. - * @namespace - */ - DataTable.models.oRow = { - /** - * TR element for the row - * @type node - * @default null - */ - "nTr": null, - - /** - * Data object from the original data source for the row. This is either - * an array if using the traditional form of DataTables, or an object if - * using mData options. The exact type will depend on the passed in - * data from the data source, or will be an array if using DOM a data - * source. - * @type array|object - * @default [] - */ - "_aData": [], - - /** - * Sorting data cache - this array is ostensibly the same length as the - * number of columns (although each index is generated only as it is - * needed), and holds the data that is used for sorting each column in the - * row. We do this cache generation at the start of the sort in order that - * the formatting of the sort data need be done only once for each cell - * per sort. This array should not be read from or written to by anything - * other than the master sorting methods. - * @type array - * @default [] - * @private - */ - "_aSortData": [], - - /** - * Array of TD elements that are cached for hidden rows, so they can be - * reinserted into the table if a column is made visible again (or to act - * as a store if a column is made hidden). Only hidden columns have a - * reference in the array. For non-hidden columns the value is either - * undefined or null. - * @type array nodes - * @default [] - * @private - */ - "_anHidden": [], - - /** - * Cache of the class name that DataTables has applied to the row, so we - * can quickly look at this variable rather than needing to do a DOM check - * on className for the nTr property. - * @type string - * @default Empty string - * @private - */ - "_sRowStripe": "" - }; - - - - /** - * Template object for the column information object in DataTables. This object - * is held in the settings aoColumns array and contains all the information that - * DataTables needs about each individual column. - * - * Note that this object is related to {@link DataTable.defaults.columns} - * but this one is the internal data store for DataTables's cache of columns. - * It should NOT be manipulated outside of DataTables. Any configuration should - * be done through the initialisation options. - * @namespace - */ - DataTable.models.oColumn = { - /** - * A list of the columns that sorting should occur on when this column - * is sorted. That this property is an array allows multi-column sorting - * to be defined for a column (for example first name / last name columns - * would benefit from this). The values are integers pointing to the - * columns to be sorted on (typically it will be a single integer pointing - * at itself, but that doesn't need to be the case). - * @type array - */ - "aDataSort": null, - - /** - * Define the sorting directions that are applied to the column, in sequence - * as the column is repeatedly sorted upon - i.e. the first value is used - * as the sorting direction when the column if first sorted (clicked on). - * Sort it again (click again) and it will move on to the next index. - * Repeat until loop. - * @type array - */ - "asSorting": null, - - /** - * Flag to indicate if the column is searchable, and thus should be included - * in the filtering or not. - * @type boolean - */ - "bSearchable": null, - - /** - * Flag to indicate if the column is sortable or not. - * @type boolean - */ - "bSortable": null, - - /** - * Deprecated When using fnRender, you have two options for what - * to do with the data, and this property serves as the switch. Firstly, you - * can have the sorting and filtering use the rendered value (true - default), - * or you can have the sorting and filtering us the original value (false). - * - * Please note that this option has now been deprecated and will be removed - * in the next version of DataTables. Please use mRender / mData rather than - * fnRender. - * @type boolean - * @deprecated - */ - "bUseRendered": null, - - /** - * Flag to indicate if the column is currently visible in the table or not - * @type boolean - */ - "bVisible": null, - - /** - * Flag to indicate to the type detection method if the automatic type - * detection should be used, or if a column type (sType) has been specified - * @type boolean - * @default true - * @private - */ - "_bAutoType": true, - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @default null - */ - "fnCreatedCell": null, - - /** - * Function to get data from a cell in a column. You should never - * access data directly through _aData internally in DataTables - always use - * the method attached to this property. It allows mData to function as - * required. This function is automatically assigned by the column - * initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {string} sSpecific The specific data type you want to get - - * 'display', 'type' 'filter' 'sort' - * @returns {*} The data for the cell from the given row's data - * @default null - */ - "fnGetData": null, - - /** - * Deprecated Custom display function that will be called for the - * display of each cell in this column. - * - * Please note that this option has now been deprecated and will be removed - * in the next version of DataTables. Please use mRender / mData rather than - * fnRender. - * @type function - * @param {object} o Object with the following parameters: - * @param {int} o.iDataRow The row in aoData - * @param {int} o.iDataColumn The column in question - * @param {array} o.aData The data for the row in question - * @param {object} o.oSettings The settings object for this DataTables instance - * @returns {string} The string you which to use in the display - * @default null - * @deprecated - */ - "fnRender": null, - - /** - * Function to set data for a cell in the column. You should never - * set the data directly to _aData internally in DataTables - always use - * this method. It allows mData to function as required. This function - * is automatically assigned by the column initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {*} sValue Value to set - * @default null - */ - "fnSetData": null, - - /** - * Property to read the value for the cells in the column from the data - * source array / object. If null, then the default content is used, if a - * function is given then the return from the function is used. - * @type function|int|string|null - * @default null - */ - "mData": null, - - /** - * Partner property to mData which is used (only when defined) to get - * the data - i.e. it is basically the same as mData, but without the - * 'set' option, and also the data fed to it is the result from mData. - * This is the rendering method to match the data method of mData. - * @type function|int|string|null - * @default null - */ - "mRender": null, - - /** - * Unique header TH/TD element for this column - this is what the sorting - * listener is attached to (if sorting is enabled.) - * @type node - * @default null - */ - "nTh": null, - - /** - * Unique footer TH/TD element for this column (if there is one). Not used - * in DataTables as such, but can be used for plug-ins to reference the - * footer for each column. - * @type node - * @default null - */ - "nTf": null, - - /** - * The class to apply to all TD elements in the table's TBODY for the column - * @type string - * @default null - */ - "sClass": null, - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * @type string - */ - "sContentPadding": null, - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mData - * is set to null, or because the data source itself is null). - * @type string - * @default null - */ - "sDefaultContent": null, - - /** - * Name for the column, allowing reference to the column by name as well as - * by index (needs a lookup to work by name). - * @type string - */ - "sName": null, - - /** - * Custom sorting data type - defines which of the available plug-ins in - * afnSortData the custom sorting will use - if any is defined. - * @type string - * @default std - */ - "sSortDataType": 'std', - - /** - * Class to be applied to the header element when sorting on this column - * @type string - * @default null - */ - "sSortingClass": null, - - /** - * Class to be applied to the header element when sorting on this column - - * when jQuery UI theming is used. - * @type string - * @default null - */ - "sSortingClassJUI": null, - - /** - * Title of the column - what is seen in the TH element (nTh). - * @type string - */ - "sTitle": null, - - /** - * Column sorting and filtering type - * @type string - * @default null - */ - "sType": null, - - /** - * Width of the column - * @type string - * @default null - */ - "sWidth": null, - - /** - * Width of the column when it was first "encountered" - * @type string - * @default null - */ - "sWidthOrig": null - }; - - - - /** - * Initialisation options that can be given to DataTables at initialisation - * time. - * @namespace - */ - DataTable.defaults = { - /** - * An array of data to use for the table, passed in at initialisation which - * will be used in preference to any data which is already in the DOM. This is - * particularly useful for constructing tables purely in Javascript, for - * example with a custom Ajax call. - * @type array - * @default null - * @dtopt Option - * - * @example - * // Using a 2D array data source - * $(document).ready( function () { - * $('#example').dataTable( { - * "aaData": [ - * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], - * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], - * ], - * "aoColumns": [ - * { "sTitle": "Engine" }, - * { "sTitle": "Browser" }, - * { "sTitle": "Platform" }, - * { "sTitle": "Version" }, - * { "sTitle": "Grade" } - * ] - * } ); - * } ); - * - * @example - * // Using an array of objects as a data source (mData) - * $(document).ready( function () { - * $('#example').dataTable( { - * "aaData": [ - * { - * "engine": "Trident", - * "browser": "Internet Explorer 4.0", - * "platform": "Win 95+", - * "version": 4, - * "grade": "X" - * }, - * { - * "engine": "Trident", - * "browser": "Internet Explorer 5.0", - * "platform": "Win 95+", - * "version": 5, - * "grade": "C" - * } - * ], - * "aoColumns": [ - * { "sTitle": "Engine", "mData": "engine" }, - * { "sTitle": "Browser", "mData": "browser" }, - * { "sTitle": "Platform", "mData": "platform" }, - * { "sTitle": "Version", "mData": "version" }, - * { "sTitle": "Grade", "mData": "grade" } - * ] - * } ); - * } ); - */ - "aaData": null, - - - /** - * If sorting is enabled, then DataTables will perform a first pass sort on - * initialisation. You can define which column(s) the sort is performed upon, - * and the sorting direction, with this variable. The aaSorting array should - * contain an array for each column to be sorted initially containing the - * column's index and a direction string ('asc' or 'desc'). - * @type array - * @default [[0,'asc']] - * @dtopt Option - * - * @example - * // Sort by 3rd column first, and then 4th column - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSorting": [[2,'asc'], [3,'desc']] - * } ); - * } ); - * - * // No initial sorting - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSorting": [] - * } ); - * } ); - */ - "aaSorting": [[0,'asc']], - - - /** - * This parameter is basically identical to the aaSorting parameter, but - * cannot be overridden by user interaction with the table. What this means - * is that you could have a column (visible or hidden) which the sorting will - * always be forced on first - any sorting after that (from the user) will - * then be performed as required. This can be useful for grouping rows - * together. - * @type array - * @default null - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aaSortingFixed": [[0,'asc']] - * } ); - * } ) - */ - "aaSortingFixed": null, - - - /** - * This parameter allows you to readily specify the entries in the length drop - * down menu that DataTables shows when pagination is enabled. It can be - * either a 1D array of options which will be used for both the displayed - * option and the value, or a 2D array which will use the array in the first - * position as the value, and the array in the second position as the - * displayed options (useful for language strings such as 'All'). - * @type array - * @default [ 10, 25, 50, 100 ] - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] - * } ); - * } ); - * - * @example - * // Setting the default display length as well as length menu - * // This is likely to be wanted if you remove the '10' option which - * // is the iDisplayLength default. - * $(document).ready( function() { - * $('#example').dataTable( { - * "iDisplayLength": 25, - * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]] - * } ); - * } ); - */ - "aLengthMenu": [ 10, 25, 50, 100 ], - - - /** - * The aoColumns option in the initialisation parameter allows you to define - * details about the way individual columns behave. For a full list of - * column options that can be set, please see - * {@link DataTable.defaults.columns}. Note that if you use aoColumns to - * define your columns, you must have an entry in the array for every single - * column that you have in your table (these can be null if you don't which - * to specify any options). - * @member - */ - "aoColumns": null, - - /** - * Very similar to aoColumns, aoColumnDefs allows you to target a specific - * column, multiple columns, or all columns, using the aTargets property of - * each object in the array. This allows great flexibility when creating - * tables, as the aoColumnDefs arrays can be of any length, targeting the - * columns you specifically want. aoColumnDefs may use any of the column - * options available: {@link DataTable.defaults.columns}, but it _must_ - * have aTargets defined in each object in the array. Values in the aTargets - * array may be: - *
      - *
    • a string - class name will be matched on the TH for the column
    • - *
    • 0 or a positive integer - column index counting from the left
    • - *
    • a negative integer - column index counting from the right
    • - *
    • the string "_all" - all columns (i.e. assign a default)
    • - *
    - * @member - */ - "aoColumnDefs": null, - - - /** - * Basically the same as oSearch, this parameter defines the individual column - * filtering state at initialisation time. The array must be of the same size - * as the number of columns, and each element be an object with the parameters - * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also - * accepted and the default will be used. - * @type array - * @default [] - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoSearchCols": [ - * null, - * { "sSearch": "My filter" }, - * null, - * { "sSearch": "^[0-9]", "bEscapeRegex": false } - * ] - * } ); - * } ) - */ - "aoSearchCols": [], - - - /** - * An array of CSS classes that should be applied to displayed rows. This - * array may be of any length, and DataTables will apply each class - * sequentially, looping when required. - * @type array - * @default null Will take the values determined by the oClasses.sStripe* - * options - * @dtopt Option - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ] - * } ); - * } ) - */ - "asStripeClasses": null, - - - /** - * Enable or disable automatic column width calculation. This can be disabled - * as an optimisation (it takes some time to calculate the widths) if the - * tables widths are passed in using aoColumns. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bAutoWidth": false - * } ); - * } ); - */ - "bAutoWidth": true, - - - /** - * Deferred rendering can provide DataTables with a huge speed boost when you - * are using an Ajax or JS data source for the table. This option, when set to - * true, will cause DataTables to defer the creation of the table elements for - * each row until they are needed for a draw - saving a significant amount of - * time. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/arrays.txt", - * "bDeferRender": true - * } ); - * } ); - */ - "bDeferRender": false, - - - /** - * Replace a DataTable which matches the given selector and replace it with - * one which has the properties of the new initialisation object passed. If no - * table matches the selector, then the new DataTable will be constructed as - * per normal. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * - * // Some time later.... - * $('#example').dataTable( { - * "bFilter": false, - * "bDestroy": true - * } ); - * } ); - */ - "bDestroy": false, - - - /** - * Enable or disable filtering of data. Filtering in DataTables is "smart" in - * that it allows the end user to input multiple words (space separated) and - * will match a row containing those words, even if not in the order that was - * specified (this allow matching across multiple columns). Note that if you - * wish to use filtering in DataTables this must remain 'true' - to remove the - * default filtering input box and retain filtering abilities, please use - * {@link DataTable.defaults.sDom}. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bFilter": false - * } ); - * } ); - */ - "bFilter": true, - - - /** - * Enable or disable the table information display. This shows information - * about the data that is currently visible on the page, including information - * about filtered data if that action is being performed. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bInfo": false - * } ); - * } ); - */ - "bInfo": true, - - - /** - * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some - * slightly different and additional mark-up from what DataTables has - * traditionally used). - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bJQueryUI": true - * } ); - * } ); - */ - "bJQueryUI": false, - - - /** - * Allows the end user to select the size of a formatted page from a select - * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate). - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bLengthChange": false - * } ); - * } ); - */ - "bLengthChange": true, - - - /** - * Enable or disable pagination. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bPaginate": false - * } ); - * } ); - */ - "bPaginate": true, - - - /** - * Enable or disable the display of a 'processing' indicator when the table is - * being processed (e.g. a sort). This is particularly useful for tables with - * large amounts of data where it can take a noticeable amount of time to sort - * the entries. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bProcessing": true - * } ); - * } ); - */ - "bProcessing": false, - - - /** - * Retrieve the DataTables object for the given selector. Note that if the - * table has already been initialised, this parameter will cause DataTables - * to simply return the object that has already been set up - it will not take - * account of any changes you might have made to the initialisation object - * passed to DataTables (setting this parameter to true is an acknowledgement - * that you understand this). bDestroy can be used to reinitialise a table if - * you need. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready( function() { - * initTable(); - * tableActions(); - * } ); - * - * function initTable () - * { - * return $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false, - * "bRetrieve": true - * } ); - * } - * - * function tableActions () - * { - * var oTable = initTable(); - * // perform API operations with oTable - * } - */ - "bRetrieve": false, - - - /** - * Indicate if DataTables should be allowed to set the padding / margin - * etc for the scrolling header elements or not. Typically you will want - * this. - * @type boolean - * @default true - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bScrollAutoCss": false, - * "sScrollY": "200px" - * } ); - * } ); - */ - "bScrollAutoCss": true, - - - /** - * When vertical (y) scrolling is enabled, DataTables will force the height of - * the table's viewport to the given height at all times (useful for layout). - * However, this can look odd when filtering data down to a small data set, - * and the footer is left "floating" further down. This parameter (when - * enabled) will cause DataTables to collapse the table's viewport down when - * the result set will fit within the given Y height. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sScrollY": "200", - * "bScrollCollapse": true - * } ); - * } ); - */ - "bScrollCollapse": false, - - - /** - * Enable infinite scrolling for DataTables (to be used in combination with - * sScrollY). Infinite scrolling means that DataTables will continually load - * data as a user scrolls through a table, which is very useful for large - * dataset. This cannot be used with pagination, which is automatically - * disabled. Note - the Scroller extra for DataTables is recommended in - * in preference to this option. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bScrollInfinite": true, - * "bScrollCollapse": true, - * "sScrollY": "200px" - * } ); - * } ); - */ - "bScrollInfinite": false, - - - /** - * Configure DataTables to use server-side processing. Note that the - * sAjaxSource parameter must also be given in order to give DataTables a - * source to obtain the required data for each draw. - * @type boolean - * @default false - * @dtopt Features - * @dtopt Server-side - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "xhr.php" - * } ); - * } ); - */ - "bServerSide": false, - - - /** - * Enable or disable sorting of columns. Sorting of individual columns can be - * disabled by the "bSortable" option for each column. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bSort": false - * } ); - * } ); - */ - "bSort": true, - - - /** - * Allows control over whether DataTables should use the top (true) unique - * cell that is found for a single column, or the bottom (false - default). - * This is useful when using complex headers. - * @type boolean - * @default false - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bSortCellsTop": true - * } ); - * } ); - */ - "bSortCellsTop": false, - - - /** - * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and - * 'sorting_3' to the columns which are currently being sorted on. This is - * presented as a feature switch as it can increase processing time (while - * classes are removed and added) so for large data sets you might want to - * turn this off. - * @type boolean - * @default true - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bSortClasses": false - * } ); - * } ); - */ - "bSortClasses": true, - - - /** - * Enable or disable state saving. When enabled a cookie will be used to save - * table display information such as pagination information, display length, - * filtering and sorting. As such when the end user reloads the page the - * display display will match what thy had previously set up. - * @type boolean - * @default false - * @dtopt Features - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "bStateSave": true - * } ); - * } ); - */ - "bStateSave": false, - - - /** - * Customise the cookie and / or the parameters being stored when using - * DataTables with state saving enabled. This function is called whenever - * the cookie is modified, and it expects a fully formed cookie string to be - * returned. Note that the data object passed in is a Javascript object which - * must be converted to a string (JSON.stringify for example). - * @type function - * @param {string} sName Name of the cookie defined by DataTables - * @param {object} oData Data to be stored in the cookie - * @param {string} sExpires Cookie expires string - * @param {string} sPath Path of the cookie to set - * @returns {string} Cookie formatted string (which should be encoded by - * using encodeURIComponent()) - * @dtopt Callbacks - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "fnCookieCallback": function (sName, oData, sExpires, sPath) { - * // Customise oData or sName or whatever else here - * return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath; - * } - * } ); - * } ); - */ - "fnCookieCallback": null, - - - /** - * This function is called when a TR element is created (and all TD child - * elements have been inserted), or registered if using a DOM source, allowing - * manipulation of the TR element (adding classes etc). - * @type function - * @param {node} nRow "TR" element for the current row - * @param {array} aData Raw data array for this row - * @param {int} iDataIndex The index of this row in aoData - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnCreatedRow": function( nRow, aData, iDataIndex ) { - * // Bold the grade for all 'A' grade browsers - * if ( aData[4] == "A" ) - * { - * $('td:eq(4)', nRow).html( 'A' ); - * } - * } - * } ); - * } ); - */ - "fnCreatedRow": null, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify any aspect you want about the created DOM. - * @type function - * @param {object} oSettings DataTables settings object - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnDrawCallback": function( oSettings ) { - * alert( 'DataTables has redrawn the table' ); - * } - * } ); - * } ); - */ - "fnDrawCallback": null, - - - /** - * Identical to fnHeaderCallback() but for the table footer this function - * allows you to modify the table footer on every 'draw' even. - * @type function - * @param {node} nFoot "TR" element for the footer - * @param {array} aData Full table data (as derived from the original HTML) - * @param {int} iStart Index for the current display starting point in the - * display array - * @param {int} iEnd Index for the current display ending point in the - * display array - * @param {array int} aiDisplay Index array to translate the visual position - * to the full data array - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) { - * nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart; - * } - * } ); - * } ) - */ - "fnFooterCallback": null, - - - /** - * When rendering large numbers in the information element for the table - * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers - * to have a comma separator for the 'thousands' units (e.g. 1 million is - * rendered as "1,000,000") to help readability for the end user. This - * function will override the default method DataTables uses. - * @type function - * @member - * @param {int} iIn number to be formatted - * @returns {string} formatted string for DataTables to show the number - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fnFormatNumber": function ( iIn ) { - * if ( iIn < 1000 ) { - * return iIn; - * } else { - * var - * s=(iIn+""), - * a=s.split(""), out="", - * iLen=s.length; - * - * for ( var i=0 ; i<iLen ; i++ ) { - * if ( i%3 === 0 && i !== 0 ) { - * out = "'"+out; - * } - * out = a[iLen-i-1]+out; - * } - * } - * return out; - * }; - * } ); - * } ); - */ - "fnFormatNumber": function ( iIn ) { - if ( iIn < 1000 ) - { - // A small optimisation for what is likely to be the majority of use cases - return iIn; - } - - var s=(iIn+""), a=s.split(""), out="", iLen=s.length; - - for ( var i=0 ; iA
    ' ); - * } - * } - * } ); - * } ); - */ - "fnRowCallback": null, - - - /** - * This parameter allows you to override the default function which obtains - * the data from the server ($.getJSON) so something more suitable for your - * application. For example you could use POST data, or pull information from - * a Gears or AIR database. - * @type function - * @member - * @param {string} sSource HTTP source to obtain the data from (sAjaxSource) - * @param {array} aoData A key/value pair object containing the data to send - * to the server - * @param {function} fnCallback to be called on completion of the data get - * process that will draw the data on the page. - * @param {object} oSettings DataTables settings object - * @dtopt Callbacks - * @dtopt Server-side - * - * @example - * // POST data to server - * $(document).ready( function() { - * $('#example').dataTable( { - * "bProcessing": true, - * "bServerSide": true, - * "sAjaxSource": "xhr.php", - * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) { - * oSettings.jqXHR = $.ajax( { - * "dataType": 'json', - * "type": "POST", - * "url": sSource, - * "data": aoData, - * "success": fnCallback - * } ); - * } - * } ); - * } ); - */ - "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) { - oSettings.jqXHR = $.ajax( { - "url": sUrl, - "data": aoData, - "success": function (json) { - if ( json.sError ) { - oSettings.oApi._fnLog( oSettings, 0, json.sError ); - } - - $(oSettings.oInstance).trigger('xhr', [oSettings, json]); - fnCallback( json ); - }, - "dataType": "json", - "cache": false, - "type": oSettings.sServerMethod, - "error": function (xhr, error, thrown) { - if ( error == "parsererror" ) { - oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+ - "server could not be parsed. This is caused by a JSON formatting error." ); - } - } - } ); - }, - - - /** - * It is often useful to send extra data to the server when making an Ajax - * request - for example custom filtering information, and this callback - * function makes it trivial to send extra information to the server. The - * passed in parameter is the data set that has been constructed by - * DataTables, and you can add to this or modify it as you require. - * @type function - * @param {array} aoData Data array (array of objects which are name/value - * pairs) that has been constructed by DataTables and will be sent to the - * server. In the case of Ajax sourced data with server-side processing - * this will be an empty array, for server-side processing there will be a - * significant number of parameters! - * @returns {undefined} Ensure that you modify the aoData array passed in, - * as this is passed by reference. - * @dtopt Callbacks - * @dtopt Server-side - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bProcessing": true, - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "fnServerParams": function ( aoData ) { - * aoData.push( { "name": "more_data", "value": "my_value" } ); - * } - * } ); - * } ); - */ - "fnServerParams": null, - - - /** - * Load the table state. With this function you can define from where, and how, the - * state of a table is loaded. By default DataTables will load from its state saving - * cookie, but you might wish to use local storage (HTML5) or a server-side database. - * @type function - * @member - * @param {object} oSettings DataTables settings object - * @return {object} The DataTables state object to be loaded - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoad": function (oSettings) { - * var o; - * - * // Send an Ajax request to the server to get the data. Note that - * // this is a synchronous request. - * $.ajax( { - * "url": "/state_load", - * "async": false, - * "dataType": "json", - * "success": function (json) { - * o = json; - * } - * } ); - * - * return o; - * } - * } ); - * } ); - */ - "fnStateLoad": function ( oSettings ) { - var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance ); - var oData; - - try { - oData = (typeof $.parseJSON === 'function') ? - $.parseJSON(sData) : eval( '('+sData+')' ); - } catch (e) { - oData = null; - } - - return oData; - }, - - - /** - * Callback which allows modification of the saved state prior to loading that state. - * This callback is called when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state. Note that for - * plug-in authors, you should use the 'stateLoadParams' event to load parameters for - * a plug-in. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object that is to be loaded - * @dtopt Callbacks - * - * @example - * // Remove a saved filter, so filtering is never loaded - * $(document).ready( function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoadParams": function (oSettings, oData) { - * oData.oSearch.sSearch = ""; - * } - * } ); - * } ); - * - * @example - * // Disallow state loading by returning false - * $(document).ready( function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoadParams": function (oSettings, oData) { - * return false; - * } - * } ); - * } ); - */ - "fnStateLoadParams": null, - - - /** - * Callback that is called when the state has been loaded from the state saving method - * and the DataTables settings object has been modified as a result of the loaded state. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object that was loaded - * @dtopt Callbacks - * - * @example - * // Show an alert with the filtering value that was saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateLoaded": function (oSettings, oData) { - * alert( 'Saved filter was: '+oData.oSearch.sSearch ); - * } - * } ); - * } ); - */ - "fnStateLoaded": null, - - - /** - * Save the table state. This function allows you to define where and how the state - * information for the table is stored - by default it will use a cookie, but you - * might want to use local storage (HTML5) or a server-side database. - * @type function - * @member - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object to be saved - * @dtopt Callbacks - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateSave": function (oSettings, oData) { - * // Send an Ajax request to the server with the state object - * $.ajax( { - * "url": "/state_save", - * "data": oData, - * "dataType": "json", - * "method": "POST" - * "success": function () {} - * } ); - * } - * } ); - * } ); - */ - "fnStateSave": function ( oSettings, oData ) { - this.oApi._fnCreateCookie( - oSettings.sCookiePrefix+oSettings.sInstance, - this.oApi._fnJsonString(oData), - oSettings.iCookieDuration, - oSettings.sCookiePrefix, - oSettings.fnCookieCallback - ); - }, - - - /** - * Callback which allows modification of the state to be saved. Called when the table - * has changed state a new state save is required. This method allows modification of - * the state saving object prior to actually doing the save, including addition or - * other state properties or modification. Note that for plug-in authors, you should - * use the 'stateSaveParams' event to save parameters for a plug-in. - * @type function - * @param {object} oSettings DataTables settings object - * @param {object} oData The state object to be saved - * @dtopt Callbacks - * - * @example - * // Remove a saved filter, so filtering is never saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "bStateSave": true, - * "fnStateSaveParams": function (oSettings, oData) { - * oData.oSearch.sSearch = ""; - * } - * } ); - * } ); - */ - "fnStateSaveParams": null, - - - /** - * Duration of the cookie which is used for storing session information. This - * value is given in seconds. - * @type int - * @default 7200 (2 hours) - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iCookieDuration": 60*60*24; // 1 day - * } ); - * } ) - */ - "iCookieDuration": 7200, - - - /** - * When enabled DataTables will not make a request to the server for the first - * page draw - rather it will use the data already on the page (no sorting etc - * will be applied to it), thus saving on an XHR at load time. iDeferLoading - * is used to indicate that deferred loading is required, but it is also used - * to tell DataTables how many records there are in the full table (allowing - * the information element and pagination to be displayed correctly). In the case - * where a filtering is applied to the table on initial load, this can be - * indicated by giving the parameter as an array, where the first element is - * the number of records available after filtering and the second element is the - * number of records without filtering (allowing the table information element - * to be shown correctly). - * @type int | array - * @default null - * @dtopt Options - * - * @example - * // 57 records available in the table, no filtering applied - * $(document).ready( function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "iDeferLoading": 57 - * } ); - * } ); - * - * @example - * // 57 records after filtering, 100 without filtering (an initial filter applied) - * $(document).ready( function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/server_processing.php", - * "iDeferLoading": [ 57, 100 ], - * "oSearch": { - * "sSearch": "my_filter" - * } - * } ); - * } ); - */ - "iDeferLoading": null, - - - /** - * Number of rows to display on a single page when using pagination. If - * feature enabled (bLengthChange) then the end user will be able to override - * this to a custom setting using a pop-up menu. - * @type int - * @default 10 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iDisplayLength": 50 - * } ); - * } ) - */ - "iDisplayLength": 10, - - - /** - * Define the starting point for data display when using DataTables with - * pagination. Note that this parameter is the number of records, rather than - * the page number, so if you have 10 records per page and want to start on - * the third page, it should be "20". - * @type int - * @default 0 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iDisplayStart": 20 - * } ); - * } ) - */ - "iDisplayStart": 0, - - - /** - * The scroll gap is the amount of scrolling that is left to go before - * DataTables will load the next 'page' of data automatically. You typically - * want a gap which is big enough that the scrolling will be smooth for the - * user, while not so large that it will load more data than need. - * @type int - * @default 100 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bScrollInfinite": true, - * "bScrollCollapse": true, - * "sScrollY": "200px", - * "iScrollLoadGap": 50 - * } ); - * } ); - */ - "iScrollLoadGap": 100, - - - /** - * By default DataTables allows keyboard navigation of the table (sorting, paging, - * and filtering) by adding a tabindex attribute to the required elements. This - * allows you to tab through the controls and press the enter key to activate them. - * The tabindex is default 0, meaning that the tab follows the flow of the document. - * You can overrule this using this parameter if you wish. Use a value of -1 to - * disable built-in keyboard navigation. - * @type int - * @default 0 - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "iTabIndex": 1 - * } ); - * } ); - */ - "iTabIndex": 0, - - - /** - * All strings that DataTables uses in the user interface that it creates - * are defined in this object, allowing you to modified them individually or - * completely replace them all as required. - * @namespace - */ - "oLanguage": { - /** - * Strings that are used for WAI-ARIA labels and controls only (these are not - * actually visible on the page, but will be read by screenreaders, and thus - * must be internationalised as well). - * @namespace - */ - "oAria": { - /** - * ARIA label that is added to the table headers when the column may be - * sorted ascending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oAria": { - * "sSortAscending": " - click/return to sort ascending" - * } - * } - * } ); - * } ); - */ - "sSortAscending": ": activate to sort column ascending", - - /** - * ARIA label that is added to the table headers when the column may be - * sorted descending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oAria": { - * "sSortDescending": " - click/return to sort descending" - * } - * } - * } ); - * } ); - */ - "sSortDescending": ": activate to sort column descending" - }, - - /** - * Pagination string used by DataTables for the two built-in pagination - * control types ("two_button" and "full_numbers") - * @namespace - */ - "oPaginate": { - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the first page. - * @type string - * @default First - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sFirst": "First page" - * } - * } - * } ); - * } ); - */ - "sFirst": "First", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the last page. - * @type string - * @default Last - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sLast": "Last page" - * } - * } - * } ); - * } ); - */ - "sLast": "Last", - - - /** - * Text to use for the 'next' pagination button (to take the user to the - * next page). - * @type string - * @default Next - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sNext": "Next page" - * } - * } - * } ); - * } ); - */ - "sNext": "Next", - - - /** - * Text to use for the 'previous' pagination button (to take the user to - * the previous page). - * @type string - * @default Previous - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "oPaginate": { - * "sPrevious": "Previous page" - * } - * } - * } ); - * } ); - */ - "sPrevious": "Previous" - }, - - /** - * This string is shown in preference to sZeroRecords when the table is - * empty of data (regardless of filtering). Note that this is an optional - * parameter - if it is not given, the value of sZeroRecords will be used - * instead (either the default or given value). - * @type string - * @default No data available in table - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sEmptyTable": "No data available in table" - * } - * } ); - * } ); - */ - "sEmptyTable": "No data available in table", - - - /** - * This string gives information to the end user about the information that - * is current on display on the page. The _START_, _END_ and _TOTAL_ - * variables are all dynamically replaced as the table display updates, and - * can be freely moved or removed as the language requirements change. - * @type string - * @default Showing _START_ to _END_ of _TOTAL_ entries - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)" - * } - * } ); - * } ); - */ - "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", - - - /** - * Display information string for when the table is empty. Typically the - * format of this string should match sInfo. - * @type string - * @default Showing 0 to 0 of 0 entries - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoEmpty": "No entries to show" - * } - * } ); - * } ); - */ - "sInfoEmpty": "Showing 0 to 0 of 0 entries", - - - /** - * When a user filters the information in a table, this string is appended - * to the information (sInfo) to give an idea of how strong the filtering - * is. The variable _MAX_ is dynamically updated. - * @type string - * @default (filtered from _MAX_ total entries) - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoFiltered": " - filtering from _MAX_ records" - * } - * } ); - * } ); - */ - "sInfoFiltered": "(filtered from _MAX_ total entries)", - - - /** - * If can be useful to append extra information to the info string at times, - * and this variable does exactly that. This information will be appended to - * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are - * being used) at all times. - * @type string - * @default Empty string - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoPostFix": "All records shown are derived from real information." - * } - * } ); - * } ); - */ - "sInfoPostFix": "", - - - /** - * DataTables has a build in number formatter (fnFormatNumber) which is used - * to format large numbers that are used in the table information. By - * default a comma is used, but this can be trivially changed to any - * character you wish with this parameter. - * @type string - * @default , - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sInfoThousands": "'" - * } - * } ); - * } ); - */ - "sInfoThousands": ",", - - - /** - * Detail the action that will be taken when the drop down menu for the - * pagination length option is changed. The '_MENU_' variable is replaced - * with a default select list of 10, 25, 50 and 100, and can be replaced - * with a custom select box if required. - * @type string - * @default Show _MENU_ entries - * @dtopt Language - * - * @example - * // Language change only - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLengthMenu": "Display _MENU_ records" - * } - * } ); - * } ); - * - * @example - * // Language and options change - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLengthMenu": 'Display records' - * } - * } ); - * } ); - */ - "sLengthMenu": "Show _MENU_ entries", - - - /** - * When using Ajax sourced data and during the first draw when DataTables is - * gathering the data, this message is shown in an empty row in the table to - * indicate to the end user the the data is being loaded. Note that this - * parameter is not used when loading data by server-side processing, just - * Ajax sourced data with client-side processing. - * @type string - * @default Loading... - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sLoadingRecords": "Please wait - loading..." - * } - * } ); - * } ); - */ - "sLoadingRecords": "Loading...", - - - /** - * Text which is displayed when the table is processing a user action - * (usually a sort command or similar). - * @type string - * @default Processing... - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sProcessing": "DataTables is currently busy" - * } - * } ); - * } ); - */ - "sProcessing": "Processing...", - - - /** - * Details the actions that will be taken when the user types into the - * filtering input text box. The variable "_INPUT_", if used in the string, - * is replaced with the HTML text box for the filtering input allowing - * control over where it appears in the string. If "_INPUT_" is not given - * then the input box is appended to the string automatically. - * @type string - * @default Search: - * @dtopt Language - * - * @example - * // Input text box will be appended at the end automatically - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sSearch": "Filter records:" - * } - * } ); - * } ); - * - * @example - * // Specify where the filter should appear - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sSearch": "Apply filter _INPUT_ to table" - * } - * } ); - * } ); - */ - "sSearch": "Search:", - - - /** - * All of the language information can be stored in a file on the - * server-side, which DataTables will look up if this parameter is passed. - * It must store the URL of the language file, which is in a JSON format, - * and the object has the same properties as the oLanguage object in the - * initialiser object (i.e. the above parameters). Please refer to one of - * the example language files to see how this works in action. - * @type string - * @default Empty string - i.e. disabled - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt" - * } - * } ); - * } ); - */ - "sUrl": "", - - - /** - * Text shown inside the table records when the is no information to be - * displayed after filtering. sEmptyTable is shown when there is simply no - * information in the table at all (regardless of filtering). - * @type string - * @default No matching records found - * @dtopt Language - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oLanguage": { - * "sZeroRecords": "No records to display" - * } - * } ); - * } ); - */ - "sZeroRecords": "No matching records found" - }, - - - /** - * This parameter allows you to have define the global filtering state at - * initialisation time. As an object the "sSearch" parameter must be - * defined, but all other parameters are optional. When "bRegex" is true, - * the search string will be treated as a regular expression, when false - * (default) it will be treated as a straight string. When "bSmart" - * DataTables will use it's smart filtering methods (to word match at - * any point in the data), when false this will not be done. - * @namespace - * @extends DataTable.models.oSearch - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "oSearch": {"sSearch": "Initial search"} - * } ); - * } ) - */ - "oSearch": $.extend( {}, DataTable.models.oSearch ), - - - /** - * By default DataTables will look for the property 'aaData' when obtaining - * data from an Ajax source or for server-side processing - this parameter - * allows that property to be changed. You can use Javascript dotted object - * notation to get a data source for multiple levels of nesting. - * @type string - * @default aaData - * @dtopt Options - * @dtopt Server-side - * - * @example - * // Get data from { "data": [...] } - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/data.txt", - * "sAjaxDataProp": "data" - * } ); - * } ); - * - * @example - * // Get data from { "data": { "inner": [...] } } - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/data.txt", - * "sAjaxDataProp": "data.inner" - * } ); - * } ); - */ - "sAjaxDataProp": "aaData", - - - /** - * You can instruct DataTables to load data from an external source using this - * parameter (use aData if you want to pass data in you already have). Simply - * provide a url a JSON object can be obtained from. This object must include - * the parameter 'aaData' which is the data source for the table. - * @type string - * @default null - * @dtopt Options - * @dtopt Server-side - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php" - * } ); - * } ) - */ - "sAjaxSource": null, - - - /** - * This parameter can be used to override the default prefix that DataTables - * assigns to a cookie when state saving is enabled. - * @type string - * @default SpryMedia_DataTables_ - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sCookiePrefix": "my_datatable_", - * } ); - * } ); - */ - "sCookiePrefix": "SpryMedia_DataTables_", - - - /** - * This initialisation variable allows you to specify exactly where in the - * DOM you want DataTables to inject the various controls it adds to the page - * (for example you might want the pagination controls at the top of the - * table). DIV elements (with or without a custom class) can also be added to - * aid styling. The follow syntax is used: - *
      - *
    • The following options are allowed: - *
        - *
      • 'l' - Length changing
      • 'f' - Filtering input - *
      • 't' - The table!
      • - *
      • 'i' - Information
      • - *
      • 'p' - Pagination
      • - *
      • 'r' - pRocessing
      • - *
      - *
    • - *
    • The following constants are allowed: - *
        - *
      • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
      • - *
      • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
      • - *
      - *
    • - *
    • The following syntax is expected: - *
        - *
      • '<' and '>' - div elements
      • - *
      • '<"class" and '>' - div with a class
      • - *
      • '<"#id" and '>' - div with an ID
      • - *
      - *
    • - *
    • Examples: - *
        - *
      • '<"wrapper"flipt>'
      • - *
      • '<lf<t>ip>'
      • - *
      - *
    • - *
    - * @type string - * @default lfrtip (when bJQueryUI is false) or - * <"H"lfr>t<"F"ip> (when bJQueryUI is true) - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sDom": '<"top"i>rt<"bottom"flp><"clear">' - * } ); - * } ); - */ - "sDom": "lfrtip", - - - /** - * DataTables features two different built-in pagination interaction methods - * ('two_button' or 'full_numbers') which present different page controls to - * the end user. Further methods can be added using the API (see below). - * @type string - * @default two_button - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sPaginationType": "full_numbers" - * } ); - * } ) - */ - "sPaginationType": "two_button", - - - /** - * Enable horizontal scrolling. When a table is too wide to fit into a certain - * layout, or you have a large number of columns in the table, you can enable - * x-scrolling to show the table in a viewport, which can be scrolled. This - * property can be any CSS unit, or a number (in which case it will be treated - * as a pixel measurement). - * @type string - * @default blank string - i.e. disabled - * @dtopt Features - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sScrollX": "100%", - * "bScrollCollapse": true - * } ); - * } ); - */ - "sScrollX": "", - - - /** - * This property can be used to force a DataTable to use more width than it - * might otherwise do when x-scrolling is enabled. For example if you have a - * table which requires to be well spaced, this parameter is useful for - * "over-sizing" the table, and thus forcing scrolling. This property can by - * any CSS unit, or a number (in which case it will be treated as a pixel - * measurement). - * @type string - * @default blank string - i.e. disabled - * @dtopt Options - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sScrollX": "100%", - * "sScrollXInner": "110%" - * } ); - * } ); - */ - "sScrollXInner": "", - - - /** - * Enable vertical scrolling. Vertical scrolling will constrain the DataTable - * to the given height, and enable scrolling for any data which overflows the - * current viewport. This can be used as an alternative to paging to display - * a lot of data in a small area (although paging and scrolling can both be - * enabled at the same time). This property can be any CSS unit, or a number - * (in which case it will be treated as a pixel measurement). - * @type string - * @default blank string - i.e. disabled - * @dtopt Features - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "sScrollY": "200px", - * "bPaginate": false - * } ); - * } ); - */ - "sScrollY": "", - - - /** - * Set the HTTP method that is used to make the Ajax call for server-side - * processing or Ajax sourced data. - * @type string - * @default GET - * @dtopt Options - * @dtopt Server-side - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "bServerSide": true, - * "sAjaxSource": "scripts/post.php", - * "sServerMethod": "POST" - * } ); - * } ); - */ - "sServerMethod": "GET" - }; - - - - /** - * Column options that can be given to DataTables at initialisation time. - * @namespace - */ - DataTable.defaults.columns = { - /** - * Allows a column's sorting to take multiple columns into account when - * doing a sort. For example first name / last name columns make sense to - * do a multi-column sort over the two columns. - * @type array - * @default null Takes the value of the column index automatically - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] }, - * { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] }, - * { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "aDataSort": [ 0, 1 ] }, - * { "aDataSort": [ 1, 0 ] }, - * { "aDataSort": [ 2, 3, 4 ] }, - * null, - * null - * ] - * } ); - * } ); - */ - "aDataSort": null, - - - /** - * You can control the default sorting direction, and even alter the behaviour - * of the sort handler (i.e. only allow ascending sorting etc) using this - * parameter. - * @type array - * @default [ 'asc', 'desc' ] - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "asSorting": [ "asc" ], "aTargets": [ 1 ] }, - * { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] }, - * { "asSorting": [ "desc" ], "aTargets": [ 3 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * { "asSorting": [ "asc" ] }, - * { "asSorting": [ "desc", "asc", "asc" ] }, - * { "asSorting": [ "desc" ] }, - * null - * ] - * } ); - * } ); - */ - "asSorting": [ 'asc', 'desc' ], - - - /** - * Enable or disable filtering on the data in this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bSearchable": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bSearchable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSearchable": true, - - - /** - * Enable or disable sorting on this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bSortable": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bSortable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSortable": true, - - - /** - * Deprecated When using fnRender() for a column, you may wish - * to use the original data (before rendering) for sorting and filtering - * (the default is to used the rendered data that the user can see). This - * may be useful for dates etc. - * - * Please note that this option has now been deprecated and will be removed - * in the next version of DataTables. Please use mRender / mData rather than - * fnRender. - * @type boolean - * @default true - * @dtopt Columns - * @deprecated - */ - "bUseRendered": true, - - - /** - * Enable or disable the display of this column. - * @type boolean - * @default true - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "bVisible": false, "aTargets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "bVisible": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bVisible": true, - - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @param {int} iCol The column index for aoColumns - * @dtopt Columns - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ { - * "aTargets": [3], - * "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) { - * if ( sData == "1.7" ) { - * $(nTd).css('color', 'blue') - * } - * } - * } ] - * }); - * } ); - */ - "fnCreatedCell": null, - - - /** - * Deprecated Custom display function that will be called for the - * display of each cell in this column. - * - * Please note that this option has now been deprecated and will be removed - * in the next version of DataTables. Please use mRender / mData rather than - * fnRender. - * @type function - * @param {object} o Object with the following parameters: - * @param {int} o.iDataRow The row in aoData - * @param {int} o.iDataColumn The column in question - * @param {array} o.aData The data for the row in question - * @param {object} o.oSettings The settings object for this DataTables instance - * @param {object} o.mDataProp The data property used for this column - * @param {*} val The current cell value - * @returns {string} The string you which to use in the display - * @dtopt Columns - * @deprecated - */ - "fnRender": null, - - - /** - * The column index (starting from 0!) that you wish a sort to be performed - * upon when this column is selected for sorting. This can be used for sorting - * on hidden columns for example. - * @type int - * @default -1 Use automatically calculated column index - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "iDataSort": 1, "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "iDataSort": 1 }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "iDataSort": -1, - - - /** - * This parameter has been replaced by mData in DataTables to ensure naming - * consistency. mDataProp can still be used, as there is backwards compatibility - * in DataTables for this option, but it is strongly recommended that you use - * mData in preference to mDataProp. - * @name DataTable.defaults.columns.mDataProp - */ - - - /** - * This property can be used to read data from any JSON data source property, - * including deeply nested objects / properties. mData can be given in a - * number of different ways which effect its behaviour: - *
      - *
    • integer - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column).
    • - *
    • string - read an object property from the data source. Note that you can - * use Javascript dotted notation to read deep properties / arrays from the - * data source.
    • - *
    • null - the sDefaultContent option will be used for the cell (null - * by default, so you will need to specify the default content you want - - * typically an empty string). This can be useful on generated columns such - * as edit / delete action columns.
    • - *
    • function - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - *
        - *
      • {array|object} The data source for the row
      • - *
      • {string} The type call data requested - this will be 'set' when - * setting data or 'filter', 'display', 'type', 'sort' or undefined when - * gathering data. Note that when undefined is given for the type - * DataTables expects to get the raw data for the object back
      • - *
      • {*} Data to set when the second parameter is 'set'.
      • - *
      - * The return value from the function is not required when 'set' is the type - * of call, but otherwise the return is what will be used for the data - * requested.
    • - *
    - * - * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change - * reflects the flexibility of this property and is consistent with the naming of - * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as - * it automatically maps the old name to the new if required. - * @type string|int|function|null - * @default null Use automatically calculated column index - * @dtopt Columns - * - * @example - * // Read table data from objects - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/deep.txt", - * "aoColumns": [ - * { "mData": "engine" }, - * { "mData": "browser" }, - * { "mData": "platform.inner" }, - * { "mData": "platform.details.0" }, - * { "mData": "platform.details.1" } - * ] - * } ); - * } ); - * - * @example - * // Using mData as a function to provide different information for - * // sorting, filtering and display. In this case, currency (price) - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "aoColumnDefs": [ { - * "aTargets": [ 0 ], - * "mData": function ( source, type, val ) { - * if (type === 'set') { - * source.price = val; - * // Store the computed dislay and filter values for efficiency - * source.price_display = val=="" ? "" : "$"+numberFormat(val); - * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; - * return; - * } - * else if (type === 'display') { - * return source.price_display; - * } - * else if (type === 'filter') { - * return source.price_filter; - * } - * // 'sort', 'type' and undefined all just use the integer - * return source.price; - * } - * } ] - * } ); - * } ); - */ - "mData": null, - - - /** - * This property is the rendering partner to mData and it is suggested that - * when you want to manipulate data for display (including filtering, sorting etc) - * but not altering the underlying data for the table, use this property. mData - * can actually do everything this property can and more, but this parameter is - * easier to use since there is no 'set' option. Like mData is can be given - * in a number of different ways to effect its behaviour, with the addition of - * supporting array syntax for easy outputting of arrays (including arrays of - * objects): - *
      - *
    • integer - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column).
    • - *
    • string - read an object property from the data source. Note that you can - * use Javascript dotted notation to read deep properties / arrays from the - * data source and also array brackets to indicate that the data reader should - * loop over the data source array. When characters are given between the array - * brackets, these characters are used to join the data source array together. - * For example: "accounts[, ].name" would result in a comma separated list with - * the 'name' value from the 'accounts' array of objects.
    • - *
    • function - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - *
        - *
      • {array|object} The data source for the row (based on mData)
      • - *
      • {string} The type call data requested - this will be 'filter', 'display', - * 'type' or 'sort'.
      • - *
      • {array|object} The full data source for the row (not based on mData)
      • - *
      - * The return value from the function is what will be used for the data - * requested.
    • - *
    - * @type string|int|function|null - * @default null Use mData - * @dtopt Columns - * - * @example - * // Create a comma separated list from an array of objects - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "sAjaxSource": "sources/deep.txt", - * "aoColumns": [ - * { "mData": "engine" }, - * { "mData": "browser" }, - * { - * "mData": "platform", - * "mRender": "[, ].name" - * } - * ] - * } ); - * } ); - * - * @example - * // Use as a function to create a link from the data source - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "aTargets": [ 0 ], - * "mData": "download_link", - * "mRender": function ( data, type, full ) { - * return 'Download'; - * } - * ] - * } ); - * } ); - */ - "mRender": null, - - - /** - * Change the cell type created for the column - either TD cells or TH cells. This - * can be useful as TH cells have semantic meaning in the table body, allowing them - * to act as a header for a row (you may wish to add scope='row' to the TH elements). - * @type string - * @default td - * @dtopt Columns - * - * @example - * // Make the first column use TH cells - * $(document).ready( function() { - * var oTable = $('#example').dataTable( { - * "aoColumnDefs": [ { - * "aTargets": [ 0 ], - * "sCellType": "th" - * } ] - * } ); - * } ); - */ - "sCellType": "td", - - - /** - * Class to give to each cell in this column. - * @type string - * @default Empty string - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sClass": "my_class", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sClass": "my_class" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sClass": "", - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * Generally you shouldn't need this, and it is not documented on the - * general DataTables.net documentation - * @type string - * @default Empty string - * @dtopt Columns - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * null, - * { - * "sContentPadding": "mmm" - * } - * ] - * } ); - * } ); - */ - "sContentPadding": "", - - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mData - * is set to null, or because the data source itself is null). - * @type string - * @default null - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { - * "mData": null, - * "sDefaultContent": "Edit", - * "aTargets": [ -1 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * null, - * { - * "mData": null, - * "sDefaultContent": "Edit" - * } - * ] - * } ); - * } ); - */ - "sDefaultContent": null, - - - /** - * This parameter is only used in DataTables' server-side processing. It can - * be exceptionally useful to know what columns are being displayed on the - * client side, and to map these to database fields. When defined, the names - * also allow DataTables to reorder information from the server if it comes - * back in an unexpected order (i.e. if you switch your columns around on the - * client-side, your server-side code does not also need updating). - * @type string - * @default Empty string - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sName": "engine", "aTargets": [ 0 ] }, - * { "sName": "browser", "aTargets": [ 1 ] }, - * { "sName": "platform", "aTargets": [ 2 ] }, - * { "sName": "version", "aTargets": [ 3 ] }, - * { "sName": "grade", "aTargets": [ 4 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sName": "engine" }, - * { "sName": "browser" }, - * { "sName": "platform" }, - * { "sName": "version" }, - * { "sName": "grade" } - * ] - * } ); - * } ); - */ - "sName": "", - - - /** - * Defines a data source type for the sorting which can be used to read - * real-time information from the table (updating the internally cached - * version) prior to sorting. This allows sorting to occur on user editable - * elements such as form inputs. - * @type string - * @default std - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] }, - * { "sType": "numeric", "aTargets": [ 3 ] }, - * { "sSortDataType": "dom-select", "aTargets": [ 4 ] }, - * { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * null, - * null, - * { "sSortDataType": "dom-text" }, - * { "sSortDataType": "dom-text", "sType": "numeric" }, - * { "sSortDataType": "dom-select" }, - * { "sSortDataType": "dom-checkbox" } - * ] - * } ); - * } ); - */ - "sSortDataType": "std", - - - /** - * The title of this column. - * @type string - * @default null Derived from the 'TH' value for this column in the - * original HTML table. - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sTitle": "My column title", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sTitle": "My column title" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sTitle": null, - - - /** - * The type allows you to specify how the data for this column will be sorted. - * Four types (string, numeric, date and html (which will strip HTML tags - * before sorting)) are currently available. Note that only date formats - * understood by Javascript's Date() object will be accepted as type date. For - * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric', - * 'date' or 'html' (by default). Further types can be adding through - * plug-ins. - * @type string - * @default null Auto-detected from raw data - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sType": "html", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sType": "html" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sType": null, - - - /** - * Defining the width of the column, this parameter may take any CSS value - * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not - * been given a specific width through this interface ensuring that the table - * remains readable. - * @type string - * @default null Automatic - * @dtopt Columns - * - * @example - * // Using aoColumnDefs - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumnDefs": [ - * { "sWidth": "20%", "aTargets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using aoColumns - * $(document).ready( function() { - * $('#example').dataTable( { - * "aoColumns": [ - * { "sWidth": "20%" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sWidth": null - }; - - - - /** - * DataTables settings object - this holds all the information needed for a - * given table, including configuration, data and current application of the - * table options. DataTables does not have a single instance for each DataTable - * with the settings attached to that instance, but rather instances of the - * DataTable "class" are created on-the-fly as needed (typically by a - * $().dataTable() call) and the settings object is then applied to that - * instance. - * - * Note that this object is related to {@link DataTable.defaults} but this - * one is the internal data store for DataTables's cache of columns. It should - * NOT be manipulated outside of DataTables. Any configuration should be done - * through the initialisation options. - * @namespace - * @todo Really should attach the settings object to individual instances so we - * don't need to create new instances on each $().dataTable() call (if the - * table already exists). It would also save passing oSettings around and - * into every single function. However, this is a very significant - * architecture change for DataTables and will almost certainly break - * backwards compatibility with older installations. This is something that - * will be done in 2.0. - */ - DataTable.models.oSettings = { - /** - * Primary features of DataTables and their enablement state. - * @namespace - */ - "oFeatures": { - - /** - * Flag to say if DataTables should automatically try to calculate the - * optimum table and columns widths (true) or not (false). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoWidth": null, - - /** - * Delay the creation of TR and TD elements until they are actually - * needed by a driven page draw. This can give a significant speed - * increase for Ajax source and Javascript source data, but makes no - * difference at all fro DOM and server-side processing tables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bDeferRender": null, - - /** - * Enable filtering on the table or not. Note that if this is disabled - * then there is no filtering at all on the table, including fnFilter. - * To just remove the filtering input use sDom and remove the 'f' option. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bFilter": null, - - /** - * Table information element (the 'Showing x of y records' div) enable - * flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfo": null, - - /** - * Present a user control allowing the end user to change the page size - * when pagination is enabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bLengthChange": null, - - /** - * Pagination enabled or not. Note that if this is disabled then length - * changing must also be disabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bPaginate": null, - - /** - * Processing indicator enable flag whenever DataTables is enacting a - * user request - typically an Ajax request for server-side processing. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bProcessing": null, - - /** - * Server-side processing enabled flag - when enabled DataTables will - * get all data from the server for every draw - there is no filtering, - * sorting or paging done on the client-side. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bServerSide": null, - - /** - * Sorting enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSort": null, - - /** - * Apply a class to the columns which are being sorted to provide a - * visual highlight or not. This can slow things down when enabled since - * there is a lot of DOM interaction. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortClasses": null, - - /** - * State saving enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bStateSave": null - }, - - - /** - * Scrolling settings for a table. - * @namespace - */ - "oScroll": { - /** - * Indicate if DataTables should be allowed to set the padding / margin - * etc for the scrolling header elements or not. Typically you will want - * this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoCss": null, - - /** - * When the table is shorter in height than sScrollY, collapse the - * table container down to the height of the table (when true). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bCollapse": null, - - /** - * Infinite scrolling enablement flag. Now deprecated in favour of - * using the Scroller plug-in. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfinite": null, - - /** - * Width of the scrollbar for the web-browser's platform. Calculated - * during table initialisation. - * @type int - * @default 0 - */ - "iBarWidth": 0, - - /** - * Space (in pixels) between the bottom of the scrolling container and - * the bottom of the scrolling viewport before the next page is loaded - * when using infinite scrolling. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - */ - "iLoadGap": null, - - /** - * Viewport width for horizontal scrolling. Horizontal scrolling is - * disabled if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sX": null, - - /** - * Width to expand the table to when using x-scrolling. Typically you - * should not need to use this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @deprecated - */ - "sXInner": null, - - /** - * Viewport height for vertical scrolling. Vertical scrolling is disabled - * if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sY": null - }, - - /** - * Language information for the table. - * @namespace - * @extends DataTable.defaults.oLanguage - */ - "oLanguage": { - /** - * Information callback function. See - * {@link DataTable.defaults.fnInfoCallback} - * @type function - * @default null - */ - "fnInfoCallback": null - }, - - /** - * Browser support parameters - * @namespace - */ - "oBrowser": { - /** - * Indicate if the browser incorrectly calculates width:100% inside a - * scrolling element (IE6/7) - * @type boolean - * @default false - */ - "bScrollOversize": false - }, - - /** - * Array referencing the nodes which are used for the features. The - * parameters of this object match what is allowed by sDom - i.e. - *
      - *
    • 'l' - Length changing
    • - *
    • 'f' - Filtering input
    • - *
    • 't' - The table!
    • - *
    • 'i' - Information
    • - *
    • 'p' - Pagination
    • - *
    • 'r' - pRocessing
    • - *
    - * @type array - * @default [] - */ - "aanFeatures": [], - - /** - * Store data information - see {@link DataTable.models.oRow} for detailed - * information. - * @type array - * @default [] - */ - "aoData": [], - - /** - * Array of indexes which are in the current display (after filtering etc) - * @type array - * @default [] - */ - "aiDisplay": [], - - /** - * Array of indexes for display - no filtering - * @type array - * @default [] - */ - "aiDisplayMaster": [], - - /** - * Store information about each column that is in use - * @type array - * @default [] - */ - "aoColumns": [], - - /** - * Store information about the table's header - * @type array - * @default [] - */ - "aoHeader": [], - - /** - * Store information about the table's footer - * @type array - * @default [] - */ - "aoFooter": [], - - /** - * Search data array for regular expression searching - * @type array - * @default [] - */ - "asDataSearch": [], - - /** - * Store the applied global search information in case we want to force a - * research or compare the old search to a new one. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @namespace - * @extends DataTable.models.oSearch - */ - "oPreviousSearch": {}, - - /** - * Store the applied search for each column - see - * {@link DataTable.models.oSearch} for the format that is used for the - * filtering information for each column. - * @type array - * @default [] - */ - "aoPreSearchCols": [], - - /** - * Sorting that is applied to the table. Note that the inner arrays are - * used in the following manner: - *
      - *
    • Index 0 - column number
    • - *
    • Index 1 - current sorting direction
    • - *
    • Index 2 - index of asSorting for this column
    • - *
    - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @todo These inner arrays should really be objects - */ - "aaSorting": null, - - /** - * Sorting that is always applied to the table (i.e. prefixed in front of - * aaSorting). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array|null - * @default null - */ - "aaSortingFixed": null, - - /** - * Classes to use for the striping of a table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "asStripeClasses": null, - - /** - * If restoring a table - we should restore its striping classes as well - * @type array - * @default [] - */ - "asDestroyStripes": [], - - /** - * If restoring a table - we should restore its width - * @type int - * @default 0 - */ - "sDestroyWidth": 0, - - /** - * Callback functions array for every time a row is inserted (i.e. on a draw). - * @type array - * @default [] - */ - "aoRowCallback": [], - - /** - * Callback functions for the header on each draw. - * @type array - * @default [] - */ - "aoHeaderCallback": [], - - /** - * Callback function for the footer on each draw. - * @type array - * @default [] - */ - "aoFooterCallback": [], - - /** - * Array of callback functions for draw callback functions - * @type array - * @default [] - */ - "aoDrawCallback": [], - - /** - * Array of callback functions for row created function - * @type array - * @default [] - */ - "aoRowCreatedCallback": [], - - /** - * Callback functions for just before the table is redrawn. A return of - * false will be used to cancel the draw. - * @type array - * @default [] - */ - "aoPreDrawCallback": [], - - /** - * Callback functions for when the table has been initialised. - * @type array - * @default [] - */ - "aoInitComplete": [], - - - /** - * Callbacks for modifying the settings to be stored for state saving, prior to - * saving state. - * @type array - * @default [] - */ - "aoStateSaveParams": [], - - /** - * Callbacks for modifying the settings that have been stored for state saving - * prior to using the stored values to restore the state. - * @type array - * @default [] - */ - "aoStateLoadParams": [], - - /** - * Callbacks for operating on the settings object once the saved state has been - * loaded - * @type array - * @default [] - */ - "aoStateLoaded": [], - - /** - * Cache the table ID for quick access - * @type string - * @default Empty string - */ - "sTableId": "", - - /** - * The TABLE node for the main table - * @type node - * @default null - */ - "nTable": null, - - /** - * Permanent ref to the thead element - * @type node - * @default null - */ - "nTHead": null, - - /** - * Permanent ref to the tfoot element - if it exists - * @type node - * @default null - */ - "nTFoot": null, - - /** - * Permanent ref to the tbody element - * @type node - * @default null - */ - "nTBody": null, - - /** - * Cache the wrapper node (contains all DataTables controlled elements) - * @type node - * @default null - */ - "nTableWrapper": null, - - /** - * Indicate if when using server-side processing the loading of data - * should be deferred until the second draw. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - * @default false - */ - "bDeferLoading": false, - - /** - * Indicate if all required information has been read in - * @type boolean - * @default false - */ - "bInitialised": false, - - /** - * Information about open rows. Each object in the array has the parameters - * 'nTr' and 'nParent' - * @type array - * @default [] - */ - "aoOpenRows": [], - - /** - * Dictate the positioning of DataTables' control elements - see - * {@link DataTable.model.oInit.sDom}. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sDom": null, - - /** - * Which type of pagination should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default two_button - */ - "sPaginationType": "two_button", - - /** - * The cookie duration (for bStateSave) in seconds. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - * @default 0 - */ - "iCookieDuration": 0, - - /** - * The cookie name prefix. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default Empty string - */ - "sCookiePrefix": "", - - /** - * Callback function for cookie creation. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - * @default null - */ - "fnCookieCallback": null, - - /** - * Array of callback functions for state saving. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the JSON string to save that has been thus far created. Returns - * a JSON string to be inserted into a json object - * (i.e. '"param": [ 0, 1, 2]')
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateSave": [], - - /** - * Array of callback functions for state loading. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the object stored. May return false to cancel state loading
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateLoad": [], - - /** - * State that was loaded from the cookie. Useful for back reference - * @type object - * @default null - */ - "oLoadedState": null, - - /** - * Source url for AJAX data for the table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sAjaxSource": null, - - /** - * Property from a given object from which to read the table data from. This - * can be an empty string (when not server-side processing), in which case - * it is assumed an an array is given directly. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sAjaxDataProp": null, - - /** - * Note if draw should be blocked while getting data - * @type boolean - * @default true - */ - "bAjaxDataGet": true, - - /** - * The last jQuery XHR object that was used for server-side data gathering. - * This can be used for working with the XHR information in one of the - * callbacks - * @type object - * @default null - */ - "jqXHR": null, - - /** - * Function to get the server-side data. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnServerData": null, - - /** - * Functions which are called prior to sending an Ajax request so extra - * parameters can easily be sent to the server - * @type array - * @default [] - */ - "aoServerParams": [], - - /** - * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if - * required). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sServerMethod": null, - - /** - * Format numbers for display. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnFormatNumber": null, - - /** - * List of options that can be used for the user selectable length menu. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aLengthMenu": null, - - /** - * Counter for the draws that the table does. Also used as a tracker for - * server-side processing - * @type int - * @default 0 - */ - "iDraw": 0, - - /** - * Indicate if a redraw is being done - useful for Ajax - * @type boolean - * @default false - */ - "bDrawing": false, - - /** - * Draw index (iDraw) of the last error when parsing the returned data - * @type int - * @default -1 - */ - "iDrawError": -1, - - /** - * Paging display length - * @type int - * @default 10 - */ - "_iDisplayLength": 10, - - /** - * Paging start point - aiDisplay index - * @type int - * @default 0 - */ - "_iDisplayStart": 0, - - /** - * Paging end point - aiDisplay index. Use fnDisplayEnd rather than - * this property to get the end point - * @type int - * @default 10 - * @private - */ - "_iDisplayEnd": 10, - - /** - * Server-side processing - number of records in the result set - * (i.e. before filtering), Use fnRecordsTotal rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type int - * @default 0 - * @private - */ - "_iRecordsTotal": 0, - - /** - * Server-side processing - number of records in the current display set - * (i.e. after filtering). Use fnRecordsDisplay rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type boolean - * @default 0 - * @private - */ - "_iRecordsDisplay": 0, - - /** - * Flag to indicate if jQuery UI marking and classes should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bJUI": null, - - /** - * The classes to use for the table - * @type object - * @default {} - */ - "oClasses": {}, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if filtering has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bFiltered": false, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if sorting has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bSorted": false, - - /** - * Indicate that if multiple rows are in the header and there is more than - * one unique cell per column, if the top one (true) or bottom one (false) - * should be used for sorting / title by DataTables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortCellsTop": null, - - /** - * Initialisation object that is used for the table - * @type object - * @default null - */ - "oInit": null, - - /** - * Destroy callback functions - for plug-ins to attach themselves to the - * destroy so they can clean up markup and events. - * @type array - * @default [] - */ - "aoDestroyCallback": [], - - - /** - * Get the number of records in the current record set, before filtering - * @type function - */ - "fnRecordsTotal": function () - { - if ( this.oFeatures.bServerSide ) { - return parseInt(this._iRecordsTotal, 10); - } else { - return this.aiDisplayMaster.length; - } - }, - - /** - * Get the number of records in the current record set, after filtering - * @type function - */ - "fnRecordsDisplay": function () - { - if ( this.oFeatures.bServerSide ) { - return parseInt(this._iRecordsDisplay, 10); - } else { - return this.aiDisplay.length; - } - }, - - /** - * Set the display end point - aiDisplay index - * @type function - * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here - */ - "fnDisplayEnd": function () - { - if ( this.oFeatures.bServerSide ) { - if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) { - return this._iDisplayStart+this.aiDisplay.length; - } else { - return Math.min( this._iDisplayStart+this._iDisplayLength, - this._iRecordsDisplay ); - } - } else { - return this._iDisplayEnd; - } - }, - - /** - * The DataTables object for this table - * @type object - * @default null - */ - "oInstance": null, - - /** - * Unique identifier for each instance of the DataTables object. If there - * is an ID on the table node, then it takes that value, otherwise an - * incrementing internal counter is used. - * @type string - * @default null - */ - "sInstance": null, - - /** - * tabindex attribute value that is added to DataTables control elements, allowing - * keyboard navigation of the table and its controls. - */ - "iTabIndex": 0, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollHead": null, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollFoot": null - }; - - /** - * Extension object for DataTables that is used to provide all extension options. - * - * Note that the DataTable.ext object is available through - * jQuery.fn.dataTable.ext where it may be accessed and manipulated. It is - * also aliased to jQuery.fn.dataTableExt for historic reasons. - * @namespace - * @extends DataTable.models.ext - */ - DataTable.ext = $.extend( true, {}, DataTable.models.ext ); - - $.extend( DataTable.ext.oStdClasses, { - "sTable": "dataTable", - - /* Two buttons buttons */ - "sPagePrevEnabled": "paginate_enabled_previous", - "sPagePrevDisabled": "paginate_disabled_previous", - "sPageNextEnabled": "paginate_enabled_next", - "sPageNextDisabled": "paginate_disabled_next", - "sPageJUINext": "", - "sPageJUIPrev": "", - - /* Full numbers paging buttons */ - "sPageButton": "paginate_button", - "sPageButtonActive": "paginate_active", - "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled", - "sPageFirst": "first", - "sPagePrevious": "previous", - "sPageNext": "next", - "sPageLast": "last", - - /* Striping classes */ - "sStripeOdd": "odd", - "sStripeEven": "even", - - /* Empty row */ - "sRowEmpty": "dataTables_empty", - - /* Features */ - "sWrapper": "dataTables_wrapper", - "sFilter": "dataTables_filter", - "sInfo": "dataTables_info", - "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ - "sLength": "dataTables_length", - "sProcessing": "dataTables_processing", - - /* Sorting */ - "sSortAsc": "sorting_asc", - "sSortDesc": "sorting_desc", - "sSortable": "sorting", /* Sortable in both directions */ - "sSortableAsc": "sorting_asc_disabled", - "sSortableDesc": "sorting_desc_disabled", - "sSortableNone": "sorting_disabled", - "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ - "sSortJUIAsc": "", - "sSortJUIDesc": "", - "sSortJUI": "", - "sSortJUIAscAllowed": "", - "sSortJUIDescAllowed": "", - "sSortJUIWrapper": "", - "sSortIcon": "", - - /* Scrolling */ - "sScrollWrapper": "dataTables_scroll", - "sScrollHead": "dataTables_scrollHead", - "sScrollHeadInner": "dataTables_scrollHeadInner", - "sScrollBody": "dataTables_scrollBody", - "sScrollFoot": "dataTables_scrollFoot", - "sScrollFootInner": "dataTables_scrollFootInner", - - /* Misc */ - "sFooterTH": "", - "sJUIHeader": "", - "sJUIFooter": "" - } ); - - - $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, { - /* Two buttons buttons */ - "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left", - "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled", - "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right", - "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled", - "sPageJUINext": "ui-icon ui-icon-circle-arrow-e", - "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w", - - /* Full numbers paging buttons */ - "sPageButton": "fg-button ui-button ui-state-default", - "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled", - "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled", - "sPageFirst": "first ui-corner-tl ui-corner-bl", - "sPageLast": "last ui-corner-tr ui-corner-br", - - /* Features */ - "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ - "ui-buttonset-multi paging_", /* Note that the type is postfixed */ - - /* Sorting */ - "sSortAsc": "ui-state-default", - "sSortDesc": "ui-state-default", - "sSortable": "ui-state-default", - "sSortableAsc": "ui-state-default", - "sSortableDesc": "ui-state-default", - "sSortableNone": "ui-state-default", - "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n", - "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s", - "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s", - "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n", - "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s", - "sSortJUIWrapper": "DataTables_sort_wrapper", - "sSortIcon": "DataTables_sort_icon", - - /* Scrolling */ - "sScrollHead": "dataTables_scrollHead ui-state-default", - "sScrollFoot": "dataTables_scrollFoot ui-state-default", - - /* Misc */ - "sFooterTH": "ui-state-default", - "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix", - "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix" - } ); - - /* - * Variable: oPagination - * Purpose: - * Scope: jQuery.fn.dataTableExt - */ - $.extend( DataTable.ext.oPagination, { - /* - * Variable: two_button - * Purpose: Standard two button (forward/back) pagination - * Scope: jQuery.fn.dataTableExt.oPagination - */ - "two_button": { - /* - * Function: oPagination.two_button.fnInit - * Purpose: Initialise dom elements required for pagination with forward/back buttons only - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * node:nPaging - the DIV which contains this pagination control - * function:fnCallbackDraw - draw function which must be called on update - */ - "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) - { - var oLang = oSettings.oLanguage.oPaginate; - var oClasses = oSettings.oClasses; - var fnClickHandler = function ( e ) { - if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) - { - fnCallbackDraw( oSettings ); - } - }; - - var sAppend = (!oSettings.bJUI) ? - ''+oLang.sPrevious+''+ - ''+oLang.sNext+'' - : - ''+ - ''; - $(nPaging).append( sAppend ); - - var els = $('a', nPaging); - var nPrevious = els[0], - nNext = els[1]; - - oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); - - /* ID the first elements only */ - if ( !oSettings.aanFeatures.p ) - { - nPaging.id = oSettings.sTableId+'_paginate'; - nPrevious.id = oSettings.sTableId+'_previous'; - nNext.id = oSettings.sTableId+'_next'; - - nPrevious.setAttribute('aria-controls', oSettings.sTableId); - nNext.setAttribute('aria-controls', oSettings.sTableId); - } - }, - - /* - * Function: oPagination.two_button.fnUpdate - * Purpose: Update the two button pagination at the end of the draw - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * function:fnCallbackDraw - draw function to call on page change - */ - "fnUpdate": function ( oSettings, fnCallbackDraw ) - { - if ( !oSettings.aanFeatures.p ) - { - return; - } - - var oClasses = oSettings.oClasses; - var an = oSettings.aanFeatures.p; - var nNode; - - /* Loop over each instance of the pager */ - for ( var i=0, iLen=an.length ; i'+oLang.sFirst+''+ - ''+oLang.sPrevious+''+ - ''+ - ''+oLang.sNext+''+ - ''+oLang.sLast+'' - ); - var els = $('a', nPaging); - var nFirst = els[0], - nPrev = els[1], - nNext = els[2], - nLast = els[3]; - - oSettings.oApi._fnBindAction( nFirst, {action: "first"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); - oSettings.oApi._fnBindAction( nLast, {action: "last"}, fnClickHandler ); - - /* ID the first elements only */ - if ( !oSettings.aanFeatures.p ) - { - nPaging.id = oSettings.sTableId+'_paginate'; - nFirst.id =oSettings.sTableId+'_first'; - nPrev.id =oSettings.sTableId+'_previous'; - nNext.id =oSettings.sTableId+'_next'; - nLast.id =oSettings.sTableId+'_last'; - } - }, - - /* - * Function: oPagination.full_numbers.fnUpdate - * Purpose: Update the list of page buttons shows - * Returns: - - * Inputs: object:oSettings - dataTables settings object - * function:fnCallbackDraw - draw function to call on page change - */ - "fnUpdate": function ( oSettings, fnCallbackDraw ) - { - if ( !oSettings.aanFeatures.p ) - { - return; - } - - var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages; - var iPageCountHalf = Math.floor(iPageCount / 2); - var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength); - var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1; - var sList = ""; - var iStartButton, iEndButton, i, iLen; - var oClasses = oSettings.oClasses; - var anButtons, anStatic, nPaginateList, nNode; - var an = oSettings.aanFeatures.p; - var fnBind = function (j) { - oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) { - /* Use the information in the element to jump to the required page */ - oSettings.oApi._fnPageChange( oSettings, e.data.page ); - fnCallbackDraw( oSettings ); - e.preventDefault(); - } ); - }; - - /* Pages calculation */ - if ( oSettings._iDisplayLength === -1 ) - { - iStartButton = 1; - iEndButton = 1; - iCurrentPage = 1; - } - else if (iPages < iPageCount) - { - iStartButton = 1; - iEndButton = iPages; - } - else if (iCurrentPage <= iPageCountHalf) - { - iStartButton = 1; - iEndButton = iPageCount; - } - else if (iCurrentPage >= (iPages - iPageCountHalf)) - { - iStartButton = iPages - iPageCount + 1; - iEndButton = iPages; - } - else - { - iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1; - iEndButton = iStartButton + iPageCount - 1; - } - - - /* Build the dynamic list */ - for ( i=iStartButton ; i<=iEndButton ; i++ ) - { - sList += (iCurrentPage !== i) ? - ''+oSettings.fnFormatNumber(i)+'' : - ''+oSettings.fnFormatNumber(i)+''; - } - - /* Loop over each instance of the pager */ - for ( i=0, iLen=an.length ; i y) ? 1 : 0)); - }, - - "string-desc": function ( x, y ) - { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - }, - - - /* - * html sorting (ignore html tags) - */ - "html-pre": function ( a ) - { - return a.replace( /<.*?>/g, "" ).toLowerCase(); - }, - - "html-asc": function ( x, y ) - { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "html-desc": function ( x, y ) - { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - }, - - - /* - * date sorting - */ - "date-pre": function ( a ) - { - var x = Date.parse( a ); - - if ( isNaN(x) || x==="" ) - { - x = Date.parse( "01/01/1970 00:00:00" ); - } - return x; - }, - - "date-asc": function ( x, y ) - { - return x - y; - }, - - "date-desc": function ( x, y ) - { - return y - x; - }, - - - /* - * numerical sorting - */ - "numeric-pre": function ( a ) - { - return (a=="-" || a==="") ? 0 : a*1; - }, - - "numeric-asc": function ( x, y ) - { - return x - y; - }, - - "numeric-desc": function ( x, y ) - { - return y - x; - } - } ); - - - $.extend( DataTable.ext.aTypes, [ - /* - * Function: - - * Purpose: Check to see if a string is numeric - * Returns: string:'numeric' or null - * Inputs: mixed:sText - string to check - */ - function ( sData ) - { - /* Allow zero length strings as a number */ - if ( typeof sData === 'number' ) - { - return 'numeric'; - } - else if ( typeof sData !== 'string' ) - { - return null; - } - - var sValidFirstChars = "0123456789-"; - var sValidChars = "0123456789."; - var Char; - var bDecimal = false; - - /* Check for a valid first char (no period and allow negatives) */ - Char = sData.charAt(0); - if (sValidFirstChars.indexOf(Char) == -1) - { - return null; - } - - /* Check all the other characters are valid */ - for ( var i=1 ; i') != -1 ) - { - return 'html'; - } - return null; - } - ] ); - - - // jQuery aliases - $.fn.DataTable = DataTable; - $.fn.dataTable = DataTable; - $.fn.dataTableSettings = DataTable.settings; - $.fn.dataTableExt = DataTable.ext; - - - // Information about events fired by DataTables - for documentation. - /** - * Draw event, fired whenever the table is redrawn on the page, at the same point as - * fnDrawCallback. This may be useful for binding events or performing calculations when - * the table is altered at all. - * @name DataTable#draw - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Filter event, fired when the filtering applied to the table (using the build in global - * global filter, or column filters) is altered. - * @name DataTable#filter - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Page change event, fired when the paging of the table is altered. - * @name DataTable#page - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Sort event, fired when the sorting applied to the table is altered. - * @name DataTable#sort - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * DataTables initialisation complete event, fired when the table is fully drawn, - * including Ajax data loaded, if Ajax data is required. - * @name DataTable#init - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used
  • - */ - - /** - * State save event, fired when the table has changed state a new state save is required. - * This method allows modification of the state saving object prior to actually doing the - * save, including addition or other state properties (for plug-ins) or modification - * of a DataTables core property. - * @name DataTable#stateSaveParams - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The state information to be saved - */ - - /** - * State load event, fired when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state - allowing modification - * of the saved state is required or loading of state for a plug-in. - * @name DataTable#stateLoadParams - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * State loaded event, fired when state has been loaded from stored data and the settings - * object has been modified by the loaded data. - * @name DataTable#stateLoaded - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * Processing event, fired when DataTables is doing some kind of processing (be it, - * sort, filter or anything else). Can be used to indicate to the end user that - * there is something happening, or that something has finished. - * @name DataTable#processing - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {boolean} bShow Flag for if DataTables is doing processing or not - */ - - /** - * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to - * made to the server for new data (note that this trigger is called in fnServerData, - * if you override fnServerData and which to use this event, you need to trigger it in - * you success function). - * @name DataTable#xhr - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - * @param {object} json JSON returned from the server - */ - - /** - * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing - * the bDestroy:true parameter in the initialisation object. This can be used to remove - * bound events, added DOM nodes, etc. - * @name DataTable#destroy - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ -})); - -}(window, document)); - + /* Use the JUI classes object for display. You could clone the oStdClasses object if \ No newline at end of file diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/dtodata/js/jquery.dataTables.odata.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/dtodata/js/jquery.dataTables.odata.js index 1e144474..06c53ac1 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/dtodata/js/jquery.dataTables.odata.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/dtodata/js/jquery.dataTables.odata.js @@ -11,11 +11,11 @@ * BSD style license, available at: * http://datatables.net/license_gpl2 * http://datatables.net/license_bsd - * - * This source file is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. - * + * */ function fnServerOData(sUrl, aoData, fnCallback, oSettings) { @@ -95,21 +95,21 @@ function fnServerOData(sUrl, aoData, fnCallback, oSettings) { case 'date': case 'numeric': - var fnFormatValue = - (value.sType == 'numeric') ? + var fnFormatValue = + (value.sType == 'numeric') ? function(val) { return val; } : - function(val) { + function(val) { // Here is a mess. OData V2, V3, and V4 se different formats of DateTime literals. switch(oSettings.oInit.iODataVersion){ // V2 works with the following format: - // http://services.odata.org/V2/OData/OData.svc/Products?$filter=(ReleaseDate+lt+2014-04-29T09:00:00.000Z) - case 4: return (new Date(val)).toISOString(); + // http://services.odata.org/V2/OData/OData.svc/Products?$filter=(ReleaseDate+lt+2014-04-29T09:00:00.000Z) + case 4: return (new Date(val)).toISOString(); // V3 works with the following format: // http://services.odata.org/V3/OData/OData.svc/Products?$filter=(ReleaseDate+lt+datetimeoffset'2008-01-01T07:00:00') - case 3: return "datetimeoffset'" + (new Date(val)).toISOString() + "'"; + case 3: return "datetimeoffset'" + (new Date(val)).toISOString() + "'"; // V2 works with the following format: // http://services.odata.org/V2/OData/OData.svc/Products?$filter=(ReleaseDate+lt+DateTime'2014-04-29T09:00:00.000Z') - case 2: return "DateTime'" + (new Date(val)).toISOString() + "'"; + case 2: return "DateTime'" + (new Date(val)).toISOString() + "'"; } } diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.serializejson.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.serializejson.js index 3d29514c..5fd413e9 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.serializejson.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.serializejson.js @@ -213,7 +213,7 @@ var skipFromDataAttr = f.attrFromInputWithName($form, name, 'data-skip-falsy'); if (skipFromDataAttr != null) { - return skipFromDataAttr !== 'false'; // any value is true, except if explicitly using 'false' + return skipFromDataAttr !== 'false'; // any value is true, except if explicitly using 'false' } var optForFields = opts.skipFalsyValuesForFields; diff --git a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.view-engine.js b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.view-engine.js index 15cc272e..d5edc2d9 100644 --- a/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.view-engine.js +++ b/samples/databases/wide-world-importers/wwi-app/wwwroot/lib/jquery.view-engine.js @@ -1,16 +1,16 @@ /* * File: jquery.view-engine.js * Version: 1.1.0 -* Author: Jovan Popovic -* +* Author: Jovan Popovic +* * Copyright 2017 Jovan Popovic, all rights reserved. * * This source file is free software, under either the GPL v2 license or a * BSD style license, as supplied with this software. -* -* This source file is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -* or FITNESS FOR A PARTICULAR PURPOSE. +* +* This source file is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +* or FITNESS FOR A PARTICULAR PURPOSE. * * This file contains implementation of the JQuery templating engine that load JSON * objects into the HTML code. It is based on Alexandre Caprais notemplate plugin @@ -38,7 +38,7 @@ $("
    +
    diff --git a/samples/development-frameworks/django/bootcamp/messenger/static/css/messages.css b/samples/development-frameworks/django/bootcamp/messenger/static/css/messages.css index 76571bee..a3b84186 100644 --- a/samples/development-frameworks/django/bootcamp/messenger/static/css/messages.css +++ b/samples/development-frameworks/django/bootcamp/messenger/static/css/messages.css @@ -24,8 +24,8 @@ } .conversation-portrait { - width: 20px; - border-radius: 3px; + width: 20px; + border-radius: 3px; margin-right: 5px; } diff --git a/samples/development-frameworks/django/bootcamp/messenger/static/js/messages.typehead.js b/samples/development-frameworks/django/bootcamp/messenger/static/js/messages.typehead.js index 89d6869f..f3472f25 100644 --- a/samples/development-frameworks/django/bootcamp/messenger/static/js/messages.typehead.js +++ b/samples/development-frameworks/django/bootcamp/messenger/static/js/messages.typehead.js @@ -28,5 +28,5 @@ $(function () { source: substringMatcher(data) }); } - }); + }); }); \ No newline at end of file diff --git a/samples/development-frameworks/django/bootcamp/messenger/templates/messenger/includes/partial_conversations.html b/samples/development-frameworks/django/bootcamp/messenger/templates/messenger/includes/partial_conversations.html index e46cc507..8db973bc 100644 --- a/samples/development-frameworks/django/bootcamp/messenger/templates/messenger/includes/partial_conversations.html +++ b/samples/development-frameworks/django/bootcamp/messenger/templates/messenger/includes/partial_conversations.html @@ -9,7 +9,7 @@ {% endcomment %} {% for conversation in conversations %} - {{ conversation.user.profile.get_screen_name }} diff --git a/samples/development-frameworks/django/bootcamp/questions/static/css/questions.css b/samples/development-frameworks/django/bootcamp/questions/static/css/questions.css index bce657cc..e2698f53 100644 --- a/samples/development-frameworks/django/bootcamp/questions/static/css/questions.css +++ b/samples/development-frameworks/django/bootcamp/questions/static/css/questions.css @@ -33,7 +33,7 @@ .options { text-align: center; - + } .options span { @@ -106,7 +106,7 @@ } .favorited { - color: #f0ad4e; + color: #f0ad4e; } .question-info { diff --git a/samples/development-frameworks/django/bootcamp/search/static/css/search.css b/samples/development-frameworks/django/bootcamp/search/static/css/search.css index 8800ee25..91808f33 100644 --- a/samples/development-frameworks/django/bootcamp/search/static/css/search.css +++ b/samples/development-frameworks/django/bootcamp/search/static/css/search.css @@ -69,21 +69,21 @@ margin-top: 1em; } -.article-content ul, -.article-content ol, +.article-content ul, +.article-content ol, .question-description ul, .question-description ol { padding-left: 20px; } -.article-content ul li, +.article-content ul li, .question-description ul li { border-bottom: none; list-style: disc; padding: 0; } -.article-content ol li, +.article-content ol li, .question-description ol li { border-bottom: none; list-style: decimal; diff --git a/samples/development-frameworks/laravel/README.md b/samples/development-frameworks/laravel/README.md index 65386d1a..b4792913 100644 --- a/samples/development-frameworks/laravel/README.md +++ b/samples/development-frameworks/laravel/README.md @@ -41,7 +41,7 @@ http://php.net/manual/en/mcrypt.setup.php ### 2 Install dependencies On the project root there is a requirements.pip file. Make sure you install all the required dependencies before running myboard - + cd todo composer install diff --git a/samples/development-frameworks/laravel/vendor/composer/autoload_static.php b/samples/development-frameworks/laravel/vendor/composer/autoload_static.php index bc8b7027..0e07ec3c 100644 --- a/samples/development-frameworks/laravel/vendor/composer/autoload_static.php +++ b/samples/development-frameworks/laravel/vendor/composer/autoload_static.php @@ -20,11 +20,11 @@ class ComposerStaticInitc2f02e56c92899952402c7cdb96edbe7 ); public static $prefixLengthsPsr4 = array ( - 'X' => + 'X' => array ( 'XdgBaseDir\\' => 11, ), - 'S' => + 'S' => array ( 'Symfony\\Polyfill\\Util\\' => 22, 'Symfony\\Polyfill\\Php56\\' => 23, @@ -44,221 +44,221 @@ class ComposerStaticInitc2f02e56c92899952402c7cdb96edbe7 'SuperClosure\\' => 13, 'Stringy\\' => 8, ), - 'P' => + 'P' => array ( 'Psy\\' => 4, 'PhpParser\\' => 10, ), - 'M' => + 'M' => array ( 'Monolog\\' => 8, ), - 'L' => + 'L' => array ( 'League\\Flysystem\\' => 17, ), - 'I' => + 'I' => array ( 'Illuminate\\' => 11, ), - 'F' => + 'F' => array ( 'Faker\\' => 6, ), - 'D' => + 'D' => array ( 'Doctrine\\Instantiator\\' => 22, ), - 'C' => + 'C' => array ( 'Collective\\Html\\' => 16, 'ClassPreloader\\' => 15, 'Carbon\\' => 7, ), - 'A' => + 'A' => array ( 'App\\' => 4, ), ); public static $prefixDirsPsr4 = array ( - 'XdgBaseDir\\' => + 'XdgBaseDir\\' => array ( 0 => __DIR__ . '/..' . '/dnoegel/php-xdg-base-dir/src', ), - 'Symfony\\Polyfill\\Util\\' => + 'Symfony\\Polyfill\\Util\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-util', ), - 'Symfony\\Polyfill\\Php56\\' => + 'Symfony\\Polyfill\\Php56\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php56', ), - 'Symfony\\Component\\Yaml\\' => + 'Symfony\\Component\\Yaml\\' => array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), - 'Symfony\\Component\\VarDumper\\' => + 'Symfony\\Component\\VarDumper\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-dumper', ), - 'Symfony\\Component\\Translation\\' => + 'Symfony\\Component\\Translation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/translation', ), - 'Symfony\\Component\\Routing\\' => + 'Symfony\\Component\\Routing\\' => array ( 0 => __DIR__ . '/..' . '/symfony/routing', ), - 'Symfony\\Component\\Process\\' => + 'Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), - 'Symfony\\Component\\HttpKernel\\' => + 'Symfony\\Component\\HttpKernel\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-kernel', ), - 'Symfony\\Component\\HttpFoundation\\' => + 'Symfony\\Component\\HttpFoundation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-foundation', ), - 'Symfony\\Component\\Finder\\' => + 'Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), - 'Symfony\\Component\\EventDispatcher\\' => + 'Symfony\\Component\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', ), - 'Symfony\\Component\\DomCrawler\\' => + 'Symfony\\Component\\DomCrawler\\' => array ( 0 => __DIR__ . '/..' . '/symfony/dom-crawler', ), - 'Symfony\\Component\\Debug\\' => + 'Symfony\\Component\\Debug\\' => array ( 0 => __DIR__ . '/..' . '/symfony/debug', ), - 'Symfony\\Component\\CssSelector\\' => + 'Symfony\\Component\\CssSelector\\' => array ( 0 => __DIR__ . '/..' . '/symfony/css-selector', ), - 'Symfony\\Component\\Console\\' => + 'Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), - 'SuperClosure\\' => + 'SuperClosure\\' => array ( 0 => __DIR__ . '/..' . '/jeremeamia/SuperClosure/src', ), - 'Stringy\\' => + 'Stringy\\' => array ( 0 => __DIR__ . '/..' . '/danielstjules/stringy/src', ), - 'Psy\\' => + 'Psy\\' => array ( 0 => __DIR__ . '/..' . '/psy/psysh/src/Psy', ), - 'PhpParser\\' => + 'PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), - 'Monolog\\' => + 'Monolog\\' => array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', ), - 'League\\Flysystem\\' => + 'League\\Flysystem\\' => array ( 0 => __DIR__ . '/..' . '/league/flysystem/src', ), - 'Illuminate\\' => + 'Illuminate\\' => array ( 0 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate', ), - 'Faker\\' => + 'Faker\\' => array ( 0 => __DIR__ . '/..' . '/fzaninotto/faker/src/Faker', ), - 'Doctrine\\Instantiator\\' => + 'Doctrine\\Instantiator\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', ), - 'Collective\\Html\\' => + 'Collective\\Html\\' => array ( 0 => __DIR__ . '/..' . '/laravelcollective/html/src', ), - 'ClassPreloader\\' => + 'ClassPreloader\\' => array ( 0 => __DIR__ . '/..' . '/classpreloader/classpreloader/src', ), - 'Carbon\\' => + 'Carbon\\' => array ( 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', ), - 'App\\' => + 'App\\' => array ( 0 => __DIR__ . '/../..' . '/app', ), ); public static $prefixesPsr0 = array ( - 'p' => + 'p' => array ( - 'phpDocumentor' => + 'phpDocumentor' => array ( 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', ), ), - 'P' => + 'P' => array ( - 'Psr\\Log\\' => + 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log', ), - 'Prophecy\\' => + 'Prophecy\\' => array ( 0 => __DIR__ . '/..' . '/phpspec/prophecy/src', ), - 'PhpSpec' => + 'PhpSpec' => array ( 0 => __DIR__ . '/..' . '/phpspec/phpspec/src', ), ), - 'M' => + 'M' => array ( - 'Mockery' => + 'Mockery' => array ( 0 => __DIR__ . '/..' . '/mockery/mockery/library', ), ), - 'J' => + 'J' => array ( - 'JakubOnderka\\PhpConsoleHighlighter' => + 'JakubOnderka\\PhpConsoleHighlighter' => array ( 0 => __DIR__ . '/..' . '/jakub-onderka/php-console-highlighter/src', ), - 'JakubOnderka\\PhpConsoleColor' => + 'JakubOnderka\\PhpConsoleColor' => array ( 0 => __DIR__ . '/..' . '/jakub-onderka/php-console-color/src', ), ), - 'D' => + 'D' => array ( - 'Dotenv' => + 'Dotenv' => array ( 0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src', ), - 'Doctrine\\Common\\Inflector\\' => + 'Doctrine\\Common\\Inflector\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/inflector/lib', ), - 'Diff' => + 'Diff' => array ( 0 => __DIR__ . '/..' . '/phpspec/php-diff/lib', ), ), - 'C' => + 'C' => array ( - 'Cron' => + 'Cron' => array ( 0 => __DIR__ . '/..' . '/mtdowling/cron-expression/src', ), diff --git a/samples/development-frameworks/laravel/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php b/samples/development-frameworks/laravel/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php index a53828ab..672391c3 100644 --- a/samples/development-frameworks/laravel/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php +++ b/samples/development-frameworks/laravel/vendor/doctrine/inflector/lib/Doctrine/Common/Inflector/Inflector.php @@ -404,7 +404,7 @@ class Inflector if (preg_match('/(.*)\\b(' . self::$plural['cacheIrregular'] . ')$/i', $word, $regs)) { self::$cache['pluralize'][$word] = $regs[1] . substr($word, 0, 1) . substr(self::$plural['merged']['irregular'][strtolower($regs[2])], 1); - + return self::$cache['pluralize'][$word]; } @@ -457,7 +457,7 @@ class Inflector if (preg_match('/(.*)\\b(' . self::$singular['cacheIrregular'] . ')$/i', $word, $regs)) { self::$cache['singularize'][$word] = $regs[1] . substr($word, 0, 1) . substr(self::$singular['merged']['irregular'][strtolower($regs[2])], 1); - + return self::$cache['singularize'][$word]; } diff --git a/samples/development-frameworks/laravel/vendor/doctrine/inflector/phpunit.xml.dist b/samples/development-frameworks/laravel/vendor/doctrine/inflector/phpunit.xml.dist index ef07faa5..0cf1d2d7 100644 --- a/samples/development-frameworks/laravel/vendor/doctrine/inflector/phpunit.xml.dist +++ b/samples/development-frameworks/laravel/vendor/doctrine/inflector/phpunit.xml.dist @@ -22,7 +22,7 @@ ./lib/Doctrine/ - + performance diff --git a/samples/development-frameworks/laravel/vendor/doctrine/inflector/tests/Doctrine/Tests/Common/Inflector/InflectorTest.php b/samples/development-frameworks/laravel/vendor/doctrine/inflector/tests/Doctrine/Tests/Common/Inflector/InflectorTest.php index 4198d22c..33267d1a 100644 --- a/samples/development-frameworks/laravel/vendor/doctrine/inflector/tests/Doctrine/Tests/Common/Inflector/InflectorTest.php +++ b/samples/development-frameworks/laravel/vendor/doctrine/inflector/tests/Doctrine/Tests/Common/Inflector/InflectorTest.php @@ -11,11 +11,11 @@ class InflectorTest extends DoctrineTestCase * Singular & Plural test data. Returns an array of sample words. * * @return array - */ - public function dataSampleWords() + */ + public function dataSampleWords() { Inflector::reset(); - + // In the format array('singular', 'plural') return array( array('', ''), @@ -150,11 +150,11 @@ class InflectorTest extends DoctrineTestCase * @dataProvider dataSampleWords * @return void */ - public function testInflectingSingulars($singular, $plural) + public function testInflectingSingulars($singular, $plural) { $this->assertEquals( - $singular, - Inflector::singularize($plural), + $singular, + Inflector::singularize($plural), "'$plural' should be singularized to '$singular'" ); } @@ -165,11 +165,11 @@ class InflectorTest extends DoctrineTestCase * @dataProvider dataSampleWords * @return void */ - public function testInflectingPlurals($singular, $plural) + public function testInflectingPlurals($singular, $plural) { $this->assertEquals( - $plural, - Inflector::pluralize($singular), + $plural, + Inflector::pluralize($singular), "'$singular' should be pluralized to '$plural'" ); } @@ -179,15 +179,15 @@ class InflectorTest extends DoctrineTestCase * * @return void */ - public function testCustomPluralRule() + public function testCustomPluralRule() { Inflector::reset(); Inflector::rules('plural', array('/^(custom)$/i' => '\1izables')); - + $this->assertEquals(Inflector::pluralize('custom'), 'customizables'); Inflector::rules('plural', array('uninflected' => array('uninflectable'))); - + $this->assertEquals(Inflector::pluralize('uninflectable'), 'uninflectable'); Inflector::rules('plural', array( @@ -195,7 +195,7 @@ class InflectorTest extends DoctrineTestCase 'uninflected' => array('noflect', 'abtuse'), 'irregular' => array('amaze' => 'amazable', 'phone' => 'phonezes') )); - + $this->assertEquals(Inflector::pluralize('noflect'), 'noflect'); $this->assertEquals(Inflector::pluralize('abtuse'), 'abtuse'); $this->assertEquals(Inflector::pluralize('alert'), 'alertables'); @@ -208,7 +208,7 @@ class InflectorTest extends DoctrineTestCase * * @return void */ - public function testCustomSingularRule() + public function testCustomSingularRule() { Inflector::reset(); Inflector::rules('singular', array('/(eple)r$/i' => '\1', '/(jente)r$/i' => '\1')); @@ -233,24 +233,24 @@ class InflectorTest extends DoctrineTestCase * * @return void */ - public function testRulesClearsCaches() + public function testRulesClearsCaches() { Inflector::reset(); - + $this->assertEquals(Inflector::singularize('Bananas'), 'Banana'); $this->assertEquals(Inflector::pluralize('Banana'), 'Bananas'); Inflector::rules('singular', array( 'rules' => array('/(.*)nas$/i' => '\1zzz') )); - + $this->assertEquals('Banazzz', Inflector::singularize('Bananas'), 'Was inflected with old rules.'); Inflector::rules('plural', array( 'rules' => array('/(.*)na$/i' => '\1zzz'), 'irregular' => array('corpus' => 'corpora') )); - + $this->assertEquals(Inflector::pluralize('Banana'), 'Banazzz', 'Was inflected with old rules.'); $this->assertEquals(Inflector::pluralize('corpus'), 'corpora', 'Was inflected with old irregular form.'); } @@ -260,10 +260,10 @@ class InflectorTest extends DoctrineTestCase * * @return void */ - public function testCustomRuleWithReset() + public function testCustomRuleWithReset() { Inflector::reset(); - + $uninflected = array('atlas', 'lapis', 'onibus', 'pires', 'virus', '.*x'); $pluralIrregular = array('as' => 'ases'); diff --git a/samples/development-frameworks/laravel/vendor/doctrine/instantiator/CONTRIBUTING.md b/samples/development-frameworks/laravel/vendor/doctrine/instantiator/CONTRIBUTING.md index 75b84b2a..d1fa7999 100644 --- a/samples/development-frameworks/laravel/vendor/doctrine/instantiator/CONTRIBUTING.md +++ b/samples/development-frameworks/laravel/vendor/doctrine/instantiator/CONTRIBUTING.md @@ -30,6 +30,6 @@ The PHPUnit version to be used is the one installed as a dev- dependency via com $ ./vendor/bin/phpunit ``` -Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement +Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement won't be merged. diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php index c9ebb41e..50e9d606 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Biased.php @@ -25,7 +25,7 @@ class Biased extends \Faker\Provider\Base $x = mt_rand() / mt_getrandmax(); $y = mt_rand() / (mt_getrandmax() + 1); } while (call_user_func($function, $x) < $y); - + return floor($x * ($max - $min + 1) + $min); } diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php index 9e92f146..6582684a 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/Internet.php @@ -29,7 +29,7 @@ class Internet extends \Faker\Provider\Base 'http://{{domainName}}/{{slug}}.html', 'https://{{domainName}}/{{slug}}.html', ); - + public static function toAscii($string) { $transliterationTable = array( @@ -143,7 +143,7 @@ class Internet extends \Faker\Provider\Base return str_replace(array_keys($transliterationTable), array_values($transliterationTable), $string); } - + private static function transliterate($string) { $transId = 'Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC; Lower();'; @@ -155,14 +155,14 @@ class Internet extends \Faker\Provider\Base return preg_replace('/[^A-Za-z0-9_.]/u', '', $transString); } - + /** * @example 'jdoe@acme.biz' */ public function email() { $format = static::randomElement(static::$emailFormats); - + return $this->generator->parse($format); } diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php index 132b480f..c6ef7b4f 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/UserAgent.php @@ -104,7 +104,7 @@ class UserAgent extends \Faker\Provider\Base } else { $ver = mt_rand(4, 5) . '.0.' . mt_rand(1, 5); } - + $mobileDevices = array( 'iPhone; CPU iPhone OS', 'iPad; CPU OS' @@ -118,7 +118,7 @@ class UserAgent extends \Faker\Provider\Base return "Mozilla/5.0 " . static::randomElement($platforms); } - + /** * Generate Opera user agent diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php index dc0b7979..917407ba 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/en_UG/Address.php @@ -7,7 +7,7 @@ class Address extends \Faker\Provider\Address protected static $cityFormats = array( '{{cityName}}' ); - + /** * @link http://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Uganda */ diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php index 21ef1083..e9fbcb47 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/hu_HU/Text.php @@ -245,7 +245,7 @@ Az ifjú szeme felragyogott. ...ElÅ‘húzta a tárcáját, és átadott kétezer dollárt, azután vállon veregette a pincért, és otthagyta. Nem hitte, hogy ébren van, vagy ha igen, akkor a fiú Å‘rült, és a hatalmas, ronda ember az ápolója. Két... ezer... dollár! Ezen az eseten érdemes gondolkozni! De hiába tartotta ilyesmire érdemesnek az esetet, mert rajtaütésszerűen elaludt. - + MÃSODIK FEJEZET 1 José pincér aludt. Aludt, miközben egy pillanatra megállt a levessel, aludt, amíg a szakács tálcára tette a húst, és aludt, amikor egy svéd magántanár ölébe kitálalta. @@ -1114,7 +1114,7 @@ Az idegen továbbment. A másik sűrűn pislogott, azután megtapogatta az arcát, és diadalmasan nézett a távolodó felé... - Most már beszélhetsz! Ilyen pofon csak egy van a világon! Istenemre, ez Fülig Jimmy! ...Alkonyatkor már tisztán látszott Szingapur, és sorra gyúló lámpái mint sárgás csillagok ragyogtak fel az ég alján. - + HARMADIK FEJEZET 1 Lassan haladt a Honolulu-Star. Szingapur hatalmas kikötÅ‘je közelinek látszott a mesebeli roppant burának tűnÅ‘ porfátyol alatt, amely befedte. @@ -1312,7 +1312,7 @@ Most valami egészen váratlan dolog történt. A herceg zsebre dugta a kezét, és nevetett. SzívbÅ‘l, jókedvűen. Erre már a rendÅ‘r és a lakáj is részvéttel nézték, pedig olyan egészséges, derűs kacagás volt ez, olyan pajzán, tiszta, csengÅ‘ hangsorozat, mintha felséges tréfát hallott volna. - Mit nevet? - szólt rá idegesen a rendÅ‘r. - Arra gondoltam, hogy nagyapám örök idÅ‘kre megszüntette a bennszülöttek testi fenyítését. És én önt, Mr. Greenwood, Almira fÅ‘terén akasztás elÅ‘tt rinocéroszbÅ‘r korbáccsal addig veretem, amíg nem mondja el százszor, hogy: "Szegény elmebeteg!" - + NEGYEDIK FEJEZET Fülig Jimmy naplója I @@ -1349,7 +1349,7 @@ Ilyeneket mesélt a hercegi király, aki ezenfelül uralkodó volt. Én meg hall - Egy maradt. A halálrakötelezett kalóznak a fia. Ezt néhány éve elfokták a Hollandiaok, a Hollandusok. Å még igen picinyke volt a harcok idején. Benntszülöttek rejtegették, és késÅ‘bb Å‘ is nagy rabló lett. Amikor elfokták felnÅ‘t korában, akkormár neki is sok vaj volt a fején. Bob Warins fiatalember, de máris szép sikert ért el a rablógyilkosi pályán. Úgyhogy tizenöt évre büntették Å‘t. Akkor megesküdött a fÅ‘tárgyaláson, hogyha kiszabadul, megöli a sziget uralkodóját az összes St. Antoniót és minden Alvarezt, és Å‘ lesz az uralkodó, de erre vajmi alig van ha, aligha van kilátás, mert jól ül a kényszermunkában. Ennyit mesélt és azt is, hogy Sir Egmont, a sziget miniszterelnöke, aki Å‘t jól ismeri, mert az anyjának a fivére és jó ember. Ez nem jön Szingapurba persze, mert akkor nem lehetne a heccet csinálni. De ha szó van róla, tudjam, hogy Å‘ a sziget örökös miniszterelnöke, apjának tanácsadója, Å‘sz, magas úr, a homlokán egy régi kardvágásból kifolyó forradás képez. Ered. Forradt homlokán egy régivágású kardhely van. Å nem megy el sohasem Almirából, ha beszélnek, akkor ezt tudjam. Akkor én ez megértem, és kikötött a hajó, viszont megfulladok a szűk ingben, ez rémes. (Folytatása következik.) - + ÖTÖDIK FEJEZET 1 A rendÅ‘r szelíden megfogta a fiú karját. @@ -1500,7 +1500,7 @@ Az ismeretlen cvikkeres a karjánál fogva vonszolta, de közben baráti bizalom Ujját tiltóan a szája elé tartotta. Åfelsége még mondott volna valamit, de az igazi Trebitsch ezt súgta: - Isten önnel... Szegény fiú... Igazán sajnálom... - rebegte, és belerúgott. ...A herceg csak azt érezte, hogy megnyílik alatta a föld... És zuhan. - + HATODIK FEJEZET Fülig Jimmy naplója II @@ -1544,7 +1544,7 @@ Tiltakoznék, de húsz rendÅ‘r áll ott feszesen, és mind rámnéz. Ilyent csak - Hová megyünk? - kérdezem én, a Fülig Jimmy. - A Yachtra. Megváltozott az eredeti program. Azonnal indulunk felségeddel Almirába, hogy elfoglalja a trónját. No most jól nézek ki. Eddiggis nagy baj van. De most (folytatása következik). - + HETEDIK FEJEZET 1 Åfelsége nem esett keményre. Zizzenés csapott fel körülötte, és ernyedten, kábultan feküdt a szalmán, ahová lezuhant a magasból. @@ -1719,7 +1719,7 @@ Csakugyan diplomatakülsejű, Å‘sz ember volt, bagolyszemüveges, angol bajuszos A kegyelmes úr elgondolkozva nézte. - Ha ez mind így van - mondta azután csendesen -, akkor miért ütötte le a Tulipánt? ...És a szekrény mögül elÅ‘lépett bekötött fejjel Tulipán. Csendben körülfogták a herceget. - + NYOLCADIK FEJEZET Fülig Jimmy naplója III @@ -1880,7 +1880,7 @@ Felnyomom a gombot, hogy a zseblámpa újra világítson. Ha lett volna bennem hang én sikoltok. De nem volt. Csak becsaptam az ajtót és futottam, de remegve, mintha maláriás roham rázna... futottam és reszkettem. Mert a zseblámpa fénye megmutatta a kabint és az asztalon egy nyitott koporsóban ott feküdt sárgán, szalmaszínű bajusszal, fekete szemgödörrel Mr. Gould! A Fernandez... Aki régen herceg, akit eddig kétszer a vízbe dobtak (folytatása következik.) - + KILENCEDIK FEJEZET 1 FenyegetÅ‘ alakok közeledtek lassan. Közöttük elsÅ‘ sorban a bekötött fejű Tulipán, Å‘felsége tulajdonosa. @@ -1961,7 +1961,7 @@ Nagy Bivaly szomorú, kegyetlen szemei egy pillanatnyi szünetet jeleztek. Piszkos Fred állt az ajtóban. A herceg agyában tótágast állt minden. Gyermekkori barátai letagadják, hogy ismerik. Piszkos Fred, akit sohasem látott, kijelenti, hogy jó ismerÅ‘sök. De a Nagy Bivaly keze egy hajszálnyit sem engedett a szorításból. Úgy nézett Piszkos Fredre, hogy néhány gyengébb idegzetű rablógyilkos megborzadt. Zöldesfényű, vérszomjas gyűlölet izzott a tekintetében. - + TIZEDIK FEJEZET Åfelségem I-sÅ‘ Fülig Jimmy naplója V @@ -2012,7 +2012,7 @@ Rövid habozás után mondta: A mindenit. Ez keszd meleg lenni a helyzet. De szÅ‘r Egmont nevet. - Azonban ez csak tréfa. Ugyebár tréfált felség? Ugyebár ön a mi királyunk? - Asz vagyok, - felelém csendesen és Å‘ rám hagyott engem, magamra, hogy az inas feladja nekem a marsal nevű katonaruhámat, amellyel szép kis pác kezdÅ‘dik itt. (Folytatása következik.) - + TIZENEGYEDIK FEJEZET 1 A Nagy Bivaly szorította a herceg nyakát. @@ -2167,7 +2167,7 @@ A herceg tántorogva lábra állt. Tüskés nyugodtan, hidegen, újra belevágot Harmadszor már csak nehezen emelkedett fel. De Tüskés Vanek gépies pontossággal lecsapott. Az eddigi kínok semmiségnek számítottak a harmadik kegyetlen ökölcsapás fájdalmához viszonyítva. Åfelsége félig agyonverten zuhant a földre, és egyetlen véres, égÅ‘ húsdarab volt az arca. Elájult. - + TIZENKETTEDIK FEJEZET Åfelségem, I-sÅ‘ Fülig Jimmy naplója VI @@ -2299,7 +2299,7 @@ Merénylövés! A katonák a bokrok közé nyargaltak, és én is üldözni akartam a gaszt, de Ekmont megfogott és a kocsi sebesen gördült tovább. - Ezért hiba felség, amit tett - monta Egmont. És most asz egyszer igaza volt. (Folytatása következik.) - + TIZENHARMADIK FEJEZET 1 A sötét folyosón tért magához Å‘felsége. Ide röpítették ki Vanek és barátai, miután elájult. @@ -2399,7 +2399,7 @@ A herceg körül félreálltak. - Igen. - A Hidegek Törvénye ítéletet fog hozni maga felett. Jól vigyázzon minden szavára. És a herceg tisztában volt vele, amikor ennek a leánynak a szemébe nézett, hogy élet-halálra megy a játék! - + TIZENNEGYEDIK FEJEZET Åfelségem, I-sÅ‘ Fülig Jimmy naplója VIII @@ -2481,7 +2481,7 @@ llyen egy körmösfont ez asz Ekmont homlokán a feltünÅ‘ ismeretjel dacára. - Akit maga bezárt huszonnégy órára. Piszkos Fred, a kapitány, a ládába. Most már tuttam, hogy milyen igasza volt, amikor elájult. Kelt mint, ma uralkodásunk annójában, Almira székestrónváros fÅ‘legvár által kézzel. Fojatás a következÅ‘: - + TIZENÖTÖDIK FEJEZET 1 Az egész úgy hatott, mint valami torz álom. A kidülledt szemű, rémült Nagy Bivaly, Holdvilág Charley halálfejével, a bekötött homlokú Tulipán, az a részeges, rongyos, Å‘sz hölgy, a diplomataszerűen elegáns Kegyelmes és Vöröskarom, a nagyvilági szépség, végül Piszkos Fred, a kapitány, amint sárgás szakállát morzsolgatja fekete szegélyű, hosszú karmai között, szinte valószínűtlenné tették az ijesztÅ‘ képet. @@ -2557,851 +2557,4 @@ A kapitány bóbiskolt. - Bonifác azt állítja, hogy Fülig Jimmy mint király érkezett meg a Honolulu-Staron. Miután sokat suttogott ezzel a kölyökkel. Bonifác szerint Fülig Jimmyt magas rangú urak egy Almira nevű yachton a Boldogság Szigetekre vitték. - És mi köze ennek a suhancnak az ügyhöz? - Letagadta, hogy ismeri Bonifácot. -- Ezt meg tudom érteni. Én sem dicsekszem vele. -- Mi a véleménye? -- Nem árt ezt a kölyköt elintézni... - Utálattal látták, hogy Piszkos Fred most is csak a fiú elleni bosszújával törÅ‘dik. -- És... az Almirába sietÅ‘ angol cirkálók Fülig Jimmy királyságát védik - szólt közbe Holdvilág Charley. - Mert két cirkáló van állandóan a közelben. -- Nem valószínű, hogy Fülig Jimmy trónjáért az angolok közbelépjenek. -Ez csakugyan valószínűtlennek látszott, és Å‘felsége kezdte rosszul érezni magát. Veszélyes lehet, ha az angolok védelmére szorulnak... és Fülig Jimmy ül a trónon. -- Itt a perc - mondta a Kegyelmes -, amelyre évek óta várunk! Elmegyünk Almirába! Leleplezzük Fülig Jimmyt, és a zűrzavarban visszaállítjuk a köztársaságot. Akkor ti valamennyien nagy jutalmat kaptok az embereitekkel együtt. -- És ez a kalózkölyök? -- Végezzetek vele! - -TIZENHATODIK FEJEZET -Åfelségem, I-sÅ‘ Fülig Jimmy naplója -IX -Almira fÅ‘legvár szobámban. Kelt mint bent. -Most mégiscsak lejírom, hogy a napló mitÅ‘l jön rá az emberre; mer nekem magamtól sohasem jutott volna az eszembe. -Asz úgy kezdÅ‘dik, hogy Å‘felsége mégis akormikor a hajón álltunk, mondá: -- Majd vigyázzon azért mindenre, nehogy galibát csináljon. -- Felsék bíszhat - mondám higgadtan -, én megállom a helyét a trónon, illetve megülöm, mivel álldogállni nem szokásom. -Akkormég úgy hitte, hogy Å‘ jön helyettem királynak. Pedig én mentem helyette, mert Greenwood Å‘t letagatta (pedig fájt neki) Egmont meg engem felismert és az nem fájt senkinek, hogy a gyilkos Warins és az összes bentszülöttek egy csavargót öltek meg a király helyett. Csak aszt sajnálom, hogy egy napra ládába zártam Piszkos Fredet, és így nem bírta elszöktetni Tahitibe a királyt. -No mintegy. Reméljük a legjobbat. Én csupa jobbhelyre attam ajánlást Å‘felségének ezért, ha nem lesz baja, akkor örülhet, hogy megúszta. -Mostanában a könyvtárban pálinka helyett könyvet is néztem több alkalommal. Nagy uralkodók volt a címe, és tanultam ebbÅ‘l a szakmát. -Itten van asz, hogy minden uralkodónak családi fája van, de amint látom, aszon nevek nÅ‘nek. Aszután áll, hogy egy uralkodó, bizonyos Bonepárti aszt monta, hoty kenyérrel és vassal Kínáig is eljut Franciaországból. Asz nem kunszt. Próbálja meg egy vas nélkül, ahogy én szoktam. Továbbá uralkodók kegyesek, leereszkedÅ‘k és fent ségesek és nem tetszÅ‘ egyéneket a vár fogán lelövetnek. Vagy pedig lefejezték a nyakukat. -Meg eszt modják: "Uralkodása alatt népe felvirágzott és a fÅ‘téren egy szoborba megÅ‘regítették mását. Népe célját tűszte ki boldogulásul..." -Van itt egy 8-adik Hendrik, asz mindég a hóhérnál tartott válópert. Igazán elvesztették érte fejüket a nÅ‘k. -Hát esz nem érdekes. Sokkal izgatóbb, hogy a fÅ‘legvár erkélyén át látok jönni egy ismerÅ‘s alakot. -És megrémültem... Szentatyám... -Miféle csoda? -Ez Bonifác! -Semmi 2-ség. Ez a szélhámos megismert a hajón és megsejtette asz üzenetet! Ide jön zsarolni! Na megállj! Sajátkezüleg csengeték, és amikor jött a lakáj, kinek cipÅ‘jét még mindig hordám (saját lábulag), a hídlakót kértem. -Na jött. Copffján a propeller, ruhája zöld és mintha holta után márványba megöregítették volna. -- Gombperec úr! Egy ember jön a fÅ‘legvár felé! Fogassa el. -- Miért felség? -- Ez az én dolgom. Azonnal fogassa el, vessék börtönbe és hajnalban a vár fogán... -- Felség! - rebegé. -- Csend! Kora hajnalban a vár fogán felpofozni és kitoloncolni a szigetrÅ‘l. Többé nem látogathatja. -- De... ez nem törvényes eljárás! Én itten egy miniszter rangjában a törvény Å‘re vagyok. -- Kollegám egy bizonyos 8-adik Hendrik, aki szintén szigeti király volt, még Mórhus Tamás nevű miniszterét is lefejezé. -- Felség... ez nagyon régi volt. -- Majt én visszahozom ezeket a régi szép idÅ‘ket. Menjen s tegye amit parancsolni kegyem vala. Aszt az embert hajnalban a vár fogán egy balegyenessel kitoloncolni. -Rezgett a feje szegénykének, amíg ment. De parancs az parancs, jól tudám. -Amikor kinésztem asz ablakon, éppen elfogták eszt a sakál Bonifácot. És ha nem nésztem volna királyi tekintélyemet, enenkezüleg kenek le neki, mert ilyesmit nem jó másra bízni. -Eszután jelentené a lakáj, hogy a fürdÅ‘ tálalva van. Mer királyoknál ez úgyszólván mexokott művelés. Majd utána ismét jött Gombperec a hídlakó, de a feje még mindék reszgett. Egyik kezében hoszta a cipÅ‘it és harisnyában volt. -Igen kevéssé elbűvölÅ‘ látvány fiatal hölgyeknek. És már esteledett. Mondá: -- Felsék, asz államtanács várja. -Meghajolt és távozott, mer harisnyában volt. Én is készültem a cipÅ‘t lehúszni, és jött a lakáj. -- SzÅ‘r Ekmont! -- Jöhet - mondom én. -És jÅ‘tt: Egy másodpercig farkasszemet néztünk. Azutág szóla: -- Kész van az államtanácshoz? -- Igen. Csak... megfürödtem éppen. -- Röviden: ha a mai államtanács nem pikkelyezi a trónöröklési törvényt, akkor gyámság alá jön, és a Citag Ella várja magát. -Bisztos egy öreg nÅ‘, hogy így ijeszt vele. Mostan baj volt aszonban a gyámság miatt. -- Nézze Egmont... eszt... úgy áll a dolog, hogy adjon idÅ‘t még... mondjuk... -- Hiába 5-öl 6-ol. Esz fiksz! Esz hadüzenet. Ãll Timátum! -Ez valami bentszülött átok lehet. De mingyár elment. -Én meg ott álltam megfürödve. -Most mi legyen? A királynÅ‘ kért, hogy ne írjam alá. A király sem akarhattya, hogy én a képébe törvényt hosszak. -Kinésztem. -Sok, sok csillag volt és nehéz nedves esti levegÅ‘... Mindenfelé a pálmák és a szapad természet jó szagai, meg arra messze a sima fekete Indiai Oceján. -Eh! Fülig Jimmy! Mire vársz? Vigyél el néhány ékszeres kitüntetést orgaszda barátaidnak és gyerünk! Nem teneked való az uralkodói ipar! -Már most vaty két napig nem jól alszom asz ágyban és nincs étvágyam. Toulonban egy vizes bálán jobban hálnék és fejedelmi lenne utaszni egy hajófenékbe. -Esz nekem elég volt! Mire elmúlik a monszun, jó lenne valami lármás kikötÅ‘be lenni... -Hát gyerünk. És eszennel kiváltó tisztelettel ajánlom magamat! Néhány kisebb fém emléktárgyat, aranyt meg ilyent azért viszek. Asz ember ingyen nem uralkodik! Ahogy a királynÅ‘ mutatta, elfordítok a kép mellett egy fát és a keret odébmegy. Én besliszolok és visszatolom. -Jó napot. Csak várjon a tisztelt államtanács harisnyába, amíg náthát kap. Végigmegyek a folyosón. Mert a zseblámpámat megÅ‘rzém uralkodásom idején. KeszdetétÅ‘l napjainkig. -Néhány szép nagy patkány riadtan szétfutkál. Helyes kis állatok eszek. És végül gyövök egy nagy kapuhoz. Eszt kinyitom és ottan vatyok a hetyoldalnál. -Szabad ég alatt! -Teleszívom magamat a friss levegÅ‘vel! De nagy öröm, ha az ember tetronidzálhatja magát... Ott van a vasúti sín fűvel benÅ‘ve... Istenem! Hogy is van a csavargók nagy mondása? -"Mindenütt jó, de a legjobb sehol!" -Hohó! -És már indulnék, amikor egyszerre egy csendes hang mondja: -- Jó estét José. -Ott állt elÅ‘ttem a kísértetkapitány, és egy pisztolyt tart az arcom elé, de nyugodt és közömbös, mint mindig, és sapkaernyÅ‘jén, meg a gummiköpenyén folydogáló párák vízcsöppjein megcsillan a holdfény. -- Maga...? - mondom kissé rekedten, mert furcsa volt. -- Igen. -- Ki maga? -- Mindegy José. Ãgy nem hagynak ott egy trónt, battyúval, éjszaka! -- Mi köze? -- Csend... Még szükség van magára José. Maradnia kell, érti?... -- És ha nem? -- Akkor lelövöm. -De ezt szinte szelíden mondta. És cigarettázik. -- Mondja José, igazán nem tudja, mi lett avval a szekrénnyel, ami Fernandez szobájában volt, aki régen herceg? -Mit akar ez evvel? Valami kígyó zörren a bokorban. -- Feleljen, de Å‘szintén, mert nagyon fontos lehet. -- Felelek. Nem tudok a szekrényrÅ‘l... Dehát esz miért fontos? -- Mer... lehet, hogy amikor én magával vízbedobattam Fernandezt, akkor a halott helyett ez a szekrény volt a lepedÅ‘ alatt. -- Aszt nem lehet! Láttam a halott kezét kilógni. Szürke, nagy kéz... -Valósággal felderült az arca: -- Esz biztos?! -- Bisztos... Dehát... -- Menjen vissza, José. -Könnyű szél jött erre át a dagállyal a tenger felÅ‘l és sós szag volt... Láttam is messze, ahoty egy repülÅ‘ hal felugrott a viszbÅ‘l és tükrözve fitszánkolt... -De jó lenne menni. -- Vissza José - mondta ismét csendben és nekem vissza kellett meni, pedig olyan csuda ködök jöttek befelé a tengerrÅ‘l... -- Hm... - jegyeztem neki mentében. - Félek az államtanácstól... -- Nem lesz államtanács! - kiáltá utánam és becsapta a kaput. -Hallottam, ahogy egy nagy sziklát dübörgÅ‘n rágurít. -Fogva voltam, most már. Erre nincs többé kijárás. De miért mondá, hogy nem lesz államtanács? -Pedig nem, volt. Jól tudta. -Engem már mindenfelé kerestek és mind cipÅ‘ben. És rémülten. -- ltt van Warins - mondta rekedten a hídlakó. -- Mi történt? -- Ször Egmontot megölték. Å volt a bosszú elsÅ‘ áldozata. (Folytatása következik.) - -TIZENHETEDIK FEJEZET -1 -A herceget összekötözték. Nyugodtan tűrte. Jól tudta, hogy meg kell halnia. Akár Warins, akár St. Antonio, itt nem számíthat irgalomra. -- Engedjék meg - szólt a Hidegekhez mosolyogva, csengÅ‘ hangon -, hogy elbúcsúzzam a barátomtól. -Odalépett a Nagy Bivalyhoz, és kezet nyújtott. -- Köszönöm, hogy segíteni akart rajtam, és sajnálom, hogy nem jutalmazhatom meg ezért. -A Nagy Bivaly arcán valami bornírt megilletÅ‘dés látszott. Úgy fogta a fiú kezét, mintha nem tudná, mi az. Nézte a finom kis mocskos ujjakat, forgatta, tapogatta. -- Te kölyök... te voltál az elsÅ‘ ember... akivel... szívesen voltam... és... -Körülnézett sötéten, de annyi revolvermarkolatot fogtak körülötte mindenre elszánt emberek, hogy tehetetlen kínjában megcsikordult a foga, hangosan, bántón. -- Gyerünk - mondta Holdvilág Charley -, vigyétek ezt a férget a Vészkijárathoz. -Két haditengerészet elvezette, és ezzel befejezÅ‘dött St. Antonio uralkodó herceg Å‘felsége rövid találkozása a szabadsággal... -Most nem vitték a lifthez. A ház belsejébÅ‘l néhány lépcsÅ‘ vezetett le valahová. Azután föld alatti folyosókon át haladtak sokáig vaksötétben. -- Menj elÅ‘re! - mondta az egyik kísérÅ‘. -Engedelmeskedett. -Egyszerre megcsúszott, és gurult... gurult. Nem sokat. Néhány métert mindössze egy sáros, meredek lejtÅ‘n. -Mi ez neki? Fel sem kiáltott. Az egyik haditengerész hangja zúgott végig a boltozatok között: -- Ördög Will! -Fénypont közeledett imbolyogva, majd megjelent egy ember, csakugyan olyan, mint az ördög. Szénfekete néger volt, egy lámpással és egy revolverrel felszerelve. -- Valaki távozni fog a vészkijáraton - mondta az egyik tengerész, és elmentek. A kis lámpa fényét megsokszorozta a szűk folyosó. -A herceg egy aknában ült, sima agyagfalak között. Szemben vele egy ajtó látszott. Olyasféle, mint modern bárok bejárata. Lent rövidebb a földnél, középen kétfelé osztva. Kilincs nélkül. Az ajtó mögött sötétség, sustorgás és rossz, sós tengerszag. -Ott a halál? -Az ajtón hatalmas tábla függött: -VÉSZKIJÃRAT! -Alatta másik: -ADJA RUHÃJÃT ÖRDÖG WILLNEK! -Támogassuk a nincsteleneket! -A TÚLVILÃGON MINDEN JÓTETT SZÃMÃT! -Az ördög leszólt fentrÅ‘l. -- Akarsz enni valamit? Van itt egy hering. -- Nem kell. -- Pálinka sem? -- Az sem. Mi lesz itt velem? -- Hát... bizonyára meghalsz. Nem a legrosszabb. Volt egy nagybátyám, az leprát kapott. -Jó fiú ez. Vigasztalni akarja. A herceg a síkos lejtÅ‘ alján ült, és nézte a meredek falakat, ahogy a szeme megszokta a félhomályt. -- MásfelÅ‘l is le lehet ide jutni? - kérdezte az ördögöt. -- Nem hiszem. -- Hogy megy fel az ember innen? -- Nem tudom - felelte tanácstalanul. - Onnan, ahol te most vagy, még senki sem jött fel. -Csendben voltak. Loccsanás hallatszott. Cseppek hullottak. -- Mondd! Ördög! -- Na! -- Hogy halnak itt meg? -- A dagály feljön majdnem idáig, ahol én vagyok. Addig rég véged van. -- Miért nem ölik meg egyszerre az embert? -- Mert amikor derékig ér a víz, sokan elmondják, hogy hová dugták a rablott pénzt, és azt kinek adjuk. Ha egyszerűen lepuffantanák az illetÅ‘t, úgy sok értéktárgy veszendÅ‘be menne. -- Kegyetlen, de bölcs szokás. -A csobbanások közelebbrÅ‘l hallatszottak! Jön a dagály! -- Azért a ruhádat nekem adhatod, meg ha van valamid. Ãmbár nem úgy nézel ki, mint akinek valamije lehet - tette hozzá mélységes emberismerettel. -- És... ez az ajtó minek? -- Azon jön be a víz. Ostobaság az egész. Valamikor ott lakóhely volt, amíg a tenger nem mosta alá a partot. Azóta még nem rothadt ki egészen az ajtó. -A kis csapóajtó megbillent. Némi víz szüremlett már az aknáig, és mozgatta a laza szárnyat. Jó, hogy mint Warins hal meg. Nem méltó vég egy St. Antonióhoz. -- Nem jó mesterség az enyém - mondta az Ördög. - Mert némelyik ordít, átkozódik. Volt, amelyik követ dobott rám. Pedig hát mit tehetek én az egészrÅ‘l?... Ha nem lenne egy-egy jó ruha néha, hát semmiért sem vállalnám. - És még hozzátette nyomatékkal. - Mert a ruhát, azt nekem lehet adni. Minek elvinni a halakhoz nem? -Ezt a herceg is belátta. A szabadon lengÅ‘ ajtószárnyak sűrűn nyikordultak a befelé szüremlÅ‘ víztÅ‘l. Az akna alját már néhány centiméter víz borította el. -- Kapd el! - kiáltotta a herceg, és feldobta a mocskos, szakadt blúzát. Azután a nadrágot. -- Köszönöm... - vigyorgott boldogan az Ördög. - Csakugyan nem akarsz heringet? -- Nem kérek. -Ott állt mezítelenül, bokáig vízben, és a dagály egyre erÅ‘sebben áramlott. De még térdig sem ért a víz, amikor néhányan érte jöttek. -Közeledett a FÅ‘orvos nevű haditengerész. -- Halló, Warins! - kiáltotta. -- Mit akar? -- Ledobok egy kötelet. Fogja meg. Visszajön a Hidegekhez. Siessen. -A víz már térdig ért. A herceg elkapta a kötelet. Felrántották. -Å volt az elsÅ‘ ember, aki visszatért innen. -- Ördög! Add oda a ruháját! - parancsolta a FÅ‘orvos. -- Az már az enyém! - hördült fel a néger. -- Add oda, mert beverem a fejedet. -Siralmas arccal nyújtotta át a holmikat. -- Szép eljárás... - siránkozott az Ördög. - Elveszik, ami jogosan az enyém! -Ismét felmentek. A herceg nem sok reménnyel tért vissza. Mit reméljen? -Abba a szobába vitték, ahol az imént állt a Hidegek elÅ‘tt. Amikor végignézett a bíráin, szinte sajnálta, hogy nincs még vége az egésznek. -- Warins - mondta a Vöröskarom. - A halálítéletét megváltoztattuk. -- Úgy. És mi fog velem történni? -- Feleségül vesz engem... -2 -Csodálkozva állt. -- Nem értem, kérem... - szólt azután. -- Megmenekült a haláltól - magyarázta türelmetlenül Vöröskarom. - El fog venni engem feleségül. -- Sajnos - felelte a herceg - akkor mégiscsak végem. -- Miért? - kérdezte ámultan Vöröskarom. -- Ön csinos, kedves hölgy, de nem az én ízlésem. Ne haragudjon. - És a matrózokhoz fordult. - Fiúk, mehetünk vissza. -A Nagy Bivaly hápogott, mert kimaradt a lélegzete, a Kannibál Béby disznóarca hosszú lett, és a rongyos, Å‘sz hölgynek torkán akadt egy fél szivar a meglepetéstÅ‘l. -Vöröskarom félelmetesen ragyogó szemmel nézett a fiúra. Felállt, és lassan odament. A herceg elé állt olyan közel, hogy csaknem összeért a testük. -Az aranyfényű, hideg zöld szemek félelmetesen ragyogtak. A szép kis száj félkörré görbült, az apró orrcimpák megrezdültek, és parfümös lehelet csapott Å‘felsége arcába. -Most igazán ijesztÅ‘ volt a leány. -- Maga söpredék! Maga csúfolódni merészel? -- Nem csúfolódom, és tisztelem önt, sÅ‘t kissé félek is e pillanatban, de a fenyegetés nem megfelelÅ‘ mód arra, hogy tetszésemet megnyerje. -- Maga... maga mit gondol - mondta, és utálattal nézett a kék-lila hurkákkal lepett daganatokra a herceg arca helyén -, miért akarom, hogy feleségül vegyen? -- Bizonyára megfelelÅ‘ élettársnak képzel. De ebben téved. Én szeretem az italt és a szabad életet. -- Bolond. -- Az igaz, de nem annyira, hogy elvegyem. Ön igen csinos, azonban nekem nem tetszik. Telt idomú, fekete hölgyeket szeretek. - És újra a matrózok felé fordult. - Gyerünk, fiúk, mert elmúlik a dagály, és akkor ülhetek hat órát abban a gödörben... -A herceg jól tudta, hogy álnéven kötött házasságok éppolyan érvényesek, mintha St. Antonio fÅ‘herceg néven esküdne meg a leánnyal. -- Hát akkor... Majd megtanítom, hogy másképp kell beszélni velem... Itt elbánnak az ilyen pökhendi kölyökkel. -- Tulipán - mondta Holdvilág Charley -, ezt az alakot egy guanótelepre add el. -A herceg egykedvűen vállat vont: -- Tehetnek velem, amit akarnak. Nem nÅ‘sülök. Ölessen meg, tépjenek szét, süssenek meg lassú tűzön: én élek-halok a fekete hajú, telt idomú nÅ‘kért. -És ehhez egy szutykos torzkép vigyorgott Vöröskaromra. -- Ide hallgasson, Vadsuhanc - mondta a Kegyelmes. - Maga olyan szörnyű alak, hogy a leányom abba a szobába sem ereszti be, ahol napközben tartózkodik. Nekünk bizonyos célok eléréséhez szükségünk van magára. Ha felhasználhatjuk, akkor megkímélnénk az életét. -- De honnan tudom, hogy ez így van? Hátha utólag belém szeret tisztelt leánya, és ragaszkodni fog ahhoz, hogy vele maradjak? Olyan karhatalom áll a rendelkezésére, hogy kényszeríthet erre. -A nÅ‘ most már nevetett, és szó nélkül kiment, de nagyon bevágta az ajtót. A Kegyelmes utánasietett. -- Mit teketóriázunk! - kiáltotta Holdvilág Charley. -- Igen vagy nem? Feleljen! -- Ne feleljen - mondta Kannibál Béby. - Adjatok neki öt perc gondolkodási idÅ‘t. Vigyétek a Szárítóba. -- Kérem... -Újra vitték. -A Szárító egy gömbölyű üreg volt. Olyasféle, mint valami ókori sírbolt, sima kemény fallal körülvéve. Pedig nem emberi kéz formálta ezt az üreget. Kínai díszműkészítÅ‘k laktak a kültelken, és itt hevítették a formált agyagot, földbe vájt kemencékben. Éjjel-nappal izzó, betapasztott gödrök fogták körül ezt a Szárítónak nevezett kavernát. Az amúgy is pokoli forróság itt elviselhetetlen volt. -Sok mindent elmondtak már a Szárítóban, amit nem szántak közlésre. Åfelsége elÅ‘ször azt hitte, hogy nyomban megfullad, amikor betaszították és a nyílást elzárták egy kÅ‘vel. -Azután elvesztette az eszméletét. - -TIZENNYOLCADIK FEJEZET -Åfelségem I-sÅ‘ Fülig Jimmy naplója -Én egy marha vagyok saját eszüleg! Ez a gyanú kelt mint bent asz agyamban, és ahogy a kirájok írják asz idÅ‘t: ambó dominó mai dátum. -Mer ott volt a gyilkos velem, beszéltem vele és nem sejtém. És egész idÅ‘ alatt nem sejtettem, hogy a kísértet kapitány kicsoda, ami pedig kézfekvÅ‘en világos volt. -Mer nem volt kísértet. Esz a kapitány, a hajón még úgy gondolom valami cinkosát járatta kapitányi ruhában, hogy asz Å‘ gasztetteit másra tolhassa. De Å‘ maga aki nyugodtan pipászott a kapitányi hídon, Å‘ maga volt a gyilkos. Mer most jut eszembe, hogy éjjel a Sztáron-Nonolu hajó 1.lsÅ‘ osztályú folyosóján láttam, amikor meghalt Fernantesz, aki régen herceg. -Erre is magamtól jöttem rá. -És kicsoda esz a kapitán? Warins! Ez a Warins Bob Szumbafáról nemoda szökött ahol várták. Hanem St. Antonio hajója elé Por-Cueszbe. -Erre is magamtól jöttem rá. -Tuthattam volna elÅ‘bb is. Hiszen esz a Wirth nevű kapitán, amint hallottam csak Por-Cueszbe jött a hajóra. Gondolhattam volna elÅ‘bb is, hogy Å‘ Warins Bob. De én egy marha vagyok. -Erre is magamtól gyöttem rá. -A rentÅ‘rség Jáváról mostan ír: Aszongya. Elnyerte a megállapítást, hogy a fegyenc nem a Bolondság Sziget felé vette útját, amint aszt elejinte hittük, hogy bosszút álljon, hanem zseniális módon a kiráj elé szökött Por-Cueszbe. És Å‘ is a Holo-Nununsztáron gyött, mert Szingaporban kishijján elfoktuk a nyomát. Tugyuk egy Bonifác nevűnek a bejelentésérÅ‘l (esz a spicli mék kihússza tÅ‘lem a legmagasabb lutrit) hogy a Nono-Holasztárlulu fedelezén gyött, Warins Szingapurba. Megnyerte továbbá az állapítást: A hajó kapitánya Porc-Tueznél megbeteg lett és itt egy kitűnÅ‘ írásokkal ellátott amerikai kapitán vette át a veszetését a Hollo-Sztárnulunak, de most már tugyuk, esz hamis írás volt mind. Ãgy fÅ‘t ételezhetÅ‘, hogy Warins mekmérgeszte a kapitánt és hamis iratokkal elutazott hejette a Holono-Luszátoron Szingapurba. -Hát enyi elég volt, hogy rágyöjjek: Warins volt a kapitán! Eszért akarta, hogy engedéj dacára a hajóról viszbedobgyam Fernánteszt, aki régen hercek. És Szingapurba átslisszolt az Almira yachtra. -Asz viszont bisztos, hogy eszt a szegény Egmontott Å‘ ölte meg. És ebbÅ‘l az alkalomból távozott a titkos ajtón. Ahol késÅ‘bb nekem szembeállt revolverrel. Eszért monta, hogy "nem lesz államtanács". Mer tudta, hogy Ekmont pillanatnyi elhalálozása mijat elhalasztják... -...A szigeten igen erÅ‘s a nyugtalansák. Félnek a bentszülöttektÅ‘l, akik szeretik Warinst. És látom asz ablakból a kikötÅ‘t, hogy minden felé kis csoportok tárgyalnak iszgatottan. -Itt a palotában is igen begyulladt udvari elÅ‘kelÅ‘ségek járkálnak. Eszt a szÅ‘r Ekmontot ott ölték meg kés általi halálra, a tanácsterem elÅ‘tti szobában, ahogy éntÅ‘lem kiment. Orvul és esz igen csúf szokás. Én akkor szökni akartam a képen át, de elÅ‘bb átmentem máshová néhány ingóságos emlékért, eszalatt Warins megölte Ekmontot és épen elÅ‘ttem kilógott a képkereten. Aszután enkem visszakergetett a szabadból. -És én mostan itt jól nézek ki. -A királynÅ‘ gyött hozzám át a képen eképen: -- Maga... maga volt? - kérdezi izgatottan és a szeme ki van sírva és olyan sok szenvedés látszik szegényen. -- Mit tetszik? -- Maka ölte? -- De kirájné kérem! - kijáltom. - Én nem vagyok ajjas gyilkos! Én szemtÅ‘l szembe esetlek odaszúrok, de nem hátulról. A Fülig Jimmynek mindenki nyugodtan hátat fordít. -- Nem... Bocsásson meg... Maga nem lehetett... -- Warins volt! -- De... miért Egmontot? -- Mer engem ismer a hajóról, hogy nem vagyok király. Hiszen együtt gyöttünk. Ezért nem akar megölni, nem tehetek róla, igazán sajnálom. -A királyné az ujjait töredezte. -- Idefigyeljen. Az angol katonai ataséf írt. Hogy Szingapurban álhírek vannak a király személyérÅ‘l. És szeretné megcáflani. -Esz baj! Egy katonai adatséf asz nagy úr. -- Mi lesz? - kérdezte tÅ‘lem. -- Én eltűnök - mondom. - És asz kisebb baj, mintha a svingli kiderül. -- De... akkor nincs király... -- Asz igaz, hogy valakinek kell asz államügyek folyását irányba képeszni, dehát én méksem... -- Istenem... istenem... -- Hát mitÅ‘l kegyeskedik így ijedezni? - kérdém. -- Ha az angolok leszedik rólunk a kezüket, akkor Alvarez itten terem hajókkal... Szingapurban vár mindenféle söpredék élén egy alkalmat... -- Dehát a fÅ‘herceg és Piszkos Fret hol vannak? -- Semmi hír... Menjen legalább maga. - Sóhajtott - meneküljön innen. Maga jószívű, de rég fiú... Itt most összeomlás lesz, harc, halál. -- Én nem hagyom cserben... Itt maradok. -Odagyött és személyesen mekfokta a kezemet. Egy könny jött ki szegénynek. -- Várjunk - mondám -, talán történni fog valami. -És történt. -Délután megölték Gombperec hídlakót kopasz fejével. -Az olaj tisztviselÅ‘k csomagoltak, és a sziget lakóji fegyvereket tisztogattak és Gombperecet is hátva szúrták. A rentÅ‘rség ismét volt pontra jutott. -Én mek felvettem a szekrénbÅ‘l az én eccerű csavargói öltözékemet és mondám a királynÅ‘nek. -- Mostan kisliszolok. -- Mégis... megy? -- Igen. Vadászni. Megkereseni ezt a Warinst és ütögetni fogom, amíg nem éli túl. Akkor rend lesz. -- A bentszülöttek... -- Én nem vagyok egy begyulladós uralkodó. Eszt kell csinálni. Nagy vadászás lesz asz éjjel. És ha nem térek vissza, asz nem jelenti, hogy mexöktem innen, hanem hogy állandó tartózkodási helyem van Almirában uralkodásom végétÅ‘l, feltámadásig. -És ismét mekfogta önhatalmúlag a keszemet. -- Nem sokat számít most már az sem ha Warinstól megszabadult. -- Miért nem sokat? -- Mer eszért... -Ãrást mutatott, amit a katonai ataséf küldött: -Hogy értesíti az udvart: a kósza hírekre való tekintés miat Parker tengernagy holnapra kihallgatódzást kér Å‘felségétÅ‘l... -Hm... Esz baj. -- Kihallgassam? - kérdém. -- Parkert? Úgy ismeri a fiamat, mint én! Az idén nyáron két hétig hajóján látta vendégül a királyt. -Puff neki. -- Hát... ne fogadja... Én most gyengéskedem... -- Parker Admirálist... nem fogadni?... Vége... Az angolok ilyesmiben nem ismernek tréfát. -Itt nagy baj van. Aszt láttam. De mindegy. A kiskapun gyorsan kisurrantam, és vadászatra indultam az éjszakában... Semmit sem bánok, most csak meglássam valahol a tengerészruhás Warinst! Csak mekfoghassam a nyakát és akkor... (Megfojtása következik. ) - -TIZENKILENCEDIK FEJEZET -1 -Hogyan változott meg rövid idÅ‘ alatt annyira a helyzet: halálos ítélet helyett házasság? -Amikor Å‘felségét elvezették a Vészkijárathoz, a Nagy Bivaly fogai ismét hangosan csikorogtak. De mit tehetett ennyi ember ellen? Piszkos Fred most néhány egyenletes térdhajlással lecsúszott, és felemelkedett az ajtófélfa élénél, mert úgy látszott, hogy teljes hosszában viszket. -- Azt hiszem - mondta Holdvilág Charley -, hogy ez a fiú megérdemelte a halált. -- Igen - dörmögte Piszkos Fred -, Charley meg én így látjuk, és így helyes. -Ez a közbeszólás kínos volt Holdvilág Charley-nak, mert mint említettem, Piszkos Fred nem volt errefelé túlságosan népszerű. Fitymálva, megvetÅ‘en nézett végig rajtuk. Bozontos, Å‘sz szemöldöke közül a jobboldali bosszantóan éles szögben vonult fel a homlokára. -- Miért nem sírtok? Talán már sajnáljátok, hogy szegény Warins kalózt elteszitek a láb alól? -Volt valami dühítÅ‘en pökhendi a hangjában. -- És ha igen?! Mi közöd hozzá? - horkant rá Tulipán. - Engem fejbe ütött, és mégsem innám a vérét dühömben, mint te. -- Most már sajnálom a fiút - szólt Holdvilág Charley -, legszívesebben visszahozatnám. -Piszkos Fred végigmérte. -- Miért? Ki vagy te? -Valamennyien méla utálattal nézték a kielégült bosszújával hetvenkedÅ‘, gonosz, pimasz kapitányt. -- Úgy csinálsz, Fred, mintha te lennél itt az elsÅ‘ személy - röfögte a Kannibál Béby. -- Én köpök rátok - felelte vállat vonva, és újra csend lett. Azért kikezdeni valahogy mégsem mertek vele, ki tudja, miért. -- Hallgassanak, ennek nincs semmi értelme - mondta a Kegyelmes, de látszott, hogy neki sem tetszik a kapitány modora. - Inkább arról beszéljünk, mi a tennivaló. -Piszkos Fred az asztalon heverÅ‘ szarvasbÅ‘r táska tartalmában turkált, és egy cirádákkal barázdált bÅ‘rdarabot vett fel: -- Totem - mondta. -- Na és? -- Ez a bennszülöttek szerzÅ‘dése az öreg Warinsszal, akit a St. Antoniók felkötöttek. Ez a fiú tizenkét éves volt, amikor apját, a kalóz Warinst felkötötték. Azóta Bob Warinst nem látták a szigeteken. A bennszülöttek nem ismerik személyesen, csak a totem igazolja, hogy Å‘ Warins Bob. -És nézte az ábrákkal teleírt bÅ‘rdarabot. Lassan kezdték sejteni, de csak homályosan. Az bizonyos, hogy már keveri a kártyát. -- Beszéljen már, az Istenért! - dühöngött a Kegyelmes. -- Egyszerű - mondta Piszkos Fred. - Szerzünk egy suhancot, aki ezzel a totemmel a bennszülöttek elÅ‘tt mint Warins jelenik meg, és kezünkre játssza a törzsek segítségét... Ezt az egyént késÅ‘bb megölnénk. -- És addig? -- Addig feleségül venné a Vöröskarmot. -Az említett Vöröskarom éppen akkor lépett a szobába, és csodálkozva állt meg. -- Mit mond? -- Hogy szerzünk jó pénzért egy fiatalembert az alvilágból, és ez a Warins Bob néven feleségül veszi Vöröskarmot. -- Részeg? - kérdezte a Kegyelmes. -- Igen, de az nem tartozik a tárgyra. Az illetÅ‘ feleségül veszi, vagy legalábbis azt mondjuk, hogy elvette az ön leányát, és akkor a miénk minden. A bennszülöttek szeretik Warinst, a polgárság szereti Alvarezt, az angolok nem állhatnak Fülig Jimmy uralkodó mellé, és az amerikaiak mellettünk vannak. Egy merész expedíció kell, amely Warins Bobot és nejét, Alvarez elnök leányát hozza. -- MegÅ‘rült! -Nagy zaj volt. -Fred úgy állt ott, mint aki nem érti, mit találnak a tervén kivetnivalót. -- Ne beszéljen errÅ‘l kapitány! - szólt a Kegyelmes. - A leányomat nem adom össze valami csirkefogóval semmiféle politikai elÅ‘ny kedvéért. -- De hiszen - magyarázta a kapitány - ezt az illetÅ‘t késÅ‘bb megölnénk! -Vöröskarom elgondolkozva nézte az apját. Sokat szenvedett Alvarez. És mindezt egyetlen célért. -- Elfogadom a tervet, kapitány! Ha Ferenc császár leánya férjhez mehetett egy korzikai ügyvéd fiához, akkor én sem tiltakozhatom Warins Bob ellen! -- És nem is Warins Bobhoz megy nőül, mert az rövidesen meghal - szólt közbe a kapitány. - Csak valakihez, aki a totemmel és az írásokkal a kalózfiú helyett szerepel. -Most felugrott a Nagy Bivaly ordítva: -- De miért ne az igazi Warins vegye el a leányt? Miért csaljunk?! -Piszkos Fred paprikavörösen rikácsolta: -- Mert azt mondtam, hogy annak meg kell halni! Kimondtuk, és kész! És senki se merészelje... -- Tán fenyegetsz! - ugrott fel Holdvilág Charley. - Azt hiszed, te parancsolsz nekünk? Tudd meg, hogy a véleményem most már ugyanaz, ami a Nagy Bivalyé! A fiúra szükség van! -Örült, hogy oka volt elhagyni a Piszkos Freddel közös tábort. És a többi is dühödt kéjjel pártolta Warinst. -- Azért sem öljük meg! -- Ãtkozott sátán! - üvöltötte a Nagy Bivaly. -Úgy látszott, hogy nyomban meglincselik. -- Csendet kérek! - szólt a Kegyelmes. - Úgy határoztam, hogy ebben az ügyben a leányom döntsön. -- A fiút kiszabadítjuk - mondta határozottan Vöröskarom -, mert hozzá megyek feleségül. Hívjátok a Prófétát! -...Piszkos Fred egy sötét oldalfolyosón megelégedetten sodorgatta a szakállát. Az volt a kötelessége, hogy a herceget védje, és pillanatnyilag éppen az életét mentette meg. Mert Piszkos Fred még abból is hasznot tudott húzni, hogy mindenki gyűlöli. Megszerezte a Nagy Bivalyt a herceg testÅ‘rének, önmaga ellen, de mellékesen mindenki ellen. Azután kirántotta a halálítéletbÅ‘l azzal, hogy vadul követelte a halálát. A herceg élvezte Piszkos Fred népszerűtlenségének minden elÅ‘nyét. -2 -Mindenki kereste az alvilág misszionáriusát, Burtont, akinek Próféta volt a gúnyneve, de sehol sem találták. KésÅ‘bb feleslegessé is vált a keresése, mert a herceg a telt idomú, fekete nÅ‘kre való hivatkozással visszautasította Anna Alvarez kezét. -Buzgó Mócsing, aki különös átmenetet képezett itt a magántitkár, a gyorsküldönc és a hóhér között, szokott helyén bóbiskolt a ruhatári fülke mellett. A közelében Portás Robb, a börtönrendszerek ellenÅ‘rzÅ‘ szakértÅ‘je hideg mártást evett csirkével. A FÅ‘orvos felrázta az igazi Trebitschet. -- Hé! Mócsing! Gyere a Szárítóhoz vigyázni. Ott a Vadsuhanc, üsd fejbe, ha felmászik. -Az igazi Trebitsch megigazította állandóan lehulló, sötét madzagú drótcsíptetÅ‘jét, és elindult. -- Valami nagy dolgot tudhat ez a kölyök, hogy ennyit unszolják - mondta Portás Robb, azután elcsoszogott. Egy másik folyosóról nyíló ajtóhoz ment, amelyen ez állt: -RAKTÃR -MINDENKINEK TILOS A BEMENET! -Portás Robb kinyitotta az ajtót, és megkezdÅ‘dött a raktárban Å‘rzött kézigránátok, revolverek, puskák és tengerész egyenruhák kihordása. -A Kegyelmes kiadta a "riadót". Mennek Almira ellen. Akár Warins nélkül is. -- Amit jobbra hordatok, azt a Radzeerre viszitek - mondta a FÅ‘orvos -, a többi a Papete nevű óriás gÅ‘zösre kerül. -- Két hajóval megyünk? - kérdezte Tulipán. -- Igen, Holdvilág Charley vezeti a Papetet. -Közben Buzgó Mócsing, az igazi Trebitsch elaludt ültében. Hortyogott, és a szemüvege rezgett az orrán. Végül odaesett a Szárító nyílását elzáró kÅ‘ peremére. -Az alvó nem veszi észre, hogy valaki macskaléptekkel odaoson, elhúzza a követ, és ledob valamit a Szárítóba, azután elsiet. -...Åfelsége közben már kissé meghalt. Levetett minden ruhadarabot, nedvességtÅ‘l patakzó teste égett és viszketett, az ajka felhasadozott, a gégéje fájt, és hörögve lélegzett... -Egyszer csak leesett a magasból egy összegyűrt írás. És leesett a kÅ‘ peremérÅ‘l Buzgó Mócsing drótszemüvege, hosszú, fekete zsinórral, amíg Å‘ gyanútlanul hortyogott. A herceg kibontotta az írást. Kézzel írt, hevenyészett levél volt. Káprázó szemmel olvasta az öngyújtója fényénél: - Felség! - Burton nevű lelkész néhány év elÅ‘tt meghalt. Aki itt Próféta gúnynéven az Å‘ irataival szélhámoskodik, nem pap. Egyezzen bele a házasságba. (Mivel nem pap esketi, tehát érvénytelen.) Egyezzen bele mindenbe, akkor Almirába viszik, és ez a fÅ‘. Ott úgyis vége a kalandnak, és simán tisztázódik az ügye. A Titkos Szolgálatban vakon bízhat! - Ne kutasson utánam. Nem fedhetem fel magamat. - Leghűségesebb embere -Az írást eltette. Sokkal jobban érdekelte a szemüveg. Ezt leejtette az illetÅ‘, amikor az üreg fölé hajolt. Szinte lángolt a teste, de mégis megkísérelte, hogy gondolkozzék. Hol látta ezt a zsinóros üveget?... Ki hord ilyen kispolgári drótcsíptetÅ‘t az alvilágban? -Buzgó Mócsing! Az igazi Trebitsch! Å A Titkos Szolgálat embere! Kétségtelen! Buzgó Mócsing megszólította, amikor az elsÅ‘ nap ott ácsorgott a kardnyelÅ‘ körül! -Igaz, hogy eladta a Tulipánnak (két és fél dollárért), de talán késÅ‘bb kiszabadította volna... Zseniális tettetÅ‘ ez az ember... -Most... meg kell tudni biztosan, hogy a szemüveg az övé-e. Akkor kétségtelen, hogy az igazi Trebitsch az Intelligence Service embere! -...A szemhéjai forrón szúrtak, és a nyelve hasadozott... A levelet apró darabokra tépte, és falat kapart rá... Azután újra elájult. -3 -Közben Alvarez kétlaki életének úribb felét élte az Orientál Szálló teraszán. Innen látszik a tenger és a sok-sok pálma. Egy amerikai úrral beszélgetnek. A roppant selyemernyÅ‘ árnya alatt is éget a forróság. -- Nagyon érdekes - mondja az Å‘sz amerikai. - Bennünket, amerikaiakat a legcsekélyebb sziget sorsa is érint az Indiai-óceánon. -- Nem is szólva az amerikai tÅ‘kérÅ‘l, amelynek az én köztársaságom lehetÅ‘séget ad, hogy terjeszkedjék a civilizáció elÅ‘nyére. Ehhez kérek támogatást. -- Támogatást kér? -- Csak akkor, ha bebizonyosodik, hogy a sziget jelenlegi királya bitorolja a St. Antoniók trónját. -- Én megígérem önnek - mondta az amerikai admirális habozva és minden szótagot fontolgatva, mint amikor a gyógyszerész halálos mérget adagol kanalas orvossághoz -, hogy beszélek illetékes körökkel. És ha kedve van... ellátogathat mint vendégem a Boston cirkálón Almirába. -- És számíthatok amerikai segítségre? -Az admirális felállt. -- Mi a St. Antoniók angol védnökségét tiszteljük, de ha - ismét adagolt - nincsenek ott az uralkodó hercegek... akkor hát... - Gondolkozott. - És Warins? - kérdezte hirtelen. -- Warins a vÅ‘legényem - szólt közbe a leány -, és ezzel, azt hiszem, hosszú idÅ‘re megoldottuk a kormányzat kérdését. -Az admirális tágra nyílt szemmel meredt a gyönyörű leányra, azután megértéssel bólintott. -- Ön nagyon okos... És... azt hiszem... (egy kávéskanálnyi adag) számíthatnak ránk. Illetve... rám... (Végül határozottan.) Illetve Amerika pártfogására. -4 -...Åfelsége arra tért magához, hogy bár pokoli meleg van, az arcán hűs simítás vonult át. Vizes ruhát borított rá valaki. -Vöröskarom térdelt mellette, selyemruhában, az agyagverem földjén. -- Micsoda gazság ilyent tenni! Jobban van?... -- Igen... feleli elhalóan - de az ízlésem sajnos nem változott. -- Ostobaság. Nem tudtam arról, ami magával történt. Fel tud már jönni ebbÅ‘l az undok verembÅ‘l? -- Nem vihetnének mindjárt oda, ahol legközelebb kínoznak? -- Senki sem fogja kínozni többé! -Egy tengerész segítségével felvezették az odúból. Ott ül a kÅ‘ mellett, a földön Buzgó Mócsing, de már nem alszik. Igen szomorú. -- Maga miatt mennyi bajom van - mondja dühösen a hercegnek. - Oda a szemüvegem. -Hohó! Hiszen ez jeladás! -- Nem ez volt? - kérdezi nyomatékkal és mohón, miközben átnyújtja a verembe hullott szemüveget. -- De... Ó! Köszönöm! -A herceg sokatmondóan rákacsintott. Az igazi Trebitsch bámulva kérdi. -- Mi az?... A szemébe esett valami? -- Jó, jó - feleli Å‘felsége és újra hunyorít. Az igazi Trebitsch már nem is csodálja. Amit ezzel a fiúval itt csinálnak, attól nem csoda, ha hibbant lett... Azonnal elsiet. -- Jól érzi magát teljesen? - kérdez a leány diplomatikus nyájassággal, mert kiismerte az elvetemedett, konok ifjú természetrajzát. -- Jól... De most már nagyon szeretném tudni, hogy mi lesz velem? -- Választhat Warins: a rendÅ‘rségre akar inkább menni, vagy elvesz feleségül... -- Semhogy bezárjanak, inkább elveszem önt. De miért kívánja ezt tÅ‘lem? -- Elfoglaljuk a St. Antoniók trónját a klubok népével. -- Azt hiszi, hogy ott kÅ‘ kövön maradhat, ahol ennyi csirkefogó segít a honfoglalásban? -- Én nem félek tÅ‘lük! -- Mert nem tudja, mi az, uralkodni! - kiáltotta hevesen a herceg. -- Magát talán kiskorától kezdve egyébre sem tanították? -- Tessék?... Hm... Hát a kalóz Warinsok jól uralkodtak állítólag... És hogy képzeli kérem ott a szigeten... Postafordultával éljünk majd családi életet? -- Azt hiszi, hogy van annyi esztendÅ‘ és van olyan puszta sziget, ahol a közelembe jöhet? -- Olyan csúnya vagyok? - kérdezte lehangoltan Å‘felsége, és megnézte magát egy zsebtükörben. -A torzult képű csavargó vonásait még rútabbá tette a hÅ‘ség. Kék és bíborszínű daganatain felpattogzott a bÅ‘re. -- Most menjünk a Hidegek elé - szólt Alvarez leánya, és elindult. -Åfelsége minden baja dacára látásra alkalmas fél szemével nagyon is megnézte a finom vonalú csípÅ‘ket, a határozottan lépegetÅ‘, formás lábakat, mert fejedelmi tragédiája és testi fájdalma nem marták keresztül egészséggel impregnált, összesen húsz életévét. -- Tehát jobb elhatározásra jutott? - kérdezte Alvarez, amikor a herceg újra a Hidegek elÅ‘tt állt. -- Rosszabbra. Hajlandó vagyok az erÅ‘szaknak engedve feleségül venni senorita Alvarezt, de kérem jegyzÅ‘könyvbe foglalni, hogy mindvégig hangoztattam, mennyire érdekelnek a telt idomú, fekete hajú hölgyek. -- Nem fontos az ön felfogása - mondta Alvarez. - De ha a pap elÅ‘tt is kényszerre fog hivatkozni, úgy rövid úton végzünk magával Warins. -- All right! - bólintott a herceg. -Valaki megjelent a misszionáriussal, aki eddig künn várakozott. Magas, fekete ember volt, és azzal a kenetteljes gÅ‘ggel nézett körül, ami a legszigorúbb felfogású lelkészeket jellemzi, ha világi hely küszöbét lépik át. -- Ez a fiatalember itt Bob Warins, aki szeretné nőül venni a leányomat, Anna Alvarezt. -Åfelsége és Vöröskarom a pap elÅ‘tt álltak. -- Bob Warins - szólt a templomhoz szokott, messze hangzó, csengÅ‘ tenorban a misszionárius. - Akarod feleségül venni Anna Alvarezt? -Lelkesültnek alig nevezhetÅ‘ "igen" hangzott el. Azért a herceg elismeréssel adózott magában a Prófétának. Micsoda színész lett volna ebbÅ‘l az álhittérítÅ‘bÅ‘l! -- És te Anna Alvarez, akarod férjedül Bob Warinst? -- Igen... -Ekkor a pap összetette a kezüket, és úgy fogta, miközben a házastársi kötelességekre figyelmeztette Å‘ket. Majd így szólt. -- Bob Warins! Anna Alvarez! Isten és ember elÅ‘tt házastársak vagytok, immár egy test, egy lélek! -Valamennyi rabló fedetlen fÅ‘vel állt, és nagyon komolyak voltak. A misszionárius elÅ‘vette az imakönyvét... Vöröskarom valami egészen furcsát érzett. Dacára, hogy aki mellette áll, az egy torz képű, piszkos alvilági szörny... De Anna Alvarez mégiscsak polgárnÅ‘ volt, aki életében elÅ‘ször esküdött meg arra, hogy holtáig szeretni fog egy embert... -- Az isten áldása kísérjen utatokon, gyermekeim - mondta végül a misszionárius, és elment. -Senki sem sietett szerencsekívánatait kifejezni az ifjú párnak. -- Jól csinálta - mondta kissé idegesen Å‘felsége. - Még jó, hogy ez a Próféta a mennyország helyett itt a pokolban tartózkodik. -- Ez a pap - mondta a Kegyelmes - nem a Próféta volt. Az az alak elmászkált valamerre, és kénytelenek voltunk egy jezsuita atyáért küldeni a maláji misszióhoz. -Åfelsége körül egyet fordult a világ. Ezek szerint neki most törvényes felesége a Vöröskarom! -- És most elég volt ebbÅ‘l az utálatos játékból - mondta megvetÅ‘en Anna Alvarez, és fogalma sem volt róla, hogy e pillanatban már a Boldogság Szigetek királynÅ‘je. - -HUSZADIK FEJEZET -1 -A herceg kiszédelgett a nagy terembÅ‘l. Uram, Atyám! Mit tett?!! Elvette a lázadó elnök polgári származású leányát... mert ha Warins Bob néven is eskették, jól tudta, hogy az álnéven kötött házasság érvényes. -Összevissza bolyongott a katakombák folyosóin, amelyek ezen a napon szokatlanul élénkek voltak. Végre megpillantotta az igazi Trebitschet. Åt kereste! -- Ember! Ez mi volt, ami odabent történt ma a pappal? - kérdezte lihegve. -- Hogyhogy? - érdeklÅ‘dött riadtan az igazi Trebitsch. - EsküvÅ‘ lehetett. Nem? -- Nem a Próféta esketett! -- Nem hát! Hiába kerestük! A Próféta a kikötÅ‘be járt, és elárulta a rakodóknak, hogy a kínaiak lopják a pálinkát. -- Na de mi lesz ebbÅ‘l? -- A rakodók megverik a kínaiakat. -- Azt mondja meg, hogy velem mi lesz?! -- Maga is lopott a pálinkából? -- Ne tettesse hülyének magát. -- Esküszöm, hogy nem tettetem magam - hátrált ijedten az igazi Trebitsch. -- Az én házasságom érvényes? -- Természetesen. -- Miért nem értesített, hogy a Próféta nincs itt? -- Én is csak most hallottam, hogy a kínaiak elÅ‘l bujkál. Fél, hogy este agyonverik. -- Micsoda szörnyűség... Te jó Isten! - Megragadta Buzgó Mócsingot: - Mondja, ember. Legalább van valami terve? -- Igen. Este kimegyünk huszan dorongokkal a Próféta elé. -- Jól van... Látom, hogy hiába keresek közvetlen érintkezést magával. Nem kérdezek semmit. De egyre figyelmeztetem: ha tÅ‘rbe csalt, akkor megölöm! -És otthagyta. Buzgó Mócsing elhűlt ámulattal nézett utána és kétségbeesett tájékozatlanságában felvonta a két vállát: -- Csak tudnám, hogy mit akar tÅ‘lem? -2 -Huszonnégy órával késÅ‘bb kifutott a Radzeer! -Az indulást néhány szenvedélyes jelenet elÅ‘zte meg. MindenekelÅ‘tt Freddel volt a baj. -- A Radzeer útját természetesen a kapitány irányítja - mondta a Kegyelmes. -- Én ugyan nem - felelte Piszkos Fred, azután felállt, és hónaljáig húzta a nadrágját. -A Radzeer cirkálót annak idején pillanatnyi szorultságában Piszkos Fred lopta az Angol Királyság hajólétszámából. Végül úgy adódott, hogy kitüntették magukat, és így nemcsak bűnbocsánatban részesültek, hanem a Radzeer cirkálót is odaajándékozta az állam Piszkos Frednek és cimboráinak. Egy ideig békében járták a tengert, de Piszkos Fred zsarnok volt, azonfelül a hajó üzemköltségére szánt fedezetbÅ‘l állandóan sikkasztott, míg végül a cirkálón zendülés tört ki, és a kapitányt egy viharos éjszakán, a Jóreménység foka magasságában drámai elÅ‘zmények után felpofozták. Azóta szakított a Radzeerrel. -Hogy történt? Érthetetlen, de tény, hogy Piszkos Fred nélkül a Radzeer nem soká járt az óceánon. Ki tudja, miben állt a vén bűnös tudománya. Sehol sem szerették, mindenütt lármázott, követelt fenyegetÅ‘zött, de volt olaj, szén, ennivaló, jövedelem, és vihar elÅ‘tt, hogy hogy nem, mindig kikötÅ‘ közelében voltak. -Miután lerakták a cirkálóról, megakadt minden, azután üzemanyag híján Szingapurban vesztegelt a hajó. Végül a Kegyelmes bérbe vette matrózostul. -Amikor Fred váratlanul megjelent Szingapur alvilágában, és keverni kezdte rejtélyes módon a kártyákat, szóba sem állt egykori cimboráival. -- Csak maga vezetheti a Radzeert - mondta Vöröskarom is. -- Eszembe sincs. Megmondtam, mi a teendÅ‘, most már egy hülye is megcsinálja. A FÅ‘orvos vezesse a társaságot. -- Nézd, Fred - szólt a FÅ‘orvos, és nagyot nyelt -, én hajlandó vagyok elégtételt adni neked. Te nagyon csúnyán viselkedtél, sokat lopsz, szívtelen, gonosz kutya vagy, de elismerem, hogy nélküled megbuktunk. Te az ördöggel cimborálsz, és mindenkit becsapsz. Ezért megbántuk, hogy aljasságaidért teljes joggal kirúgtunk a cirkálóról. Még szebb elégtételt akarsz? -- Nézze, Fred - mondta a Kegyelmes, elfojtva egy mosolyt -, ez férfias beszéd volt a FÅ‘orvostól. -- Hát ide hallgass, FÅ‘orvos! - szólt a kapitány. -- A Kegyelmes kedvéért visszatérek a hajóra. Feltételeim: annyit iszom, amennyit akarok, annyit lopok, amennyit nem vesznek észre. -- Jól van - felelte a FÅ‘orvos. - De azt kikötöm, hogy az üzemanyag elszámolásban nem fordulhatnak elÅ‘ szivarok. -- Jó, ezt is elfogadom - hagyta rá a kapitány keserű megvetéssel, mint egy csalódott mártír. -- Hát akkor - fejezte be a Kegyelmes - fogjanak kezet. -- Az nem volt kikötve - mondta erre Piszkos Fred, és kiment. -3 -Amikor néhány napja úton voltak, és messze elhagyták a partot, a herceget felhozták a fülkéjébÅ‘l. Különben a fedélközben tartották elzárva. -- Sétálhatsz kissé - mondta a FÅ‘orvos. -A herceg szédelgett, amikor a napvilágra ért. A hajót kísérÅ‘ cápák uszonyai megcsillantak a napfényben. -- Nagy Bivaly hol van? - kérdezte a kísérÅ‘jétÅ‘l. -- Nem lehetett Å‘ket Piszkos Freddel egy hajóra engedni. -- És Vöröskarom, illetve nejem Å‘nagysága? -- Å a parancsnok. Mindenki szereti, és mégis félnek tÅ‘le... Igazi férfi!... -- Úgy? Akkor minek megy férjhez? -Jó forró nap ragyogott a fedélzeten. Åfelsége kimondhatatlanul élvezte a sétát. Piszkos Fred hangja süvöltött rá: -- Hej! FÅ‘orvos! Hogy merted felhozni a Vadsuhancot? Aki fogoly, az fogoly! Ezt nem tűröm! -- Fütyülök arra, hogy te mit tűrsz! -- Te kutya! - recsegte lihegve Petters, aki érthetetlen meggyÅ‘zÅ‘dése szerint az egyik Szingapuri mozgóképszínház portási egyenruhájában intézkedett a fedélzeten. - Megölnéd ezt a fiút! Talán haljon meg unalmában egy sötét odúban? -- Igenis pusztulni fog! Gyilkos, szélhámos, rabló! -- És te mi vagy, mi?! -- Ne tereljük az ügyet mellékvágányokra. Most nem rólam van szó! -- Hát vedd tudomásul - sípolta harsogó suttogással Petters -, hogy fütyülünk rád. -- A fedélköz fülkéjében kell maradnia! -- Gyere, Vadsuhanc! Azért is! -Bevitték a FÅ‘orvos kabinjába. -- Ezentúl itt laksz, hogy az az ördög megpukkadjon mérgében. -A kapitány iránti ellenszenv Warins felé irányította a szimpátiát. Nemcsak ennivalót kapott, hanem még fürdÅ‘t is készítettek számára, és egy uniformist is szereztek a fiúnak. Mintha ráöntötték volna. A Radzeer egykori kadétjának az egyenruhája volt ez. -A herceg arra már visszanyerte régi, szelíd angyalszerű kifejezését. Miután tisztálkodott, borotválkozott és végül megjelent a kadétruhában: szinte megtapsolták. -- Majd meglátjátok, hogy mit szól a Vöröskarom! - üvöltötte Piszkos Fred. - Mi Å‘t szolgáljuk! -- Ugathatsz, vén cápa! Mi nem szolgálunk senkit! A magunk ügyét szolgáljuk! -- Hogy fáj neki egyszerre a Vöröskarom! -Tulipán bizalmatlankodva mondta a kormányosnak: -- Biztosan fÅ‘z valamit a Vöröskarommal. -- Lehet, hogy fÅ‘znek valamit - dünnyögte a FÅ‘orvos is tűnÅ‘dve. -...Amikor Vöröskarom este kisétált a fedélzetre, néhány sötét pillantással találkozott a tekintete. Csak Piszkos Fred tisztelgett széles, nyájas mosollyal, és most kiderült, hogy mennyivel kellemesebb az arca, ha mogorva. -- Nagyszerű utunk van, parancsnok! - jelentette gavalléros alázattal, és a rekedt Petters, aki távolabb állt, megvetÅ‘en köpött. -Ki hitte volna! Piszkos Fred mint stréber! Víziószerű! A parancsnok sem lehetett elragadtatva tÅ‘le, mert rövidesen a kabinjába ment. -Reggelre feltűnt a távolban Tahiti. Vöröskarom kisétált a fedélzetre. A korlátnál egy ismeretlen egyént látott, jóképű, vidám, kadétruhás fiatalembert, nagy fekete szemekkel, aki néhány dió meg egy pakli kártya segítségével bűvészmutatványokkal szórakoztatta a legénységet. Nagyszerűen mulattak az emberek, és amikor Vöröskarom kijött, elhalt a mosoly. Csak Piszkos Fred köszönt harsányan a hídról. -- FÅ‘orvos! Ki ez az ember? - kérdezte Anna Alvarez. -- Az ön férje, parancsnok, Bob Warins. -Miféle változáson ment át, amióta utoljára látta? Ez az értelmes, csinos arc ugyanaz lenne, amire felnyögött, ha elé jött álmában? -Most a fiatalember feléje nézett, csúfondáros vigyorral szalutált, valamit mondott a matrózoknak, és ezek röhögtek. Vöröskarom a kajütjébe ment, és úgy vágta be az ajtót, hogy csak úgy csattant. -Sokáig idegesen járkált, azután csengetett: -- Bob Warins jöjjön ide! -4 -- Foglaljon helyet, Mr. Warins. -- Köszönöm, szenyorita. -- Miért szólít szenyoritának? Én asszony vagyok. -- De ennek nincs gyakorlati jelentÅ‘sége. Diplomáciai állapot. -- Miért került olyan szörnyű külsÅ‘vel elém? -- Néhány emberrel verekednem kellett elÅ‘zÅ‘leg. Szökött fegyenccel elÅ‘fordul... -- Maga... gyilkolta meg St. Antonio herceget? -A fiú kedves mosollyal bólintott. -- Természetesen. -- És... Fernandez régenst is? -- Hogyne. Kérek még egy kis teát. -- Hány... embert ölt meg életében? -Åfelsége tűnÅ‘dött, mint aki utánaszámol, mert nem szeretne hozzávetÅ‘legesen sem tévedni. -- Na... hát Istenem... pontosan nem is tudnám megmondani... Ha leszámítom a bennszülötteket, mintegy negyvenre tehetÅ‘ áldozataim száma. -Anna Alvarez nyitott szájjal, rémülten nézte. -- És tudott aludni? -Åfelsége sóhajtva legyintett. -- Amíg az ember nÅ‘tlen. -Mennyi könnyed, kedves elÅ‘kelÅ‘ség, diákos báj... És gyilkos! Egy kalóz fia! A totem és az írások kétségtelenné teszik, hogy Bob Warins ül itt. -- Ön úgy beszél, mintha gúnyolódna! Nem tudom, mennyi az igaz abból, amit mond. -- Megmondjam? - Åfelsége felállt, és odament Anna Alvarezhez. - Egyszer hazudtam önnek. -- Miben hazudott? -- Abban - felelte St. Antonio herceg lesütött szemmel -, hogy a telt idomú, fekete nÅ‘ket kedvelem. EbbÅ‘l egy szó sem igaz... Sajnos pontosan az olyan szÅ‘ke, karcsú hölgyekért szokásom meghalni, mint amilyen ön... -...És mielÅ‘tt még Vöröskarom felelhetett volna, gyorsan átkarolta, és megcsókolta. -De alaposan. -Anna Alvarez vagy két másodpercig tűrte, tehetetlenségbÅ‘l vagy másért, ki tudja? Azután teljes erejével eltaszította a herceget. -- Kalóz! Briganti!... Ez példátlan, amit merészelt! Példátlan! -- A házastársak közötti gyengédség megnyilvánulása korunkban elég ritka eset, de mégsem példátlan. -És vigyorgott. És borzasztó kedves volt a kadétruhában. -Azután tisztelgett: -- Jó éjszakát... Anna Alvarez. -A nÅ‘ arcán különös kín vonaglott át... "Gyilkos..." - mondta magában. "Kalóz... rabló..." -Rémülten vette észre, hogy mindezek dacára képtelen arra, hogy utálja! - -HUSZONEGYEDIK FEJEZET -1 -Buzgó Mócsing már napok óta nem hagyta el a kajütjét. Félt a hercegtÅ‘l. Ez a fiú ott kínozza, ahol éri. Különben mint írni és számolni tudó egyént az anyagraktárnál használták, irodavezetÅ‘nek. Å könyvelte el, amit Piszkos Fred sikkasztott. -Tizenkét óra tájban valami zajt hallott a szomszéd helyiségbÅ‘l. ElÅ‘vette a revolverét, és lassan kinyitotta az ajtót. -- Csendesen Mócsing, mert összenyomlak. -A Nagy Bivaly állt mellette. -- Mit akarsz? - hebegte az igazi Trebitsch. -- A Vadsuhanccal kell beszélnem. -- Hogy kerülsz ide?... -- Még Szingapurban elbújtam... -- EbbÅ‘l baj lesz! Minek keversz engem bele? -- Benned bízom. Egyszer megmentettelek, amikor négy kínai agyon akart verni. Nem fogsz elárulni. -- Gondolod? -- Tudom, mert nemcsak hálás vagy, hanem gyáva is... Hívd a Vadsuhancot. -- Azt nem! Ölj meg, vagy akármit... -- Ne is folytasd, maradunk az ölésnél... -- Na! Na!... Hátraugrott a készségesen mozduló óriás kezek elÅ‘l. - Hívom már... -Szomorúan elindult. Egész biztos, hogy megint nekirohan ez a bolond. Amint felért, megpillantotta a herceget. A korláton ült, és ukulelén játszott. Azonfelül énekelt, és a matrózok zöme körülfogta. -Mit tagadjuk, Å‘felsége alaposan megváltozott, amióta Fülig Jimmyvel elcserélte legmagasabb személyét. Olyan csodálatos népi tüneteket produkált, amelyek távol állhattak az Å‘si St. Antoniók vérétÅ‘l. Ilyen volt például a dal és a pofon. Åfelsége úgy pofozkodott és énekelt, hogy vén matrózok elsÅ‘ látásra a szívükbe fogadták. -Vöröskarom megjelent a parancsnoki szoba ajtajában. Piszkos Fred, aki eddig mindenkinek hátat fordított, gáláns meghajlással szalutált, és olyan volt, mint egykor ünnepelt, vidéki színészek, amikor elhatalmasodik rajtuk az aggkori elmegyengeség. -- Jó estét Vöröskarom... - mondta és megvetÅ‘en a szórakozókra mutatott. - Nem nekünk való társaság. -Vöröskarmot kellemetlenül érintette Piszkos Fred hűséges ragaszkodása. De mit tegyen? -- Warins, kérem! -- Parancs! -Odasietett. Beszélgetve sétáltak Vöröskarommal a korlát mentén. A leány beszél, a fiú mosolyogva bólogat, Å‘ is mond valamit, azután... -Azután egy kecses ugrással a tengerbe veti magát! -Mindenki dermedten áll! Itt is, ott is sötét uszonyok csillannak meg a holdfényben. Cápák! -Zaj, futkosás... lárma... -- A csónakot... Hiába!... Vége!.... -- Eresszenek le egy csónakot! - sikoltja halálfehéren Vöröskarom. -Csak Piszkos Fred nyugodt. Bekiált a szócsÅ‘be: -- Lassíts!... Vissza! Ãllj! -Feltűnik a fiú feje, amint küzd a viharos habokkal. Gyakorlatlan úszó ehhez! MielÅ‘tt a cápák valamelyike elkapja, talán megfullad. Sivítva nyikordul egy csónak kötele, amint fut a csigán. A küzdÅ‘ kis ponttól nem messze roppant uszonyok villognak... -Vége...! Vöröskarom remegÅ‘ kézzel megkapaszkodik. A döbbent emberek feje felett valami átsuhan... Egy loccsanás. -A kapitányi híd üres... És egy szakállas fej bukkan ki a vízbÅ‘l, távol a hajótól. -- Piszkos Fred beugrott a hídról! -Összevissza kiabálnak. -Ni!... Ott úszik! Elérte a fiút!... Tempózó jobb karja hatalmas ívben átcsap egy hullámon, és elkapja! De körül uszonyok villognak, itt is, ott is... Miféle külön istene van ennek, hogy elérte a fiúval a csónakot? -Már itt is vannak... A látszólag vén, keshedt kapitány úgy hozza fel karján a fiút, mintha pehely lenne. -- Vigye a kajütömbe! - súgja remegve Vöröskarom, de a fiú magához tér, hiszen csak sokat ivott a sós vízbÅ‘l. Talpra áll, és megrázkódik. -- Hé! Årült úr! - sivítja Petters. - Kevesen mondhatják el magukról errefelé, hogy kint vannak a vízbÅ‘l! -- Amit... értem tett... kezdi a herceg Piszkos Fred felé. -- Mit fecsegsz? - mordul rá a vén medve. - Fütyülök rád. Ha annyit bajlódtam egy üzlettel, azt nem adom a cápáknak. Érted? -Dünnyögve a kabinjába ment, és kiivott egy üveg rumot. Hiába! Ez ilyen ember. A cápák szájából kilopja az ennivalót, ha üzletrÅ‘l van szó, de szíve nincs a kutyának egy csepp sem. Az biztos. Valaki azt mondja, hogy két cápa úszott már a fiú felé, de amikor meglátták a kapitányt, csüggedten visszafordultak... -Ezt a történetet az óvatos cápákról még évek múlva is mesélték a kikötÅ‘kben, és mindenki elhitte... -2 -Mi volt az ugrás elÅ‘zménye? Ennyi: -- Beszéljünk okosan - mondta Vöröskarom. - Rövidesen megérkezünk. - Aranyzöld szemei egészen szomorú fényben ragyogtak. És fogyott valamit az utolsó napokban. - Mit tenne, ha megszabadulna? -- Eláruljam ellenségem Å‘nagyságának a haditervemet? -- Én elárulom. Talán elkerülhetjük a harcot. Az angolok nem léphetnek közbe a maga oldalán, Warins. Az amerikaiak viszont segítenek nekünk megszállni Almirát, és a köztársaságot támogatják. Mit tehet ez ellen? -- Nem tudom. -- Ha feladja a sanszát, akkor kap húszezer dollárt. Telepedjen le valahol Dél-Amerikában. Még fiatal, megjavulhat. -- Igen. Ez csakugyan lehetséges - felelte elgondolkozva Å‘felsége -, de azt hiszem, fiatal vagyok még a tisztességhez. Aztán meg kell akadályoznom, hogy ezt a sok bűnözÅ‘t odahozza a szigetre. -- Ön nem keresztezheti a terveimet! Csak szolgálhatja azokat, akkor is, ha kifogása van ellene! -- Ebben téved! -- Úgy? Hát bizonyítsa majd be, Warins Bob, hogy mivel húzhatja át a számításaimat? -- Például ezzel. -Hopp! Szép ívben átröpült a korláton, és csak egy loccsanás hangzott. -A többit tudjuk... -Åfelsége talán szívesen meghalt volna. Végre is itt egy szörnyű komplikáció van. MegnÅ‘sült. Elvett egy polgári nÅ‘t. -És ráadásul csúnyán beleszeretett. Mi lesz ebbÅ‘l? De amikor száraz ruhában ismét kilépett a fedélzetre, mégis örült a megkerült életnek. -- Vadsuhanc - súgta eleve ijedten a Buzgó Mócsing mellette. - Gyöjjön a fülkémbe... Na! Mit akar?! -A herceg megragadta: -- Miféle terve van? -- Aljas hazug volt az illetÅ‘, aki bebeszélte önnek, hogy én egy mérnök vagyok, vagy hadvezér, csupa tervvel. -- És miért hiszi, hogy jóra fordul minden? -- Van Isten... - próbált felelni kínban. - Jöjjön, kérem. -- Fog valamit tenni vagy nem?! -- Letelepszem Hawaiiban, ott él egy unokanÅ‘vérem - mondta Å‘szintén és kissé ijedten, mert a herceg egy fenyegetÅ‘ mozdulatot tett, de azután követte. -A fülkébe érve két iszonyú kar úgy ölelte át, hogy nem kapott percekig levegÅ‘t. -- Te... Kölyök... Hát élsz? -Åfelsége meghatva látta a Nagy Bivalyt. Megint olyan furcsán fogta a fiú ujjait, és nézte, mint valami idegen holmit. Alacsony, széles homloka elborult. -- Rosszul bántak veled? -- Egyáltalán nem. Remek fiúk, és nagyszerűen mulattunk. -Megelégedetten nézte a védencét. Micsoda finom, szép külsÅ‘. Ha neki ilyen fia lehetett volna valaha... -- Ide hallgass: azt tudod, hogy a Vöröskarom fel akar használni a terveihez... -- Tudom. Maga mondja meg, mit tegyünk? - kérdezte a herceg Buzgó Mócsingot. -- Együnk valamit - ajánlotta ez jó szívvel. - Abból nem jöhet ki bonyodalom. -- Ide hallgass - mondta a Nagy Bivaly. - Két nap múlva a Boldogság Szigetek magasságban leszünk. Akkor te csónakba ülsz velem, és elszökünk. Ha elérjük a Boldogság Szigeteket, hát nyert ügyed van. -- Rendben van, szökünk! - bólintott Å‘felsége. -- Nem kell szökni! A Radzeer elviszi magukat a sziget közelébe, és mehetnek, ahová tetszik! - szólalt meg egy hang mögöttük. -Vöröskarom állt ott! Az utolsó szavaknál nyitott be a fülkébe. -3 -Az ügy elÅ‘zményéhez tartozik, hogy Mrs. Warins, illetve St. Antonio hercegnÅ‘ érintetlenül küldte vissza a vacsoráját. Azután kisétált a fedélzetre. Itt kisebb csoportokban izgatottan vitatkoztak az emberek. És... hát nem valami barátságos módon néztek feléje. -- FÅ‘orvos! - szólt Vöröskarom. -- Parancsol? -- Nem szeretem a kétszínűséget. Valami bajuk van velem? -- Nézze... mi mindig szerettük magát - mondta a FÅ‘orvos. - De hát ami a Vadsuhanccal történik... -- Talán átpártoltak? - kérdi gúnyosan, és maga sem tudja, hogy miért fáj úgy a szíve. -- Ha egyszer hozzáment feleségül, miért akarja megölni?! Mi nem vagyunk tisztességes emberek, sok itt a tolvaj, a rabló és más szakmunkás, de az a véleményünk, akiket a pap összeadott, azok ne gyilkolják egymást! -Vöröskarom egészen sápadt volt, és a száját rágta. -- Minek bántja a Vadsuhancot?! - kiáltották többen is. -- Ez nem a ti dolgotok! - ordította közbe a hídról Piszkos Fred. - Vöröskarom meg én irányítunk itt! -- Marhaság! - sivította Petters. - Tudni akarjuk, hogy mit fÅ‘ztök. -Vöröskarom döbbenten látta, hogy a lázadás a levegÅ‘ben lóg. Vad zúgással közeledtek. Piszkos Fred mintha elvesztette volna az eszét, ordít: -- Mi azért álltunk össze, hogy üzletet csináljunk! Nem akarok kölyköt dajkálni! -- Warinsszal is van üzlet, ha melléje állunk! -- Emberek! - kiáltott Vöröskarom. - Én azt hittem, hogy ti bíztok bennem és szerettek. -- Megmondom nyíltan! Amióta Piszkos Freddel vagy szövetségben, nem szeretünk - sivított Petters. -Vöröskarom erre szó nélkül elsietett. Mögötte zúgott, morajlott a fedélzet. -Piszkos Fred hátratolta sapkáját a tarkójára. -- Elég volt belÅ‘led, kÅ‘szívű gazember! - kiáltották többen. -- Hiába ordítoztok, engem ez nem érdekel - felelte hidegen, és elÅ‘vette a pisztolyát. De hátulról valaki egy kötelet dobott rá, és lerántotta. A lövés valahová félrement, és egy perc alatt megkötözték. -- Dögöljön meg! -- Üssük agyon. -Ha a FÅ‘orvos és Petters nem védik tigris módra a vén rókát, akkor alaposan megjárja. -Mire a leány visszatért a herceggel és a Nagy Bivallyal, Piszkos Fred megtépve, bevert orral állt egy szellÅ‘ztetÅ‘ kürtÅ‘höz kötve. -- Bob Warins! - mondta a FÅ‘orvos. - Elhatároztuk, hogy átpártolunk hozzád. És maga a foglyunk, Vöröskarom! -4 -A fordulat kissé meglepte Å‘felségét. -- Nos? - fordult feléje Vöröskarom. - Mit fog tenni? Megölet? Bezárat? -- Egyik sem sürgÅ‘s - mondta a herceg, és az emberekhez fordult. - Kedves barátaim, elsÅ‘sorban oldozzátok fel a kapitányt, ha csakugyan én parancsolok. -Némi habozás után a FÅ‘orvos elvágta Piszkos Fred kötelét. Ez leporolta magát, és durván ráförmedt. -- Hol a sapkám?... - felszedte valahonnan, zsebre vágta a kezét, és a fülkéjébe ment megvetÅ‘ módján. És attól fogva nem látták. Ismét szakított a Radzeerrel. -- Most pedig figyeljetek rám - szólt Å‘felsége. - Én nem köthetek veletek üzletet. Mert lázadók vagytok. A lázadókat én nem szeretem. Azonfelül becsapni sem akarlak benneteket: ha a Szigetre érek, és uralomra jutok, valamennyieteket deportálnálak. -Döbbent csend lett. -- A mindenségit!.. - jegyezte meg valaki. Azután egy ideig tanakodtak. -- Vöröskarom! - mondta a FÅ‘orvos. - Mi ezt nem tudtuk. Vedd át újra a parancsnokságot. -- Nos? - kérdezte Å‘felsége mosolyogva. - Mit fog tenni? Megölet? Bezárat?... -- Emberek! - kezdte Vöröskarom. - Nem törÅ‘döm azzal, ami történt. A cél szentesít minden eszközt. De csak akkor szövetkezünk újra, ha Bob Warinst szabadon bocsátjátok. -Ez bomba volt! Tátott szájjal álltak! Mi van itt?! -- Mindegy. -- Legyen becsületes a játék. A Vadsuhanc mehet. Holnap este a Boldogság Szigetek magasságában élelemmel és amire szüksége van, csónakba szállhat. -- Köszönöm... És ha nincs kifogása ellene, úgy magammal vinném a Nagy Bivalyt. -Súlyos köd nehezedett a hajóra, ami csak fokozta az idegességet. A herceg párától fényes gumikabátjában, tiszti sapkájában szinte egykedvűen állt ott, a lázadók között, az óceánon. Most látszott, hogy ez az angyalarcú fiú igazi férfi. -A lázadók zavartan álltak, ugyanazt a kínos témát érintették gondolatban. Végül Petters kimondta: -- Jó lenne megkérdezni Piszkos Fredet... -Mert az ördög látott ilyent. Ahogy kihúzza a lábát közülük az a vén, szívtelen kutya, hát megáll minden. -5 -Leeresztették a csónakot. Néhány ládát, hordót, ponyvát és egyéb holmit helyeztek el benne. -- Nagy Bivaly - mondta a herceg. - Hozd magaddal Buzgó Mócsingot. -- Azt a szélhámost? Minek? -- Ne törÅ‘dj semmivel, csak hozd, ha kell, erÅ‘szakkal. -Ezután bement Vöröskaromhoz búcsúzni, és a Nagy Bivaly, mint hűséges mameluk, hozta az igazi Trebitschet. A nyakánál fogva. -- De kérem... - hápogta ijedten. - Ez a fiú Å‘rült... Összetéveszt egy jósnÅ‘vel! -- Beszállsz, vagy ledoblak? -Buzgó Mócsing az elÅ‘bbi mellett döntött. -Åfelsége kissé búskomoran állt gyönyörű, szÅ‘ke felesége mellett, akivel mindezideig csak diplomáciai viszonya volt. -- Anna... Nem gyÅ‘zöm hangsúlyozni, hogy a telt idomú, fekete nÅ‘k iránt mennyire közömbös voltam mindig... -- Maga tréfára vesz sok mindent... -Eh! Hát mi van vele? Hogy áll itt égÅ‘ arccal, könnyes szemmel egy gyilkos elÅ‘tt? -- Ha gyÅ‘zök, akkor is van még megoldás. Mondjuk, ossza meg velem a trónt mint igazi élettárs. -- Magával?! Soha! - kiáltotta. -- Kérem - felelte csüggedten az uralkodó. - Ha nem, hát nem. -- Kalózivadék felesége legyek?! -- Nincs igaza, ha lenézi a felmenÅ‘ ági rokonaimat, de hát... bele kell nyugodnom. -Nehéz szívvel fogta a nÅ‘ kezét. Istenem... Å itt szép csendben beleszeretett a feleségébe. De hát ki gondol manapság ilyesmire? És megcsókolta a leányt, szokott alaposságával. -...Vöröskarom iszonyúan szégyenkezve, de némán tűrte. Azután ott állt egyedül a szobában, és a ködös fedélzet homályából még feléje villant az elmaradó alak nedves gumikabátja, tiszti sapkája... -Keservesen sírt. - -HUSZONKETTEDIK FEJEZET -Åfelségem I-sÅ‘ Fülig Jimmy naplója -XI -Itt olyan jó nyugodt csönt van, ha az ember a szabadbaért, és lefelé ment a hegyoldalban. Valami madár nevet a fák között három egyforma hangon állandóan. -Nem is tudom, mitÅ‘l leszek szomorú. Itten valami romlás, valami végzet lóg le a levegÅ‘bÅ‘l és fáj a szivem. Eszek itten dolgosznak békében, és egyszercsak lecsap derült égbÅ‘l a veszély, mintha a földbÅ‘l nÅ‘tt volna ki! -...És ottan van a kikötÅ‘ben két darab angol torpedó leromboló és nem szól semmit. -Eszt a Warinst most mekkeresem, és a vasbottal kipuhatolom a fejit, hogy légüres tér van-e ott? Ezzel tartozom népemnek, és Å‘seimnek, akik bizonyára letekingetnek néha rám a menyei toloncházból. -Megyek az elátkozott sínek után... Meglátom a gyorsfényképészt. Kinn áll és a fogát piszkálja. -- Jóestét felsék - mongya. - Szép idÅ‘nk van. -- Jóestét alattvalóm - felelem. -- Felséged fényképét kitettem transzparensnek. -- Az minek, hiszen maga nem étterem. -Megnézem. Ott álltam élÅ‘ nagyságban az üveg alatt revolverrel. Egy uralkodó, talpig önvédelemben. -- Eszt megveszem! -- Felsék! Ön nem eladó, Ekmont szÅ‘r már mindenfélét ígért, hogy vegyem be a képét. De a törvények szerint nem kényszeríthet erre. -- Nem is kell. A kép nagyon jó megöregítése a királynak. -Aszt hiszem, hogy mielÅ‘tt elutazok, eszt a képet sajnálatomra ellopom innét, kénytelen. De miféle csoda tűnt elém a kirakatban! Ott van kint Pollino tűzoltó! A hídlakó és Ekmont, aki megszűnt. Az udvar utánzott! Esz tetszett. -- No jóéjszakát Firmin alattvaló. -Én megyek. Kinn a tengeren valahol nagy vihar lehetett, mer jó sok köd gurul a sziget belseje felé lassanként. Tuttam, hogy keressem a szellem-kapitánt, aki most már senki mint Warins Bob. Ahol erdÅ‘ van és benne a szülöttek. Ott lesz! -Ãzott fák csaptak az arcomba, pedig nem is esett. És tszuppogott a föld a lábom alatt. És mindég több sűrű köd jött, és muszáj volt köhögni... mer itt az erdÅ‘ben még fullasztóbb, mivel a sok trópusi fa lélekzik. Ezt egy nagy tudós magyarászta, aki az adeni fegyházban lelkész volt. Azonban léptek neszelnek oldalt felé. Semmit sem láték jóformán... De valami mozog!... Megvan! -Egy tengerészeti sapka fogója csillog a fehér holdas ködben. A kapitány-kísértet lehet csak, azaz Warins Bob! A fák köszt a ködben éppen errejön az árny. Megint csillog valami! Nedves sapka ellenezÅ‘! Kapitányi! -Egy alaposat ütök a vasbottal, éppen az árnyalak tetejére. Azt sem mondja, hogy "pardon" és elájula. Eszt csinálja utánam bármelyik nagy Péter vagy Lajos! -Vállamra doptam az ájult alakot és vittem... -Egyenesen a fÅ‘legvár titkos kisbejáratához sietek, ott fel a lépcsÅ‘n, végig a folyosón, be a lakosztályomba és odavágom a dögöt a padlóra, hogy csak úgy döng... -Szent Isten! -Esz akit én leütöttem, Å‘felségem az igazi St. Antonio herceg Szingapurból. És úgy vágtam fejbe, hogy alig van élet benne. (Vége következik.) - -HUSZONHARMADIK FEJEZET -1 -Åfelsége csónakja a fülledt, ködös óceánon a sziget felé igyekezett. -Nehéz húzni a jókora ladikot, és Buzgó Mócsing nagyokat nyög. -- Mit teszünk, ha elérjük a partot? - kérdi tÅ‘le Å‘felsége. -- Egy hálaimát rebegünk - feleli Buzgó Mócsing. -- Ide figyeljen, Trebitsch! Ha kiderül, hogy megtévesztett, akkor jaj magának! -Buzgó Mócsing siránkozva fordult a Nagy Bivalyhoz. - Ha én mondom neked, hogy nem normális... -Åfelsége a távolba nézett, amerrÅ‘l lassan kibontakozott az egzotikus sziget partjának bizonytalan körvonala. -- Csak azt sajnálom - dörmögte a Nagy Bivaly -, hogy azzal a gyalázatos Freddel nem tudtam leszámolni... -- Azt nem szalasztottad el - mondta egy gazdátlan hang, és a csónak orrában felhalmozott depó mögül elÅ‘bújt Piszkos Fred, a kapitány! -...Egy ideig némán bámultak rá. A Nagy Bivalynak tátva maradt a szája meglepetésében. -- No mit csodáltok? -- Most végzünk egymással, Fred - kiáltja végül Nagy Bivaly. -- Én köpök rád. - És megtette. - Az üzletem végett jöttem veletek. -- Miféle piszkos üzletet akarsz Warins Bobbal? -Piszkos Fred a sapkája alá nyúlt, és a fejét vakarta. -- Mondd csak, Nagy Bivaly, miféle rakomány lehet a te koponyádban agyvelÅ‘ helyett? Te azt hiszed, hogy ez a fiú itt Warins? -- Ha nem az, akkor kicsoda? -- St. Antonio uralkodó herceg!... Hé! Nézd a hülye, hát nem kiejti az evezÅ‘t? -2 -- Te... maga... - hebegte a Nagy Bivaly - St. Antonio...? -- Igen barátom - felelte Å‘felsége. - Kétszeres jutalmat érdemel a hűsége, miután ezt nem tudta. -- És kétszer kell lefejeztetni ezt a gazembert, aki meg akarta ölni! - kiáltotta Fredre, aki egy kurta pipát piszkálgatott nagy gonddal. -- Mit szól ehhez, kapitány? - kérdezte a herceg. -- Mármint én?... Semmit. Tudom, hogy felség kiutal tízezer dollárt, és esetleg kinevez valami herceggé, mert a rablógyilkos Nagy Bivaly kezeibÅ‘l kiszabadítottam... Nincs valakinek egy hosszú tűje? -- Mikor szabadítottad meg az én kezeimbÅ‘l a Vadsu... Å‘felségét?! -- Amikor meg akartad fojtani. Éppen akkor érkeztem a Négy Bölcs Sintérhez. Azt mondtam, hogy Å‘felsége nevetségessé tett és gyűlölöm, erre azonnal védelmedbe vetted, és ezt akartam... Azért ne fejeztesse le kétszer, felség. Elég lesz egyszer is. Nekem van szívem. -- Azt akarja mondani... - kérdezte a herceg - hogy az én érdekemben tette? -- Ezt a politikát űztem végig. Amikor elvitték önt megölni, én addig örültem, amíg visszahozatták, csak azért, hogy én megpukkadjak a méregtÅ‘l. Azután elkezdtem a Vöröskarmot szeretni, és addig szerettem, amíg elhidegült tÅ‘le mindenki, és fellázadtak ellene. Mert az én szeretetem öl, butít és nyomorba dönt. -- Gratulálok - kiáltotta nevetve a király. - Zseniális munka volt. De miért állt az én oldalamra? -- Mert tudtam, hogy Bob Warins meghalt. -- Mit mond?!... Mikor halt meg? -- Amikor leszúrtam. -3 -KésÅ‘ éjszaka volt, mire elérték a szigetet. A parton tüzet raktak, és megpihentek kissé. -- Most mondjon el mindent, kapitány. Hol ölte meg Warins Bobot? -- A Honolulu-Staron. Wirth kapitány, az angol haditengerészet Titkos Szolgálatának egy tagja leváltotta Port Szuezben a Honolulu-Star kapitányát. Engem régen ismer... ugyanis valamikor tengerésztiszt voltam... -- Te?... - motyogta a Nagy Bivaly. - Tengerésztiszt voltál? -- Igen. Onnan küzdöttem le magam idáig. Wirth kapitány felfedezett a fenékben, de azt mondta, maradhatok, csak tartsam én is nyitva a szememet. KésÅ‘bb Fülig Jimmy üzleti ügyei úgy kívánták, hogy idÅ‘nként megmérgezze a hajó utasait, és vesztegzár alá került a Honolulu-Star. Ez kapóra jött valakinek, aki végezni akart Fernandez régens herceggel, mert a gyilkos tudta, hogy vesztegzár-eljárás esetén nincs vizsgálatra és boncolásra mód, hiszen a tetemet azonnal el kell temetni. -- De én sürgönyileg kivételesen haladékot kaptam Szingapurból - szólt közbe a herceg. -- Igen... Ez kissé kínos lehetett a gyilkosnak. Bob Warins is fellopakodott a hajóra. Nem Almira felé szökött a fegyházból, hanem Északnak, egyenesen Port Szuezbe, és bevárta Felséged hajóját. A hajón olyan köpenyben és sapkában járt éjszaka a ködös sötét fedélzeten hogy futólag Wirth kapitánynak hitték, majd pedig kísértetnek. Amikor Fülig Jimmy segítségül hívott, én is találkoztam a kapitánysapkás Warinsszal a fedélzeten, és szembenéztem vele. Å pisztolyt rántott én kést. Azután meghalt. -- És biztos, hogy Å‘ volt? -- Nála volt a saját körözvénye a fényképével. A fedélzeten egy elszabadult tetem gurult arra. Fernandez régensherceg. Pillanatok alatt odakötöztem a helyére Warins Bobot. Ezt dobták a vízbe a régensherceg helyett, Fernandezt visszavittem a kajütjébe, ahol késÅ‘bb Fülig Jimmy nyakára zuhant. Fülig Jimmyt ez az eset legalábbis gondolkodóba ejthette. Lejött hozzám, és kért, hogy dobjam újra vízbe a halottat. Kint várt rám a kajüt elÅ‘tt. Én bementem, de érthetetlen módon Fernandez teteme eltűnt! -- Én vittem el - mondta a herceg -, véletlenül benyitottam, és megláttam a halottat. Elrejtettem az én kabinomban, és a másnap érkezÅ‘ Palmerston tanárt megkértem, hogy vigye Fernandez tetemét Szingapurba, ahol majd gondoskodnak az elszállításáról. Az egészségügyi hajó elvitte a halottat. Bizonyára az Almira yachtra került, ahol bebalzsamozták és hazavitték. -Hallgattak. A fülledt éjszakában egy kakadu rikoltott élesen. -- Szép életet élt Fernandez herceg - szólt a kapitány -, de igen hányatott halála volt... -- És hová lett az a Wirth kapitány? -- Ãtadta Szingapurban a kapitányi szolgálatot, és követte Fülig Jimmyt, hogy ne csináljon valami ostobaságot mint király. Wirth nem hitte el nekem, hogy Warins meghalt. Azt gondolta, hogy egy eltűnt kajütszekrényt kötöztem Fernandez teteme helyére. Pedig a szekrényt Fülig Jimmy megnyugtatására dobtam a tengerbe lepedÅ‘ben, a halott régens helyett. Ha ez a csavargó nem zár el a ládában, akkor felségedet Tahitibe viszem. Ãgy késtem egy napot, és ez csinálta a zavart. -- De hát - kiáltott Buzgó Mócsing - azt is mondják meg végre, hogy mi voltam én ebben az ügyben? -- Egy nagy ló - felelte Piszkos Fred rövid megfontolás után. -...És késÅ‘bb Å‘felsége kíséret nélkül elindult, hogy visszatérjen Å‘sei trónjára, a fellegvárba. Ãm ebbÅ‘l az alkalomból Fülig Jimmy jól fejbe vágta. - -HUSZONNEGYEDIK FEJEZET -1 -A Kegyelmes az amerikai cirkálóval érkezett Almira kikötÅ‘jébe, és bevárta a Radzeert. Délután az admirális, Vöröskarom és a Kegyelmes látogatást tettek az angol hajón, és szívélyes tanácskozásra ültek össze Parker admirálissal. -Az admirális figyelmesen végighallgatta a történetet. -- Önök szerint St. Antonio herceg meghalt? -- Igen - felelte a Kegyelmes. -- Borzasztóan sajnálom. Nagyon szerettem ezt a rokonszenves fiatalembert. Warins mindenesetre véres fejjel megy el a szigetrÅ‘l! -- Tengernagy úr... Bob Warins a férjem... Kérem, erre mindenesetre legyen tekintettel, ha... elfogja... - szólt közbe Anna Alvarez. -- Szenyorita - mondta tiszteletteljes hangon a tengernagy -, Bob Warins sorsáról nem döntenek az ön hozzászólása nélkül... -- És ami a továbbiakat illeti? - kérdezi az amerikai. -- Ha csakugyan egy csavargó bitorolja a trónt, úgy a Home Fleet egyetlen rombolója sem mozdul az uralmáért - felelte az angol. -- Hogyan lehetne a kérdést dűlÅ‘re vinni? -- Kihallgatást kértem Å‘felségétÅ‘l - mondta Parker, - akit igen jól ismerek. Azt hiszem, elfogadják tÅ‘lem a személyazonosság igazolását? -- Feltétlenül - felelte az amerikai. -Délután egy tiszt érkezett a hajóra, és közölte, hogy Å‘felsége szívesen látja este Parker admirálist és amerikai kollégáját, továbbá Alvarez volt elnököt a leányával a királyi várban. -2 -A királyi vár nagytermében valamennyi csillár teljes fényben ragyogott. A díszruhás udvari emberek olyan zárkózottak voltak, mint egy-egy igen közeli gyászoló rokon. -- Hiszed, hogy az a csavargó megjelenik itt? - kérdezte Alvarez a leányát. De Anna alig figyelt. Valahova a semmibe nézett, szomorú volt. -Most minden tekintet az ajtóra tapadt. Egy küldöttség érkezik, hófehér szakállú kapitány vezeti, vadonatúj egyenruhában: Piszkos Fred! -De nemcsak Å‘ jött el. Mögötte ott áll Holdvilág Charley, a FÅ‘orvos, a Kannibál Béby és a Nagy Bivaly. Ilyent még nem látott a St. Antoniók Å‘si várkastélya! Kínos eleganciájuk tudatában félszegen topognak. Pollino miniszter odalép a kapitányhoz: -- Örülök, uram... ÖnrÅ‘l sokat hallottam... Hol kapta a kitüntetéseit? -- A Simon Arzt áruházban... -...Az arcokon várakozás, izgalom, ünnepélyesség. Azután nagy csend. -- Åfelsége a király! - jelenti Gomperez hidalgó utóda. -Két tiszt toppan be feszesen. Azután gyors, de határozott, kemény lépések hallatszottak, és megjelenik mosolyogva az uralkodó! A világ legfiatalabb marsallja! A nagy csendben egy izgatott röffenés hallatszik. -- A Vadsuhanc!... -De ezt mintha nem is hallanák. Mindenki Parker admirálist nézi, aki a királyhoz lép. -- Felség! - mondja Å‘szinte örömmel. - Igazán boldog vagyok, hogy üdvözölhetem a birodalmában. -De most nagy zűrzavar támad, mert Anna Alvarez elájul... -3 -Amikor magához tér, fáradt feje egy arany vállrózsán pihen. Senki sincs körülöttük. Csendes kis szalonban vannak. -- Anna - mondta az uralkodó -, remélem, most már nem lesz kifogása a családom ellen... -- Ó... maga... kicsúfolt - feleli dühösen, de a fejét ott felejti a vállrózsán. -- Ha válni akar, mindenesetre kitűnÅ‘ oka van rá. EsküvÅ‘ elÅ‘tt többszörös gyilkosnak mondtam magamat, és utóbb kiderült, hogy megtévesztettem... Nos? Elválik... -Alvarez leánya nem felelt. Úgy látszott, gondolkodik. De a fejét végképp ottfelejtette a vállrózsán, és amíg a döntést mérlegelte, addig Å‘felsége megcsókolta. -Természetesen szokott alaposságával tette ezt. -4 -Piszkos Fred kihallgatáson volt az özvegy királyné magánlakosztályában. -- Ne sírj, Helena. Ez a fiú mindenért kárpótolhat téged is. -- Mennyit szenvedtem... Hiszen a te fiad. Azt hittem, hogy kiütközött belÅ‘le az apja vére. -- Hát vízzé nem vált - mondta öntelt mosollyal Piszkos Fred, a kapitány. - Neki sohasem kell megtudni, hogy nem vérbeli St. Antonio. Minek? -- Mondd... Theodor... Fernandezt te... ölted meg? -- Nem. Az amerikai Titkos Szolgálat egy kapitánya tette. Fernandez megállapodott Warinsszal. Fernandez gyűlölte az idegen vérbÅ‘l befogadott St. Antoniót. Inkább Warinsszal szövetkezett, aki megengedte volna, hogy japánpárti kínaiak számára fegyvert szállítsanak innen. Tehát az amerikai végzett Fernandezzel. -Hallgatnak. -- Isten áldjon, Helena. -- Hová mész, Theodor?... -- A tengerre... -Az asszony lehajtott fejjel a szÅ‘nyeget nézi... -- Megbocsátottál nekem... Theodor? -Csend... A királyné lassan felemeli a fejét, és egyedül van a szobában. Piszkos Fred, a kapitány, szép csendben elment, és nem látta többé soha. - -HUSZONÖTÖDIK FEJEZET -Fülig Jimmy levele az uralkodóhoz -XII -Kelt mint itt Szanfranciszkóban uralkodásunk elmúltával magamkezűleg. -Igen tisztelt kiráj úr, kedves mamája és T. neje Å‘felsége! Mai nappal keltfent levelét vettem és kibontám. -Ezennel felelek tisztelettel értesíteni! -Szíves mekhívására, hogy udvarára telepeggyek nyugodt életre, amit Felség gondtalanít, van szerencsém Å‘szinte sajnálattal. Mer ott nekem nagy strapa a tétlenség. Én városi lakós vagyok, ha nem is bejelentett, ami csak egy üres formalinság. De városi lakos nehezen szokja a vidéket. És egy sziget, akármilyen kicsiny, mégiscsak királyi udvar, tehát nem a nagyvilág. Pedig szívesen emlékszem vissza uralkodásom naccerű idejére, amej felvirágzásba hoszta a országot... És asz sem lepne meg, ha Almirában megöregítenék fénykoromat és a fÅ‘t téren szobrommal találkoznék sétálva. Mer a nép bezárt engem a szívébe, és jó, hogy mégsem kell zacskót ragasztani, amint egyéb bezárás esetén ez fentforog. -Voltam Szingapurban is a klubbokban. Már nem az, ami volt. Vanek lebukott egy lopásból kifolyó rajtaérésbÅ‘l. Azt hiszem jól esne neki, ha felséged írna egy pár sort. Hadd lássa a Vanek, hogy felséged nem felejti el barátait, ha aszok bajba jutnak. Buszkó Mocsink mondta, irjam mek; hogy felséged, ha van mibÅ‘l, megadhatná neki a két és fél dollárt, amit felsékedért Tulipánt nevű közös barátunknak visszafizetett. Mert egy uralkodó nem csinálhat adósságot. Eszt Å‘ monja. Mi uralkodók tudjuk, hogy ez nem igaz. De mikor ült ez a Mócsink egy trónon? -Itt már minden nem a réki. Unalmas és csendes lett. Szegény VelÅ‘ kétoldali pisztolylövésben mekhalt, pedig üzentem neki, hogy a Hobo Fischer kiszabadult. Mondom: unalmas itt minden és csendes, úgyhogy azonnal Honkongba mentem, mert ott sincs semmi dolgom. És az ilyesmit én elintézem. -Jelenleg ugyanebben az ügyben tartózkodom Szanfranciszkóba. -Ha mektenné felsék, én egy Firmin nevű úrban felejtettem a késem. Ott van elásva a gyorsfényképezÅ‘gép mellett. Ha egyszer arra sétál és nincs más államügye fojóba, ássa föl a pasast és vegye ki belÅ‘le a késem. Nem éri meg ez a Firmin. Egy darab kagyló a nyele. Könnyű megismerni. De csak úgy kérem eszt, ha igazán nincs dolga és szívesen csinálja. -Úgy történt esz a haláleset, hogy amikor felségedet ledoptam a földre és rémülten láttam, mit tevék. De idÅ‘m se volt rája éleszteni, amikor megjelent a kisértÅ‘ kapitány. A Wirth. Aki veszette a Nono-Holasztárlulu hajót. -És revolvert foga: -- Itt az idÅ‘ José - mondá. - Elmehet. De most nagyon gyorsan. -- Ki maga? - kérdem hüjén. -- Én Wirth kapitány vagyok. A Titkos Szolgáktól. A kikötÅ‘ben egy motoros várja és elviszi Tahitibe... És Å‘ adott nekem pénct is. (Aszért köszönöm, hogy felséked is küldött. A pénc az egyetlen jó, amibÅ‘l nem árt a sok.) -Amikor elmentem, az útban aszt gondolám, elhozom a fényképemet ettÅ‘l a FirmintÅ‘l. Ahoty odaértem, belestem asz ablakon és mekrémültem. -Ott feküdt a halottarcú öreg nÅ‘, de jól fejbeütve. Aszonban volt neki élete még, mert vizzel öntöztem. -- Uram... - mondta - megölt. Firmin... A részvények... -...Hát kiderülne, hogy asz a Firmin meg az asszony részvényesek voltak Alvarec elnök uralmában. Amikor asz elnököt elkergették a részvények folyama árbaesett. De mekvoltak nekik kettÅ‘jüknek értéktelenül. És múltkor jött Ekmont meg Gombperec fényképezni és közben mondták, hogy az értéktelen részvényt mekveszik tÅ‘lük. Firmin eladta potomért. De az asszony mondá, hogy Å‘ nem adja. Esz emlék. Ãgy hát csak Firminét vitték el. Mire gyött a Pollino fényképeszni, neki nem juta részvén. Eszért él ma is, csak tudná minek? -Az történt elÅ‘zÅ‘leg, hogy Ekmont és a többi gyászoló rokon megtudták Bonifác fogolytól, hogy gyön Alvarez csapatokkal és gyÅ‘z. Nekik majd menekülni kell. Iken ám, de akkor a részvének régi, jó folyamára lesz érvényes megint! És itt megvették a régi részvéneket. -Amikor már Firmin is mektutta, hogy visszajön Alva Rez, akkor maj megÅ‘rült, hoty potomér atta a papirokat. De Ekmont kirugatá. Gombperec dettó. Erre Å‘ megölte Å‘ket, mer tutta, hogy Warinst fogják gyanúsitani a tényállással. Vékül leüté és kirablá részvényeibÅ‘l a halálfejű úrinÅ‘t. -Amikor felálltam a sebesült asszony mellÅ‘l, ez éppen jókor volt. Mer lesujtott rám hátulról esz a Firmin, aki valamiért visszagyött. De már ép felálltam, nem talált. -No asztán következett egy rövid testgyakorlás miután elástam (S.K.) Ãmde benne felejtettem a műszert a fényképészbe. -Ezzel zárom soraimat alanti tisztelettel felségednek régi barátja, ma is és a kedves mama Å‘felségének és az uralkodó Å‘nacsságának kézcsókkal. KeIt most lent: Néhai kollégája: -az eksz Fülig Jimmy, sajátulag. -Almirában ma is szívesen emlékeznek vissza Fülig Jimmyre, az elsÅ‘ uralkodójára a világnak, aki népével pertut ivott. És ma is érvényben ban a "LEX FÜLIG 193... 1. T.c.: A KÜLSÅ MEGJELENÉS KÖTELEZÅ EGYSZERŰSÉGÉRÅL, A KORONATANÃCSBAN", amely szerint harisnyában kell a koronatanácsban részt venni. A Nagy Bivaly ott maradt Almirában mint Å‘felsége testÅ‘re, és igen jó dolga volt. -* -És Piszkos Fred? -Valaki mesélte, hogy nemrég Alaszkában látták, ahol játékbarlangot nyitott az örök hó birodalmában, és állítólag az aranyásók komoly formában foglalkoznak a gondolattal, hogy meglincselik. De mire kivitelre kerül a sor, a kapitány már bizonyára messze jár, mert olyan éles az esze, mint a borotva. -Egyszer híre járt, hogy meghalt, de utóbb kiderült, hogy Å‘ a kapitánya annak az ócska kis gÅ‘zösnek, amely dühöngÅ‘ viharban segítségére sietett a zátonyra futó Tokio-Maru luxusgÅ‘zösnek, és ötven utast megmentett. Ezek késÅ‘bb észrevették, hogy minden értéktárgyuk eltűnt. -Azóta is feltűnik idÅ‘nként Kantonban, Triesztben vagy Rio de Janeiróban; mogorván, egyedül, mint a kikötÅ‘k vándorlásra ítélt Bolygó Hollandija, és csak kevesen tudják, hogy valahol az ócska ruha és a szakadt ing mögött mégiscsak olyan szív dobog, amelyik tudott szeretni, fájni és aggódni is valamikor. -EOT; -} +- Ezt meg \ No newline at end of file diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Person.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Person.php index ca8e7a5c..e70b4507 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Person.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/src/Faker/Provider/no_NO/Person.php @@ -293,13 +293,13 @@ class Person extends \Faker\Provider\Person $birthdate = \Faker\Provider\DateTime::dateTimeThisCentury(); } $datePart = $birthdate->format('dmy'); - + /** * @todo These number should be random based on birth year * @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer */ $randomDigits = (string)static::numerify('##'); - + switch($gender) { case static::GENDER_MALE: $genderDigit = static::randomElement(array(1,3,5,7,9)); @@ -310,16 +310,16 @@ class Person extends \Faker\Provider\Person default: $genderDigit = (string)static::numerify('#'); } - - + + $digits = $datePart.$randomDigits.$genderDigit; - + /** * @todo Calculate modulo 11 of $digits * @link http://no.wikipedia.org/wiki/F%C3%B8dselsnummer */ $checksum = (string)static::numerify('##'); - + return $digits.$checksum; } diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php index 1f7a99ac..91ba4d30 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/BiasedTest.php @@ -10,7 +10,7 @@ class BiasedTest extends \PHPUnit_Framework_TestCase const NUMBERS = 25000; protected $generator; protected $results = array(); - + protected function setUp() { $this->generator = new Generator(); @@ -18,14 +18,14 @@ class BiasedTest extends \PHPUnit_Framework_TestCase $this->results = array_fill(1, self::MAX, 0); } - + public function performFake($function) { for($i = 0; $i < self::NUMBERS; $i++) { $this->results[$this->generator->biasedNumberBetween(1, self::MAX, $function)]++; } } - + public function testUnbiased() { $this->performFake(array('\Faker\Provider\Biased', 'unbiased')); @@ -40,7 +40,7 @@ class BiasedTest extends \PHPUnit_Framework_TestCase $this->assertLessThan(self::NUMBERS * $assumed * 1.05, $amount, "Value was more than 5 percent over the expected value"); } } - + public function testLinearHigh() { $this->performFake(array('\Faker\Provider\Biased', 'linearHigh')); @@ -54,7 +54,7 @@ class BiasedTest extends \PHPUnit_Framework_TestCase $this->assertLessThan(self::NUMBERS * $assumed * 1.1, $amount, "Value was more than 10 percent over the expected value"); } } - + public function testLinearLow() { $this->performFake(array('\Faker\Provider\Biased', 'linearLow')); diff --git a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php index fcd750b1..42e7ddfa 100644 --- a/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php +++ b/samples/development-frameworks/laravel/vendor/fzaninotto/faker/test/Faker/Provider/InternetTest.php @@ -14,7 +14,7 @@ class InternetTest extends \PHPUnit_Framework_TestCase * @var Generator */ private $faker; - + public function setUp() { $faker = new Generator(); @@ -50,7 +50,7 @@ class InternetTest extends \PHPUnit_Framework_TestCase $emailAddress = $this->faker->email(); $this->assertRegExp($pattern, $emailAddress); } - + /** * @requires PHP 5.4 * @dataProvider localeDataProvider diff --git a/samples/development-frameworks/laravel/vendor/laravelcollective/html/src/HtmlBuilder.php b/samples/development-frameworks/laravel/vendor/laravelcollective/html/src/HtmlBuilder.php index 7c4de590..b4829247 100644 --- a/samples/development-frameworks/laravel/vendor/laravelcollective/html/src/HtmlBuilder.php +++ b/samples/development-frameworks/laravel/vendor/laravelcollective/html/src/HtmlBuilder.php @@ -295,9 +295,9 @@ class HtmlBuilder foreach ($list as $key => $value) { $value = (array) $value; - + $html .= "
    $key
    "; - + foreach ($value as $v_key => $v_value) { $html .= "
    $v_value
    "; } diff --git a/samples/development-frameworks/laravel/vendor/league/flysystem/src/Handler.php b/samples/development-frameworks/laravel/vendor/league/flysystem/src/Handler.php index 021dd26a..5a98ecee 100644 --- a/samples/development-frameworks/laravel/vendor/league/flysystem/src/Handler.php +++ b/samples/development-frameworks/laravel/vendor/league/flysystem/src/Handler.php @@ -73,7 +73,7 @@ abstract class Handler return $this; } - + /** * Retrieve the Filesystem object. * diff --git a/samples/development-frameworks/laravel/vendor/mockery/mockery/CONTRIBUTING.md b/samples/development-frameworks/laravel/vendor/mockery/mockery/CONTRIBUTING.md index 9ceb6657..2f4e6bcb 100644 --- a/samples/development-frameworks/laravel/vendor/mockery/mockery/CONTRIBUTING.md +++ b/samples/development-frameworks/laravel/vendor/mockery/mockery/CONTRIBUTING.md @@ -36,7 +36,7 @@ but we'll probably merge any code that looks close enough. * Fork the [repository](https://github.com/padraic/mockery) on GitHub * Add the code for your feature or bug * Add some tests for your feature or bug -* Optionally, but preferably, write some documentation +* Optionally, but preferably, write some documentation * Optionally, update the CHANGELOG.md file with your feature or [BC](http://en.wikipedia.org/wiki/Backward_compatibility) break * If you have created new library files, add them to the root package.xml file for PEAR install support. diff --git a/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/MockInterface.php b/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/MockInterface.php index a5112924..9059bd58 100644 --- a/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/MockInterface.php +++ b/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/MockInterface.php @@ -72,7 +72,7 @@ interface MockInterface * @return Mock */ public function shouldDeferMissing(); - + /** * Set mock to defer unexpected methods to its parent if possible * diff --git a/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php b/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php index 6ea72c9b..02f91fec 100644 --- a/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php +++ b/samples/development-frameworks/laravel/vendor/mockery/mockery/library/Mockery/ReceivedMethodCalls.php @@ -5,7 +5,7 @@ namespace Mockery; class ReceivedMethodCalls { private $methodCalls = array(); - + public function push(MethodCall $methodCall) { $this->methodCalls[] = $methodCall; diff --git a/samples/development-frameworks/laravel/vendor/mockery/mockery/tests/Mockery/ExpectationTest.php b/samples/development-frameworks/laravel/vendor/mockery/mockery/tests/Mockery/ExpectationTest.php index c3c31993..4918467e 100644 --- a/samples/development-frameworks/laravel/vendor/mockery/mockery/tests/Mockery/ExpectationTest.php +++ b/samples/development-frameworks/laravel/vendor/mockery/mockery/tests/Mockery/ExpectationTest.php @@ -123,7 +123,7 @@ class ExpectationTest extends MockeryTestCase $this->mock->foo(); $this->assertEquals('bazzz', $this->mock->bar); } - + public function testSetsPublicPropertiesWhenRequestedMoreTimesThanSetValues() { $this->mock->bar = null; diff --git a/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/CHANGELOG.md b/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/CHANGELOG.md index acae4574..bbd9bec5 100644 --- a/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/CHANGELOG.md +++ b/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/CHANGELOG.md @@ -7,7 +7,7 @@ ## [1.1.0] - 2015-01-26 ### Added -- Support for non-hourly offset timezones +- Support for non-hourly offset timezones - Checks for valid expressions ### Changed - Max Iterations no longer hardcoded for `getRunDate()` diff --git a/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/src/Cron/CronExpression.php b/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/src/Cron/CronExpression.php index 04f75e39..68cc4363 100644 --- a/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/src/Cron/CronExpression.php +++ b/samples/development-frameworks/laravel/vendor/mtdowling/cron-expression/src/Cron/CronExpression.php @@ -164,7 +164,7 @@ class CronExpression public function setMaxIterationCount($maxIterationCount) { $this->maxIterationCount = $maxIterationCount; - + return $this; } diff --git a/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php index 99c4bafe..42c7f612 100644 --- a/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +++ b/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php @@ -20,7 +20,7 @@ class BuilderFactory { /** * Creates a namespace builder. - * + * * @param null|string|Node\Name $name Name of the namespace * * @return Builder\Namespace_ The created namespace builder diff --git a/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php b/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php index efe43333..682195c4 100644 --- a/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php +++ b/samples/development-frameworks/laravel/vendor/nikic/php-parser/lib/PhpParser/Node/FunctionLike.php @@ -22,7 +22,7 @@ interface FunctionLike extends Node /** * Get the declared return type or null - * + * * @return null|string|Node\Name */ public function getReturnType(); diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/CHANGELOG.md b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/CHANGELOG.md index f5f19274..fdd5fa45 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/CHANGELOG.md +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/CHANGELOG.md @@ -2,18 +2,18 @@ * Whitespace and other cosmetic changes * Added a changelog. -* We now ship with a command line utility to build a PHP Archive from the +* We now ship with a command line utility to build a PHP Archive from the command line. - + Every time we publish a new release, we will also upload a .phar to Github. Our public key is signed by our GPG key. ### Version 1.1.6 - 2015-01-29 -* Eliminate `open_basedir` warnings by detecting this configuration setting. +* Eliminate `open_basedir` warnings by detecting this configuration setting. (Thanks [@oucil](https://github.com/oucil) for reporting this.) * Added install instructions to the README. -* Documentation cleanup (there is, in fact, no `MCRYPT_CREATE_IV` constant, I +* Documentation cleanup (there is, in fact, no `MCRYPT_CREATE_IV` constant, I meant to write `MCRYPT_DEV_URANDOM`) ### Version 1.1.5 - 2016-01-06 @@ -39,15 +39,15 @@ Fix a performance issue with `/dev/urandom` buffering. ### Version 1.1.0 - 2015-11-09 -Fix performance issues with ancient versions of PHP on Windows, but dropped +Fix performance issues with ancient versions of PHP on Windows, but dropped support for PHP < 5.4.1 without mcrypt on Windows 7+ in the process. Since this is a BC break, semver dictates a minor version bump. ### Version 1.0.10 - 2015-10-23 -* Avoid a performance killer with OpenSSL on Windows PHP 5.3.0 - 5.3.3 that was +* Avoid a performance killer with OpenSSL on Windows PHP 5.3.0 - 5.3.3 that was affecting [WordPress users](https://core.trac.wordpress.org/ticket/34409). -* Use `$var = null` instead of `unset($var)` to avoid triggering the garbage +* Use `$var = null` instead of `unset($var)` to avoid triggering the garbage collector and slowing things down. ### Version 1.0.9 - 2015-10-20 @@ -56,13 +56,13 @@ There is an outstanding issue `mcrypt_create_iv()` and PHP 7's `random_bytes()` on Windows reported by [@nicolas-grekas](https://github.com/nicolas-grekas) caused by `proc_open()` and environment variable handling (discovered by Appveyor when developing Symfony). -Since the break is consistent, it's not our responsibility to fix it, but we +Since the break is consistent, it's not our responsibility to fix it, but we should fail the same way PHP 7 will (i.e. throw an `Exception` rather than raise an error and then throw an `Exception`). ### Version 1.0.8 - 2015-10-18 -* Fix usability issues with Windows (`new COM('CAPICOM.Utilities.1')` is not +* Fix usability issues with Windows (`new COM('CAPICOM.Utilities.1')` is not always available). * You can now test all the possible drivers by running `phpunit.sh each` in the `tests` directory. @@ -76,32 +76,32 @@ Several large integer handling bugfixes were contributed by [@oittaa](https://gi Don't let the version number fool you, this was a pretty significant change. 1. Added support for ext-libsodium, if it exists on the system. This is morally - equivalent to adding `getrandom(2)` support without having to expose the + equivalent to adding `getrandom(2)` support without having to expose the syscall interface in PHP-land. -2. Relaxed open_basedir restrictions. In previous versions, if open_basedir was - set, PHP wouldn't even try to read from `/dev/urandom`. Now it will still do +2. Relaxed open_basedir restrictions. In previous versions, if open_basedir was + set, PHP wouldn't even try to read from `/dev/urandom`. Now it will still do so if you can. 3. Fixed integer casting inconsistencies between random_compat and PHP 7. 4. Handle edge cases where an integer overflow turns one of the parameters into a float. -One change that we discussed was making `random_bytes()` and `random_int()` -strict typed; meaning you could *only* pass integers to either function. While -most veteran programmers are probably only doing this already (we strongly +One change that we discussed was making `random_bytes()` and `random_int()` +strict typed; meaning you could *only* pass integers to either function. While +most veteran programmers are probably only doing this already (we strongly encourage it), it wouldn't be consistent with how these functions behave in PHP 7. Please use these functions responsibly. -We've had even more of the PHP community involved in this release; the +We've had even more of the PHP community involved in this release; the contributors list has been updated. If I forgot anybody, I promise you it's not -because your contributions (either code or ideas) aren't valued, it's because -I'm a bit overloaded with information at the moment. Please let me know +because your contributions (either code or ideas) aren't valued, it's because +I'm a bit overloaded with information at the moment. Please let me know immediately and I will correct my oversight. -Thanks everyone for helping make random_compat better. +Thanks everyone for helping make random_compat better. ### Version 1.0.5 - 2015-10-08 -Got rid of the methods in the `Throwable` interface, which was causing problems +Got rid of the methods in the `Throwable` interface, which was causing problems on PHP 5.2. While we would normally not care about 5.2 (since [5.4 and earlier are EOL'd](https://secure.php.net/supported-versions.php)), we do want to encourage widespread adoption (e.g. [Wordpress](https://core.trac.wordpress.org/ticket/28633)). @@ -129,7 +129,7 @@ Thanks [@dd32](https://github.com/@dd32) for correcting this oversight. ### Version 1.0.1 - 2015-09-10 -Instead of throwing an Exception immediately on insecure platforms, only do so +Instead of throwing an Exception immediately on insecure platforms, only do so when `random_bytes()` is invoked. ### Version 1.0.0 - 2015-09-07 @@ -137,8 +137,8 @@ when `random_bytes()` is invoked. Our API is now stable and forward-compatible with the CSPRNG features in PHP 7 (as of 7.0.0 RC3). -A lot of great people have contributed their time and expertise to make this -compatibility library possible. That this library has reached a stable release +A lot of great people have contributed their time and expertise to make this +compatibility library possible. That this library has reached a stable release is more a reflection on the community than it is on PIE. We are confident that random_compat will serve as the simplest and most secure @@ -158,7 +158,7 @@ This should be identical to 1.0.0 sans any last-minute changes or performance en ### Version 0.9.5 (pre-release) - 2015-07-31 -* Validate that `/dev/urandom` is a character device +* Validate that `/dev/urandom` is a character device * Reported by [@lokdnet](https://twitter.com/lokdnet) * Investigated by [@narfbg](https://github.com/narfbg) and [frymaster](http://stackoverflow.com/users/1226810/frymaster) on [StackOverflow](http://stackoverflow.com/q/31631066/2224584) * Remove support for `/dev/arandom` which is an old OpenBSD feature, thanks [@jedisct1](https://github.com/jedisct1) @@ -173,7 +173,7 @@ This should be identical to 1.0.0 sans any last-minute changes or performance en ### Version 0.9.3 (pre-release) - 2015-07-22 Unless the Exceptions change to PHP 7 fails, this should be the last pre-release -version. If need be, we'll make one more pre-release version with compatible +version. If need be, we'll make one more pre-release version with compatible behavior. Changes since 0.9.2: @@ -187,7 +187,7 @@ Changes since 0.9.2: * Consolidated `$range > PHP_INT_MAX` logic with `$range <= PHP_INT_MAX` (thanks [@oittaa](https://github.com/oittaa) and [@CodesInChaos](https://github.com/CodesInChaos)) -* `tests/phpunit.sh` now also runs the tests with `mbstring.func_overload` and +* `tests/phpunit.sh` now also runs the tests with `mbstring.func_overload` and `open_basedir` * Style consistency, whitespace cleanup, more meaningful variable names diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/ERRATA.md b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/ERRATA.md index 4990273a..cd0afa60 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/ERRATA.md +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/ERRATA.md @@ -33,8 +33,8 @@ and is not part `libmcrypt`. It actually does the right thing: If we're on Windows and don't have access to `mcrypt`, we use `CAPICOM.Utilities.1`. Finally, we use `openssl_random_pseudo_bytes()` **as a last resort**, due to -[PHP bug #70014](https://bugs.php.net/bug.php?id=70014). Internally, this +[PHP bug #70014](https://bugs.php.net/bug.php?id=70014). Internally, this function calls `RAND_pseudo_bytes()`, which has been [deprecated](https://github.com/paragonie/random_compat/issues/5) by the OpenSSL team. Furthermore, [it might silently return weak random data](https://github.com/paragonie/random_compat/issues/6#issuecomment-119564973) -if it is called before OpenSSL's **userspace** CSPRNG is seeded. Also, +if it is called before OpenSSL's **userspace** CSPRNG is seeded. Also, [you want the OS CSPRNG, not a userspace CSPRNG](http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/). diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/README.md b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/README.md index 80560862..f640ac64 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/README.md +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/README.md @@ -12,14 +12,14 @@ consider issues relevant to [supported PHP versions](https://secure.php.net/supp ## Important -Although this library has been examined by some security experts in the PHP -community, there will always be a chance that we overlooked something. Please +Although this library has been examined by some security experts in the PHP +community, there will always be a chance that we overlooked something. Please ask your favorite trusted hackers to hammer it for implementation errors and bugs before even thinking about deploying it in production. **Do not use the master branch, use a [stable release](https://github.com/paragonie/random_compat/releases/latest).** -For the background of this library, please refer to our blog post on +For the background of this library, please refer to our blog post on [Generating Random Integers and Strings in PHP](https://paragonie.com/blog/2015/07/how-safely-generate-random-strings-and-integers-in-php). ### Usability Notice @@ -36,11 +36,11 @@ to a newer version of PHP immediately. **Signed PHP Archive:** -As of version 1.2.0, we also ship an ECDSA-signed PHP Archive with each stable +As of version 1.2.0, we also ship an ECDSA-signed PHP Archive with each stable release on Github. 1. Download [the `.phar`, `.phar.pubkey`, and `.phar.pubkey.asc`](https://github.com/paragonie/random_compat/releases/latest) files. -2. (**Recommended** but not required) Verify the PGP signature of `.phar.pubkey` +2. (**Recommended** but not required) Verify the PGP signature of `.phar.pubkey` (contained within the `.asc` file) using the [PGP public key for Paragon Initiative Enterprises](https://paragonie.com/static/gpg-public-key.txt). 3. Extract both `.phar` and `.phar.pubkey` files to the same directory. 4. `require_once "/path/to/random_compat.phar";` @@ -65,7 +65,7 @@ try { $string = random_bytes(32); } catch (TypeError $e) { // Well, it's an integer, so this IS unexpected. - die("An unexpected error has occurred"); + die("An unexpected error has occurred"); } catch (Error $e) { // This is also unexpected because 32 is a reasonable integer. die("An unexpected error has occurred"); @@ -86,7 +86,7 @@ try { } catch (TypeError $e) { // Well, it's an integer, so this IS unexpected. - die("An unexpected error has occurred"); + die("An unexpected error has occurred"); } catch (Error $e) { // This is also unexpected because 0 and 255 are both reasonable integers. die("An unexpected error has occurred"); @@ -138,7 +138,7 @@ try { ## Contributors -This project would not be anywhere near as excellent as it is today if it +This project would not be anywhere near as excellent as it is today if it weren't for the contributions of the following individuals: * [@AndrewCarterUK (Andrew Carter)](https://github.com/AndrewCarterUK) diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/SECURITY.md b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/SECURITY.md index 8f731b38..df7bd669 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/SECURITY.md +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/SECURITY.md @@ -1,16 +1,16 @@ # An Invitation to Security Researchers -Every company says they take security "very seriously." Rather than bore anyone +Every company says they take security "very seriously." Rather than bore anyone with banal boilerplate, here are some quick answers followed by detailed elaboration. If you have any questions about our policies, please email them to `scott@paragonie.com`. ## Quick Answers -* There is no compulsion to disclose vulnerabilities privately, but we +* There is no compulsion to disclose vulnerabilities privately, but we appreciate a head's up. -* `security@paragonie.com` will get your reports to the right person. Our GPG - fingerprint, should you decide to encrypt your report, is +* `security@paragonie.com` will get your reports to the right person. Our GPG + fingerprint, should you decide to encrypt your report, is `7F52 D5C6 1D12 55C7 3136 2E82 6B97 A1C2 8264 04DA`. * **YES**, we will reward security researchers who disclose vulnerabilities in @@ -22,15 +22,15 @@ elaboration. If you have any questions about our policies, please email them to ### There is no compulsion to disclose privately. We believe vulnerability disclosure style is a personal choice and enjoy working -with a diverse community. We understand and appreciate the importance of Full +with a diverse community. We understand and appreciate the importance of Full Disclosure in the history and practice of security research. We would *like* to know about high-severity bugs before they become public -knowledge, so we can fix them in a timely manner, but **we do not believe in +knowledge, so we can fix them in a timely manner, but **we do not believe in threatening researchers or trying to enforce vulnerability embargoes**. Ultimately, if you discover a security-affecting vulnerability, what you do with -it is your choice. We would like to work with people, and to celebrate and +it is your choice. We would like to work with people, and to celebrate and reward their skill, experience, and dedication. We appreciate being informed of our mistakes so we can learn from them and build a better product. Our goal is to empower the community. @@ -75,7 +75,7 @@ ha+F/SAEJ0jEquM4TfKWWU2S5V5vgPPpIQSYRnhQW4b1 ### We Will Reward Security Researchers -**This process has not been formalized; nor have dollar amounts been +**This process has not been formalized; nor have dollar amounts been discussed.** However, if you report a valid security-affecting bug, we will compensate you @@ -98,8 +98,8 @@ When in doubt, our policy is to err on the side of generosity. ### No Proof-of-Concept Required -We might ask for one if we feel we do not understand some of the details -pertaining to a specific vulnerability. We certainly appreciate them if you +We might ask for one if we feel we do not understand some of the details +pertaining to a specific vulnerability. We certainly appreciate them if you include them in your report, but we believe **the burden lies with the developer to prove their software *is* secure** rather than with the researcher to prove that it isn't. diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/cast_to_int.php b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/cast_to_int.php index f441c5d9..7921a576 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/cast_to_int.php +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/cast_to_int.php @@ -27,19 +27,19 @@ */ if (!function_exists('RandomCompat_intval')) { - + /** * Cast to an integer if we can, safely. - * + * * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX) * (non-inclusive), it will sanely cast it to an int. If you it's equal to - * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats + * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats * lose precision, so the <= and => operators might accidentally let a float * through. - * + * * @param int|float $number The number we want to convert to an int * @param boolean $fail_open Set to true to not throw an exception - * + * * @return int (or float if $fail_open) * * @throws TypeError diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/error_polyfill.php b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/error_polyfill.php index 57cfefdc..ab3de620 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/error_polyfill.php +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/error_polyfill.php @@ -1,22 +1,22 @@ 0); - + /** * Is our result valid? */ diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php index f802d4e1..d658f925 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php @@ -1,22 +1,22 @@ operators might accidentally let a float * through. */ - + try { $min = RandomCompat_intval($min); } catch (TypeError $ex) { @@ -63,7 +63,7 @@ function random_int($min, $max) 'random_int(): $max must be an integer' ); } - + /** * Now that we've verified our weak typing system has given us an integer, * let's validate the logic then we can move forward with generating random @@ -81,7 +81,7 @@ function random_int($min, $max) /** * Initialize variables to 0 - * + * * We want to store: * $bytes => the number of random bytes we need * $mask => an integer bitmask (for use with the &) operator @@ -104,11 +104,11 @@ function random_int($min, $max) /** * Still safely calculate wider ranges. * Provided by @CodesInChaos, @oittaa - * + * * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 - * + * * We use ~0 as a mask in this case because it generates all 1s - * + * * @ref https://eval.in/400356 (32-bit) * @ref http://3v4l.org/XX9r5 (64-bit) */ @@ -118,7 +118,7 @@ function random_int($min, $max) } else { /** - * $bits is effectively ceil(log($range, 2)) without dealing with + * $bits is effectively ceil(log($range, 2)) without dealing with * type juggling */ while ($range > 0) { @@ -159,10 +159,10 @@ function random_int($min, $max) /** * Let's turn $randomByteString into an integer - * + * * This uses bitwise operators (<< and |) to build an integer * out of the values extracted from ord() - * + * * Example: [9F] | [6D] | [32] | [0C] => * 159 + 27904 + 3276800 + 201326592 => * 204631455 diff --git a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/other/build_phar.php b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/other/build_phar.php index 70ef4b2e..ac41ecb2 100644 --- a/samples/development-frameworks/laravel/vendor/paragonie/random_compat/other/build_phar.php +++ b/samples/development-frameworks/laravel/vendor/paragonie/random_compat/other/build_phar.php @@ -12,19 +12,19 @@ $phar = new Phar( 'random_compat.phar' ); rename( - dirname(__DIR__).'/lib/random.php', + dirname(__DIR__).'/lib/random.php', dirname(__DIR__).'/lib/index.php' ); $phar->buildFromDirectory(dirname(__DIR__).'/lib'); rename( - dirname(__DIR__).'/lib/index.php', + dirname(__DIR__).'/lib/index.php', dirname(__DIR__).'/lib/random.php' ); /** * If we pass an (optional) path to a private key as a second argument, we will * sign the Phar with OpenSSL. - * + * * If you leave this out, it will produce an unsigned .phar! */ if ($argc > 1) { @@ -33,13 +33,13 @@ if ($argc > 1) { exit(255); } $pkeyFile = file_get_contents($argv[1]); - + $private = openssl_get_privatekey($pkeyFile); if ($private !== false) { $pkey = ''; openssl_pkey_export($private, $pkey); $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey); - + /** * Save the corresponding public key to the file */ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php index 02968b16..8682c55c 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php @@ -247,10 +247,10 @@ class DocBlock implements \Reflector /** * Gets the text portion of the doc block. - * + * * Gets the text portion (short and long description combined) of the doc * block. - * + * * @return string The text portion of the doc block. */ public function getText() @@ -267,12 +267,12 @@ class DocBlock implements \Reflector /** * Set the text portion of the doc block. - * + * * Sets the text portion (short and long description combined) of the doc * block. * * @param string $docblock The new text portion of the doc block. - * + * * @return $this This doc block. */ public function setText($comment) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php index 81aa83ce..2b2301a5 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php @@ -26,10 +26,10 @@ class Context /** @var array List of namespace aliases => Fully Qualified Namespace. */ protected $namespace_aliases = array(); - + /** @var string Name of the structural element, within the namespace. */ protected $lsen = ''; - + /** * Cteates a new context. * @param string $namespace The namespace where this DocBlock @@ -66,26 +66,26 @@ class Context { return $this->namespace_aliases; } - + /** * Returns the Local Structural Element Name. - * + * * @return string Name of the structural element, within the namespace. */ public function getLSEN() { return $this->lsen; } - + /** * Sets a new namespace. - * + * * Sets a new namespace for the context. Leading and trailing slashes are * trimmed, and the keywords "global" and "default" are treated as aliases * to no namespace. - * + * * @param string $namespace The new namespace to set. - * + * * @return $this */ public function setNamespace($namespace) @@ -100,13 +100,13 @@ class Context } return $this; } - + /** * Sets the namespace aliases, replacing all previous ones. - * + * * @param array $namespace_aliases List of namespace aliases => Fully * Qualified Namespace. - * + * * @return $this */ public function setNamespaceAliases(array $namespace_aliases) @@ -117,16 +117,16 @@ class Context } return $this; } - + /** * Adds a namespace alias to the context. - * + * * @param string $alias The alias name (the part after "as", or the last * part of the Fully Qualified Namespace Name) to add. * @param string $fqnn The Fully Qualified Namespace Name for this alias. * Any form of leading/trailing slashes are accepted, but what will be * stored is a name, prefixed with a slash, and no trailing slash. - * + * * @return $this */ public function setNamespaceAlias($alias, $fqnn) @@ -134,16 +134,16 @@ class Context $this->namespace_aliases[$alias] = '\\' . trim((string)$fqnn, '\\'); return $this; } - + /** * Sets a new Local Structural Element Name. - * + * * Sets a new Local Structural Element Name. A local name also contains * punctuation determining the kind of structural element (e.g. trailing "(" * and ")" for functions and methods). - * + * * @param string $lsen The new local name of a structural element. - * + * * @return $this */ public function setLSEN($lsen) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php index 966ed44d..51a1a898 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php @@ -26,7 +26,7 @@ class Location /** @var int Column where the DocBlock text starts. */ protected $columnNumber = 0; - + public function __construct( $lineNumber = 0, $columnNumber = 0 @@ -43,7 +43,7 @@ class Location } /** - * + * * @param type $lineNumber * @return $this */ @@ -63,7 +63,7 @@ class Location } /** - * + * * @param int $columnNumber * @return $this */ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php index c1617850..91c310f2 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php @@ -60,9 +60,9 @@ class Serializer /** * Sets the string to indent comments with. - * + * * @param string $indentationString The string to indent comments with. - * + * * @return $this This serializer object. */ public function setIndentationString($indentString) @@ -73,7 +73,7 @@ class Serializer /** * Gets the string to indent comments with. - * + * * @return string The indent string. */ public function getIndentationString() @@ -83,9 +83,9 @@ class Serializer /** * Sets the number of indents. - * + * * @param int $indent The number of times the indent string is repeated. - * + * * @return $this This serializer object. */ public function setIndent($indent) @@ -96,7 +96,7 @@ class Serializer /** * Gets the number of indents. - * + * * @return int The number of times the indent string is repeated. */ public function getIndent() @@ -106,12 +106,12 @@ class Serializer /** * Sets whether or not the first line should be indented. - * + * * Sets whether or not the first line (the one with the "/**") should be * indented. - * + * * @param bool $indentFirstLine The new value for this setting. - * + * * @return $this This serializer object. */ public function setIsFirstLineIndented($indentFirstLine) @@ -122,7 +122,7 @@ class Serializer /** * Gets whether or not the first line should be indented. - * + * * @return bool Whether or not the first line should be indented. */ public function isFirstLineIndented() @@ -132,13 +132,13 @@ class Serializer /** * Sets the line length. - * + * * Sets the length of each line in the serialization. Content will be * wrapped within this limit. - * + * * @param int|null $lineLength The length of each line. NULL to disable line * wrapping altogether. - * + * * @return $this This serializer object. */ public function setLineLength($lineLength) @@ -149,7 +149,7 @@ class Serializer /** * Gets the line length. - * + * * @return int|null The length of each line or NULL if line wrapping is * disabled. */ @@ -162,7 +162,7 @@ class Serializer * Generate a DocBlock comment. * * @param DocBlock The DocBlock to serialize. - * + * * @return string The serialized doc block. */ public function getDocComment(DocBlock $docblock) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php index a96db095..fa268baa 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php @@ -51,7 +51,7 @@ class Tag implements \Reflector /** @var DocBlock The DocBlock which this tag belongs to. */ protected $docblock = null; - + /** * @var array An array with a tag as a key, and an FQCN to a class that * handles it as an array value. The class is expected to inherit this @@ -148,16 +148,16 @@ class Tag implements \Reflector /** * Registers a handler for tags. - * + * * Registers a handler for tags. The class specified is autoloaded if it's * not available. It must inherit from this class. - * + * * @param string $tag Name of tag to regiser a handler for. When * registering a namespaced tag, the full name, along with a prefixing * slash MUST be provided. * @param string|null $handler FQCN of handler. Specifing NULL removes the * handler for the specified tag, if any. - * + * * @return bool TRUE on success, FALSE on failure. */ final public static function registerTagHandler($tag, $handler) @@ -214,9 +214,9 @@ class Tag implements \Reflector /** * Sets the name of this tag. - * + * * @param string $name The new name of this tag. - * + * * @return $this * @throws \InvalidArgumentException When an invalid tag name is provided. */ @@ -249,9 +249,9 @@ class Tag implements \Reflector /** * Sets the content of this tag. - * + * * @param string $content The new content of this tag. - * + * * @return $this */ public function setContent($content) @@ -274,9 +274,9 @@ class Tag implements \Reflector /** * Sets the description component of this tag. - * + * * @param string $description The new description component of this tag. - * + * * @return $this */ public function setDescription($description) @@ -290,7 +290,7 @@ class Tag implements \Reflector /** * Gets the parsed text of this description. - * + * * @return array An array of strings and tag objects, in the order they * occur within the description. */ @@ -305,7 +305,7 @@ class Tag implements \Reflector /** * Gets the docblock this tag belongs to. - * + * * @return DocBlock The docblock this tag belongs to. */ public function getDocBlock() @@ -315,10 +315,10 @@ class Tag implements \Reflector /** * Sets the docblock this tag belongs to. - * + * * @param DocBlock $docblock The new docblock this tag belongs to. Setting * NULL removes any association. - * + * * @return $this */ public function setDocBlock(DocBlock $docblock = null) @@ -337,12 +337,12 @@ class Tag implements \Reflector { return $this->location; } - + /** * Sets the location of the tag. - * + * * @param Location $location The new location of the tag. - * + * * @return $this */ public function setLocation(Location $location = null) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php index bacf52eb..bc0b1089 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php @@ -38,7 +38,7 @@ class AuthorTag extends Tag /** @var string The email of the author */ protected $authorEmail = ''; - + public function getContent() { if (null === $this->content) { @@ -75,20 +75,20 @@ class AuthorTag extends Tag /** * Gets the author's name. - * + * * @return string The author's name. */ public function getAuthorName() { return $this->authorName; } - + /** * Sets the author's name. - * + * * @param string $authorName The new author name. * An invalid value will set an empty string. - * + * * @return $this */ public function setAuthorName($authorName) @@ -103,20 +103,20 @@ class AuthorTag extends Tag /** * Gets the author's email. - * + * * @return string The author's email. */ public function getAuthorEmail() { return $this->authorEmail; } - + /** * Sets the author's email. - * + * * @param string $authorEmail The new author email. * An invalid value will set an empty string. - * + * * @return $this */ public function setAuthorEmail($authorEmail) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php index 0e163ea0..9db84b21 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php @@ -23,7 +23,7 @@ use phpDocumentor\Reflection\DocBlock\Tag; */ class ExampleTag extends SourceTag { - /** + /** * @var string Path to a file to use as an example. * May also be an absolute URI. */ @@ -110,12 +110,12 @@ class ExampleTag extends SourceTag { return $this->filePath; } - + /** * Sets the file path. - * + * * @param string $filePath The new file path to use for the example. - * + * * @return $this */ public function setFilePath($filePath) @@ -126,15 +126,15 @@ class ExampleTag extends SourceTag $this->content = null; return $this; } - + /** * Sets the file path as an URI. - * + * * This function is equivalent to {@link setFilePath()}, except that it * convers an URI to a file path before that. - * + * * There is no getFileURI(), as {@link getFilePath()} is compatible. - * + * * @param type $uri The new file URI to use as an example. */ public function setFileURI($uri) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php index 7a5ce790..6458c3b8 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php @@ -29,7 +29,7 @@ class MethodTag extends ReturnTag /** @var string */ protected $arguments = ''; - + /** @var bool */ protected $isStatic = false; @@ -180,10 +180,10 @@ class MethodTag extends ReturnTag return $arguments; } - + /** * Checks whether the method tag describes a static method or not. - * + * * @return bool TRUE if the method declaration is for a static method, FALSE * otherwise. */ @@ -191,12 +191,12 @@ class MethodTag extends ReturnTag { return $this->isStatic; } - + /** * Sets a new value for whether the method is static or not. - * + * * @param bool $isStatic The new value to set. - * + * * @return $this */ public function setIsStatic($isStatic) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php index 9293db92..48079069 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php @@ -26,7 +26,7 @@ class ReturnTag extends Tag { /** @var string The raw type component. */ protected $type = ''; - + /** @var Collection The parsed type component. */ protected $types = null; @@ -83,7 +83,7 @@ class ReturnTag extends Tag /** * Returns the type collection. - * + * * @return void */ protected function getTypesCollection() diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php index 4f5f22ce..a682cef8 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php @@ -66,9 +66,9 @@ class SeeTag extends Tag /** * Sets the structural element this tag refers to. - * + * * @param string $refers The new type this tag refers to. - * + * * @return $this */ public function setReference($refers) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php index 3400220e..f5316580 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php @@ -29,7 +29,7 @@ class SourceTag extends Tag */ protected $startingLine = 1; - /** + /** * @var int|null The number of lines, relative to the starting line. NULL * means "to the end". */ @@ -94,10 +94,10 @@ class SourceTag extends Tag /** * Sets the starting line. - * + * * @param int $startingLine The new starting line, relative to the * structural element's location. - * + * * @return $this */ public function setStartingLine($startingLine) @@ -121,10 +121,10 @@ class SourceTag extends Tag /** * Sets the number of lines. - * + * * @param int|null $lineCount The new number of lines, relative to the * starting line. NULL means "to the end". - * + * * @return $this */ public function setLineCount($lineCount) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php index 260f6984..ba023c88 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php @@ -41,7 +41,7 @@ class VersionTag extends Tag /** @var string The version vector. */ protected $version = ''; - + public function getContent() { if (null === $this->content) { @@ -86,13 +86,13 @@ class VersionTag extends Tag { return $this->version; } - + /** * Sets the version section of the tag. - * + * * @param string $version The new version section of the tag. * An invalid value will set an empty string. - * + * * @return $this */ public function setVersion($version) diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php index 90ead3ff..024e886e 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php @@ -114,10 +114,10 @@ class Collection extends \ArrayObject } } } - + /** * Returns a string representation of the collection. - * + * * @return string The resolved types across the collection, separated with * {@link self::OPERATOR_OR}. */ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php index ff257aa1..faca75b0 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php index 7a75e79c..180d2786 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php index 519a61b3..3910bf5b 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php index 0c64ed08..238e7a46 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php index efc3a15b..4307e452 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php @@ -1,7 +1,7 @@ @@ -33,7 +33,7 @@ class MethodTagTest extends \PHPUnit_Framework_TestCase * @param bool $paramCount Number of parameters in the signature. * @param string $description The short description mentioned in the * signature. - * + * * @covers \phpDocumentor\Reflection\DocBlock\Tag\MethodTag * @dataProvider getTestSignatures * diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php index 0e05382f..1b3e431c 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php index 9e2aec0d..28f46a47 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php index 6829b046..ae50e184 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php index 8caf25d1..6b112a47 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php index 2a40e0aa..e540fa0a 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php index 3c669d55..e13d300e 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php index 45868d73..8c59d2d8 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php index 9ae2aa5f..0fdec302 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php index e145386d..616638a0 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php @@ -1,7 +1,7 @@ diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php index 9e873ecb..d91aba4f 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php @@ -1,7 +1,7 @@ @@ -25,10 +25,10 @@ use phpDocumentor\Reflection\DocBlock\Context; */ class TagTest extends \PHPUnit_Framework_TestCase { - + /** * @expectedException \InvalidArgumentException - * + * * @return void */ public function testInvalidTagLine() @@ -38,7 +38,7 @@ class TagTest extends \PHPUnit_Framework_TestCase /** * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * + * * @return void */ public function testTagHandlerUnregistration() @@ -71,7 +71,7 @@ class TagTest extends \PHPUnit_Framework_TestCase /** * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * + * * @return void */ public function testTagHandlerCorrectRegistration() @@ -115,12 +115,12 @@ TAG_HANDLER $this->assertTrue(Tag::registerTagHandler('var', $currentHandler)); } - + /** * @depends testTagHandlerCorrectRegistration * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance - * + * * @return void */ public function testNamespacedTagHandlerCorrectRegistration() @@ -159,12 +159,12 @@ TAG_HANDLER Tag::registerTagHandler('\MyNamespace\MyTag', null) ); } - + /** * @depends testTagHandlerCorrectRegistration * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance - * + * * @return void */ public function testNamespacedTagHandlerIncorrectRegistration() @@ -202,7 +202,7 @@ TAG_HANDLER /** * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * + * * @return void */ public function testNonExistentTagHandlerRegistration() @@ -233,7 +233,7 @@ TAG_HANDLER /** * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * + * * @return void */ public function testIncompatibleTagHandlerRegistration() diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php index 78c7306d..20c47c4a 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php @@ -1,7 +1,7 @@ @@ -16,7 +16,7 @@ use phpDocumentor\Reflection\DocBlock\Context; /** * Test class for \phpDocumentor\Reflection\DocBlock\Type\Collection - * + * * @covers phpDocumentor\Reflection\DocBlock\Type\Collection * * @author Mike van Riel @@ -29,7 +29,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase /** * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::getContext - * + * * @return void */ public function testConstruct() @@ -42,7 +42,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase /** * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct - * + * * @return void */ public function testConstructWithTypes() @@ -53,7 +53,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase /** * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct - * + * * @return void */ public function testConstructWithNamespace() @@ -70,7 +70,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase /** * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct - * + * * @return void */ public function testConstructWithNamespaceAliases() @@ -89,7 +89,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase * * @dataProvider provideTypesToExpand * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add - * + * * @return void */ public function testAdd($fixture, $expected) @@ -109,7 +109,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase * * @dataProvider provideTypesToExpandWithoutNamespace * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add - * + * * @return void */ public function testAddWithoutNamespace($fixture, $expected) @@ -126,7 +126,7 @@ class CollectionTest extends \PHPUnit_Framework_TestCase /** * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add * @expectedException InvalidArgumentException - * + * * @return void */ public function testAddWithInvalidArgument() diff --git a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php index 30eedfc5..3385c35f 100644 --- a/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php +++ b/samples/development-frameworks/laravel/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php @@ -28,7 +28,7 @@ class DocBlockTest extends \PHPUnit_Framework_TestCase { /** * @covers \phpDocumentor\Reflection\DocBlock - * + * * @return void */ public function testConstruct() @@ -60,7 +60,7 @@ DOCBLOCK; $this->assertTrue($object->hasTag('see')); $this->assertTrue($object->hasTag('return')); $this->assertFalse($object->hasTag('category')); - + $this->assertSame('MyNamespace', $object->getContext()->getNamespace()); $this->assertSame( array('PHPDoc' => '\phpDocumentor'), @@ -128,7 +128,7 @@ DOCBLOCK; /** * @covers \phpDocumentor\Reflection\DocBlock::cleanInput - * + * * @return void */ public function testConstructOneLiner() @@ -145,7 +145,7 @@ DOCBLOCK; /** * @covers \phpDocumentor\Reflection\DocBlock::__construct - * + * * @return void */ public function testConstructFromReflector() @@ -166,7 +166,7 @@ DOCBLOCK; /** * @expectedException \InvalidArgumentException - * + * * @return void */ public function testExceptionOnInvalidObject() @@ -198,7 +198,7 @@ DOCBLOCK; /** * @covers \phpDocumentor\Reflection\DocBlock::parseTags * @expectedException \LogicException - * + * * @return void */ public function testInvalidTagBlock() @@ -218,7 +218,7 @@ class MyReflectionDocBlock extends \phpDocumentor\Reflection\DocBlock { DOCBLOCK_EXTENSION ); new \MyReflectionDocBlock(''); - + } public function testTagCaseSensitivity() @@ -263,7 +263,7 @@ DOCBLOCK; /** * @depends testConstructFromReflector * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName - * + * * @return void */ public function testGetTagsByNameZeroAndOneMatch() @@ -276,7 +276,7 @@ DOCBLOCK; /** * @depends testConstructWithTagsOnly * @covers \phpDocumentor\Reflection\DocBlock::parseTags - * + * * @return void */ public function testParseMultilineTag() @@ -294,7 +294,7 @@ DOCBLOCK; /** * @depends testConstructWithTagsOnly * @covers \phpDocumentor\Reflection\DocBlock::parseTags - * + * * @return void */ public function testParseMultilineTagWithLineBreaks() @@ -317,7 +317,7 @@ DOCBLOCK; /** * @depends testConstructWithTagsOnly * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName - * + * * @return void */ public function testGetTagsByNameMultipleMatch() diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/README b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/README index f596115f..7dde6bbb 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/README +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/README @@ -32,8 +32,8 @@ License (BSD License) --------------------- Copyright (c) 2009 Chris Boulton All rights reserved. - -Redistribution and use in source and binary forms, with or without + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, @@ -41,18 +41,18 @@ modification, are permitted provided that the following conditions are met: - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - Neither the name of the Chris Boulton nor the names of its contributors - may be used to endorse or promote products derived from this software + - Neither the name of the Chris Boulton nor the names of its contributors + may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff.php b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff.php index d6cecb79..2331358b 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff.php @@ -8,10 +8,10 @@ * PHP version 5 * * Copyright (c) 2009 Chris Boulton - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, @@ -19,20 +19,20 @@ * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - Neither the name of the Chris Boulton nor the names of its contributors - * may be used to endorse or promote products derived from this software + * - Neither the name of the Chris Boulton nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package Diff diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Abstract.php b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Abstract.php index f63c3e7f..5f76323e 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Abstract.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Abstract.php @@ -5,10 +5,10 @@ * PHP version 5 * * Copyright (c) 2009 Chris Boulton - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, @@ -16,20 +16,20 @@ * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - Neither the name of the Chris Boulton nor the names of its contributors - * may be used to endorse or promote products derived from this software + * - Neither the name of the Chris Boulton nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Array.php b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Array.php index 7113a174..da4f942a 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Array.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Array.php @@ -5,10 +5,10 @@ * PHP version 5 * * Copyright (c) 2009 Chris Boulton - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, @@ -16,20 +16,20 @@ * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - Neither the name of the Chris Boulton nor the names of its contributors - * may be used to endorse or promote products derived from this software + * - Neither the name of the Chris Boulton nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Inline.php b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Inline.php index 60e8005a..788eb0ee 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Inline.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/Inline.php @@ -5,10 +5,10 @@ * PHP version 5 * * Copyright (c) 2009 Chris Boulton - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, @@ -16,20 +16,20 @@ * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - Neither the name of the Chris Boulton nor the names of its contributors - * may be used to endorse or promote products derived from this software + * - Neither the name of the Chris Boulton nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/SideBySide.php b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/SideBySide.php index 307af1c3..a8c52d26 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/SideBySide.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Html/SideBySide.php @@ -5,10 +5,10 @@ * PHP version 5 * * Copyright (c) 2009 Chris Boulton - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, @@ -16,20 +16,20 @@ * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - Neither the name of the Chris Boulton nor the names of its contributors - * may be used to endorse or promote products derived from this software + * - Neither the name of the Chris Boulton nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Context.php b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Context.php index 1200b01c..f5267600 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Context.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Context.php @@ -5,10 +5,10 @@ * PHP version 5 * * Copyright (c) 2009 Chris Boulton - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, @@ -16,20 +16,20 @@ * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - Neither the name of the Chris Boulton nor the names of its contributors - * may be used to endorse or promote products derived from this software + * - Neither the name of the Chris Boulton nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib diff --git a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Unified.php b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Unified.php index e94d951d..e00567b7 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Unified.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/php-diff/lib/Diff/Renderer/Text/Unified.php @@ -5,10 +5,10 @@ * PHP version 5 * * Copyright (c) 2009 Chris Boulton - * + * * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without + * + * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, @@ -16,20 +16,20 @@ * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * - Neither the name of the Chris Boulton nor the names of its contributors - * may be used to endorse or promote products derived from this software + * - Neither the name of the Chris Boulton nor the names of its contributors + * may be used to endorse or promote products derived from this software * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib diff --git a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/CHANGES.md b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/CHANGES.md index 6c75fe4f..142c9a48 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/CHANGES.md +++ b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/CHANGES.md @@ -1,7 +1,7 @@ 2.4.1 / 2016/01/01 ================== -* Correctly handle nested class definitions +* Correctly handle nested class definitions * Correctly handle anonymous functions in code generation * Fixed rerunning on Windows platform * Fixed code generation on Windows platform @@ -36,7 +36,7 @@ * Specs can now be run by specifying a fully qualified class name * New shouldContain matcher for strings * Warning added when trying to typehint scalars or callable in spec -* No longer truncates strings when diffing arrays in verbose mode +* No longer truncates strings when diffing arrays in verbose mode * New %resource_name% placeholder for generated specs * Fixed case error in class name that triggered strictness warnings on some platforms * Fixed undefined index error in some versions of Windows diff --git a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/README.rst b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/README.rst index 5300eb9e..d88e4da8 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/README.rst +++ b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/README.rst @@ -10,7 +10,7 @@ The main website with documentation is at `http://www.phpspec.net shouldBeAnInstanceOf('NoCodeGeneration\NewClass'); } } @@ -44,7 +44,7 @@ Feature: Developer chooses no code generation class NewClassSpec extends ObjectBehavior { function it_is_initializable() - { + { $this->shouldBeAnInstanceOf('NoCodeGeneration\NewClass'); } } @@ -71,7 +71,7 @@ Feature: Developer chooses no code generation class NewClassSpec extends ObjectBehavior { function it_is_initializable() - { + { $this->shouldBeAnInstanceOf('NoCodeGeneration\NewClass'); } } diff --git a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/spec/PhpSpec/Util/MethodAnalyserSpec.php b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/spec/PhpSpec/Util/MethodAnalyserSpec.php index 23bfe301..47558040 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/spec/PhpSpec/Util/MethodAnalyserSpec.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/spec/PhpSpec/Util/MethodAnalyserSpec.php @@ -46,7 +46,7 @@ class MethodAnalyserSpec extends ObjectBehavior $this->methodIsEmpty('spec\PhpSpec\Util\ExampleObjectUsingTrait', 'emptyMethodInTrait')->shouldReturn(true); $this->methodIsEmpty('spec\PhpSpec\Util\ExampleObjectUsingTrait', 'nonEmptyMethodInTrait')->shouldReturn(false); } - + function it_finds_the_real_declaring_class_of_a_method() { if (version_compare(PHP_VERSION, '5.4.0', '<')) { diff --git a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSpecificationEnds.html b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSpecificationEnds.html index 667a06f2..e660261f 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSpecificationEnds.html +++ b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSpecificationEnds.html @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSummary.html b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSummary.html index e2b68a17..9993cc27 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSummary.html +++ b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Formatter/Html/Template/ReportSummary.html @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Locator/PSR0/PSR0Locator.php b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Locator/PSR0/PSR0Locator.php index f61fdb69..21ba04f4 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Locator/PSR0/PSR0Locator.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/phpspec/src/PhpSpec/Locator/PSR0/PSR0Locator.php @@ -282,7 +282,7 @@ class PSR0Locator implements ResourceLocatorInterface /** * @param $path - * + * * @return null|string */ private function findSpecClassname($path) diff --git a/samples/development-frameworks/laravel/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php b/samples/development-frameworks/laravel/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php index 49bd9f59..3f6af480 100644 --- a/samples/development-frameworks/laravel/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php +++ b/samples/development-frameworks/laravel/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php @@ -41,7 +41,7 @@ class MethodNodeSpec extends ObjectBehavior { $this->setReturnsReference(); $this->returnsReference()->shouldReturn(true); - } + } function it_should_be_settable_as_static_through_setter() { diff --git a/samples/development-frameworks/laravel/vendor/phpunit/phpunit-mock-objects/CONTRIBUTING.md b/samples/development-frameworks/laravel/vendor/phpunit/phpunit-mock-objects/CONTRIBUTING.md index b2905398..6f6ef344 100644 --- a/samples/development-frameworks/laravel/vendor/phpunit/phpunit-mock-objects/CONTRIBUTING.md +++ b/samples/development-frameworks/laravel/vendor/phpunit/phpunit-mock-objects/CONTRIBUTING.md @@ -1,4 +1,4 @@ -Pull Requests for bug fixes should be made against the current release branch (1.2). +Pull Requests for bug fixes should be made against the current release branch (1.2). Pull Requests for new features should be made against master. diff --git a/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.1.md b/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.1.md index d7f10a74..45cdc436 100644 --- a/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.1.md +++ b/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.1.md @@ -17,7 +17,7 @@ All notable changes of the PHPUnit 4.1 release series are documented in this fil ### Fixed -* Fixed [#529](https://github.com/sebastianbergmann/phpunit/issues/529): Tests missed in execution when another test extends from it +* Fixed [#529](https://github.com/sebastianbergmann/phpunit/issues/529): Tests missed in execution when another test extends from it * Fixed [#1149](https://github.com/sebastianbergmann/phpunit/issues/1149): Test swallows output buffer when run in a separate process * Fixed [#1336](https://github.com/sebastianbergmann/phpunit/issues/1336): Problem in process isolation with global variables that contain an object which contains a string which contains multiple backslashes * Fixed [#1337](https://github.com/sebastianbergmann/phpunit/issues/1337): Data Provider with `\` at the end of the name breaks with process isolation diff --git a/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.3.md b/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.3.md index 99c2826e..9fb083af 100644 --- a/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.3.md +++ b/samples/development-frameworks/laravel/vendor/phpunit/phpunit/ChangeLog-4.3.md @@ -43,7 +43,7 @@ New release of PHPUnit as PHP Archive (PHAR) with updated dependencies * Fixed [#1216](https://github.com/sebastianbergmann/phpunit/issues/1216): Bootstrap does not have global variables set when `--bootstrap` is specified on commandline * Fixed [#1351](https://github.com/sebastianbergmann/phpunit/issues/1351): `TestResult` object contains serialized test class upon test failure/exception in process isolation -* Fixed [#1437](https://github.com/sebastianbergmann/phpunit/issues/1437): Risky test messages mask failures +* Fixed [#1437](https://github.com/sebastianbergmann/phpunit/issues/1437): Risky test messages mask failures [4.3.5]: https://github.com/sebastianbergmann/phpunit/compare/4.3.4...4.3.5 [4.3.4]: https://github.com/sebastianbergmann/phpunit/compare/4.3.3...4.3.4 diff --git a/samples/development-frameworks/laravel/vendor/psr/log/LICENSE b/samples/development-frameworks/laravel/vendor/psr/log/LICENSE index 474c952b..93f395d5 100644 --- a/samples/development-frameworks/laravel/vendor/psr/log/LICENSE +++ b/samples/development-frameworks/laravel/vendor/psr/log/LICENSE @@ -1,13 +1,13 @@ Copyright (c) 2012 PHP Framework Interoperability Group -Permission is hereby granted, free of charge, to any person obtaining a copy +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR diff --git a/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerAwareTrait.php b/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerAwareTrait.php index f087a3da..31de587c 100644 --- a/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerAwareTrait.php +++ b/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerAwareTrait.php @@ -12,7 +12,7 @@ trait LoggerAwareTrait /** * Sets a logger. - * + * * @param LoggerInterface $logger */ public function setLogger(LoggerInterface $logger) diff --git a/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerTrait.php b/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerTrait.php index 59124960..85597f51 100644 --- a/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerTrait.php +++ b/samples/development-frameworks/laravel/vendor/psr/log/Psr/Log/LoggerTrait.php @@ -6,8 +6,8 @@ namespace Psr\Log; * This is a simple Logger trait that classes unable to extend AbstractLogger * (because they extend another class, etc) can include. * - * It simply delegates all log-level-specific methods to the `log` method to - * reduce boilerplate code that a simple Logger that does the same thing with + * It simply delegates all log-level-specific methods to the `log` method to + * reduce boilerplate code that a simple Logger that does the same thing with * messages regardless of the error level has to implement. */ trait LoggerTrait diff --git a/samples/development-frameworks/laravel/vendor/psy/psysh/README.md b/samples/development-frameworks/laravel/vendor/psy/psysh/README.md index 12436138..37074260 100644 --- a/samples/development-frameworks/laravel/vendor/psy/psysh/README.md +++ b/samples/development-frameworks/laravel/vendor/psy/psysh/README.md @@ -52,7 +52,7 @@ return array( // In PHP 5.4+, PsySH will default to your `cli.pager` ini setting. If this // is not set, it falls back to `less`. It is recommended that you set up // `cli.pager` in your `php.ini` with your preferred output pager. - // + // // If you are running PHP 5.3, or if you want to use a different pager only // for Psy shell sessions, you can override it here. 'pager' => 'more', diff --git a/samples/development-frameworks/laravel/vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default b/samples/development-frameworks/laravel/vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default index 68902d84..074d4787 100644 --- a/samples/development-frameworks/laravel/vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default +++ b/samples/development-frameworks/laravel/vendor/swiftmailer/swiftmailer/tests/acceptance.conf.php.default @@ -8,7 +8,7 @@ The acceptance tests are run by default when "All Tests" are run with the testing suite, however, without configuration options here only the unit tests will be run and the acceptance tests will be skipped. - + You can fill out only the parts you know and leave the other bits. */ diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_0.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_0.txt index a42e0f79..d890cb7a 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_0.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_0.txt @@ -1,3 +1,3 @@ - ! [CAUTION] Lorem ipsum dolor sit amet + ! [CAUTION] Lorem ipsum dolor sit amet diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_1.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_1.txt index 334875f7..c2426ed4 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_1.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_1.txt @@ -2,7 +2,7 @@ Title ===== - [WARNING] Lorem ipsum dolor sit amet + [WARNING] Lorem ipsum dolor sit amet Title ===== diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_2.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_2.txt index ca609760..d955aa4e 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_2.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_2.txt @@ -1,13 +1,13 @@ - [WARNING] Warning + [WARNING] Warning - ! [CAUTION] Caution + ! [CAUTION] Caution - [ERROR] Error + [ERROR] Error - [OK] Success + [OK] Success - ! [NOTE] Note + ! [NOTE] Note -X [CUSTOM] Custom block +X [CUSTOM] Custom block diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_6.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_6.txt index 5f2d33c1..c53eae75 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_6.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/Style/SymfonyStyle/output/output_6.txt @@ -2,5 +2,5 @@ * Lorem ipsum dolor sit amet * consectetur adipiscing elit - [OK] Lorem ipsum dolor sit amet + [OK] Lorem ipsum dolor sit amet diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_1.xml b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_1.xml index 35d1db4d..208a8ce7 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_1.xml +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_1.xml @@ -7,13 +7,13 @@ Displays help for a command The <info>help</info> command displays help for a given command: - + <info>php app/console help list</info> - + You can also output the help in other formats by using the <comment>--format</comment> option: - + <info>php app/console help --format=xml list</info> - + To display the list of available commands, please use the <info>list</info> command. @@ -65,19 +65,19 @@ Lists commands The <info>list</info> command lists all commands: - + <info>php app/console list</info> - + You can also display the commands for a specific namespace: - + <info>php app/console list test</info> - + You can also output the information in other formats by using the <comment>--format</comment> option: - + <info>php app/console list --format=xml</info> - + It's also possible to get raw list of commands (useful for embedding command runner): - + <info>php app/console list --raw</info> diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_2.xml b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_2.xml index bc8ab219..7958a1d9 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_2.xml +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_2.xml @@ -7,13 +7,13 @@ Displays help for a command The <info>help</info> command displays help for a given command: - + <info>php app/console help list</info> - + You can also output the help in other formats by using the <comment>--format</comment> option: - + <info>php app/console help --format=xml list</info> - + To display the list of available commands, please use the <info>list</info> command. @@ -65,19 +65,19 @@ Lists commands The <info>list</info> command lists all commands: - + <info>php app/console list</info> - + You can also display the commands for a specific namespace: - + <info>php app/console list test</info> - + You can also output the information in other formats by using the <comment>--format</comment> option: - + <info>php app/console list --format=xml</info> - + It's also possible to get raw list of commands (useful for embedding command runner): - + <info>php app/console list --raw</info> diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_asxml1.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_asxml1.txt index 8277d9e6..453a8b4f 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_asxml1.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_asxml1.txt @@ -7,13 +7,13 @@ Displays help for a command The <info>help</info> command displays help for a given command: - + <info>php app/console help list</info> - + You can also output the help in other formats by using the <comment>--format</comment> option: - + <info>php app/console help --format=xml list</info> - + To display the list of available commands, please use the <info>list</info> command. @@ -65,19 +65,19 @@ Lists commands The <info>list</info> command lists all commands: - + <info>php app/console list</info> - + You can also display the commands for a specific namespace: - + <info>php app/console list test</info> - + You can also output the information in other formats by using the <comment>--format</comment> option: - + <info>php app/console list --format=xml</info> - + It's also possible to get raw list of commands (useful for embedding command runner): - + <info>php app/console list --raw</info> diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception1.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception1.txt index c56f4b60..33fc3c19 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception1.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception1.txt @@ -1,6 +1,6 @@ - - [InvalidArgumentException] - Command "foo" is not defined. - + + [InvalidArgumentException] + Command "foo" is not defined. + diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception2.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception2.txt index 58cd420f..0f57fb82 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception2.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception2.txt @@ -1,8 +1,8 @@ - - [InvalidArgumentException] - The "--foo" option does not exist. - + + [InvalidArgumentException] + The "--foo" option does not exist. + list [--xml] [--raw] [--format FORMAT] [--] [] diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception3.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception3.txt index 8276137b..8c61d690 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception3.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception3.txt @@ -1,18 +1,18 @@ - - [Exception] - Third exception comment - - - [Exception] - Second exception comment - + [Exception] + Third exception comment + + + + [Exception] + Second exception comment + + + + [Exception] + First exception

    this is html

    - - [Exception] - First exception

    this is html

    - foo3:bar diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception4.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception4.txt index 9d881e7d..6c06c59e 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception4.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception4.txt @@ -1,7 +1,7 @@ - - [InvalidArgumentException] - Command "foo" is not define - d. - + + [InvalidArgumentException] + Command "foo" is not define + d. + diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1.txt index 1ba5f8fd..a635de18 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth1.txt @@ -1,8 +1,8 @@ - - [Exception] - エラーメッセージ - + + [Exception] + エラーメッセージ + foo diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth2.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth2.txt index e41fcfcf..7a1533a0 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth2.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_renderexception_doublewidth2.txt @@ -1,9 +1,9 @@ - - [Exception] - コマンドã®å®Ÿè¡Œä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒ - 発生ã—ã¾ã—ãŸã€‚ - + + [Exception] + コマンドã®å®Ÿè¡Œä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒ + 発生ã—ã¾ã—ãŸã€‚ + foo diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run2.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run2.txt index d28b928e..da2b5287 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run2.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run2.txt @@ -19,11 +19,11 @@ Options: Help: The help command displays help for a given command: - + php app/console help list - + You can also output the help in other formats by using the --format option: - + php app/console help --format=xml list - + To display the list of available commands, please use the list command. diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run3.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run3.txt index bc51995f..9e6e83c8 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run3.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/application_run3.txt @@ -11,17 +11,17 @@ Options: Help: The list command lists all commands: - + php app/console list - + You can also display the commands for a specific namespace: - + php app/console list test - + You can also output the information in other formats by using the --format option: - + php app/console list --format=xml - + It's also possible to get raw list of commands (useful for embedding command runner): - + php app/console list --raw diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/command_2.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/command_2.txt index 72f7ce05..b4ebd2f0 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/command_2.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/command_2.txt @@ -4,10 +4,10 @@ descriptor:command2 Arguments: - argument_name + argument_name Options: - -o, --option_name + -o, --option_name Help: command 2 help diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/input_definition_4.txt b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/input_definition_4.txt index 63aa81d2..f344dbf4 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/input_definition_4.txt +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Fixtures/input_definition_4.txt @@ -1,5 +1,5 @@ Arguments: - argument_name + argument_name Options: -o, --option_name diff --git a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Helper/LegacyTableHelperTest.php b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Helper/LegacyTableHelperTest.php index cf9ad13a..e085d6f5 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Helper/LegacyTableHelperTest.php +++ b/samples/development-frameworks/laravel/vendor/symfony/console/Tests/Helper/LegacyTableHelperTest.php @@ -113,11 +113,11 @@ TABLE $books, TableHelper::LAYOUT_COMPACT, << for ElemType_header, moving minOccurs="0" maxOccurs="unbounded" from its elements +- Changed the for ElemType_header, moving minOccurs="0" maxOccurs="unbounded" from its elements to itself. - Added for ElemType_trans-unit to allow "any order" for , , , , and . Oct-2005 - updated version info to 1.2 -- equiv-trans attribute to element +- equiv-trans attribute to element - merged-trans attribute for element -- Add the element as optional in the and content models, at the same level as +- Add the element as optional in the and content models, at the same level as - Create a new value "seg" for the mtype attribute of the element - Add mid as an optional attribute for the element diff --git a/samples/development-frameworks/laravel/vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd b/samples/development-frameworks/laravel/vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd index a46162a7..d29ed78f 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd +++ b/samples/development-frameworks/laravel/vendor/symfony/translation/Loader/schema/dic/xliff-core/xml.xsd @@ -1,7 +1,7 @@ - @@ -20,7 +20,7 @@ See http://www.w3.org/XML/1998/namespace.html and - http://www.w3.org/TR/REC-xml for information + http://www.w3.org/TR/REC-xml for information about this namespace.

    @@ -31,7 +31,7 @@ They should not be used with conflicting semantics by any Working Group, specification, or document instance.

    -

    +

    See further below in this document for more information about how to refer to this schema document from your own XSD schema documents and about the @@ -47,7 +47,7 @@

    Notes

    Attempting to install the relevant ISO 2- and 3-letter codes as the enumerated possible values is probably never - going to be a realistic possibility. + going to be a realistic possibility.

    @@ -83,7 +83,7 @@ - + @@ -98,7 +98,7 @@

    - +

    space (as an attribute name)

    denotes an attribute whose @@ -106,7 +106,7 @@ discipline is intended for the content of the element; its value is inherited. This name is reserved by virtue of its definition in the XML specification.

    - +
    @@ -118,12 +118,12 @@ - +
    - +

    base (as an attribute name)

    denotes an attribute whose value @@ -131,7 +131,7 @@ relative URIs in the scope of the element on which it appears; its value is inherited. This name is reserved by virtue of its definition in the XML Base specification.

    - +

    See http://www.w3.org/TR/xmlbase/ @@ -142,20 +142,20 @@ - +

    - -

    id (as an attribute name)

    + +

    id (as an attribute name)

    denotes an attribute whose value should be interpreted as if declared to be of type ID. This name is reserved by virtue of its definition in the xml:id specification.

    - +

    See http://www.w3.org/TR/xml-id/ @@ -178,14 +178,14 @@

    - -

    Father (in any context at all)

    + +

    Father (in any context at all)

    - denotes Jon Bosak, the chair of - the original XML Working Group. This name is reserved by - the following decision of the W3C XML Plenary and + denotes Jon Bosak, the chair of + the original XML Working Group. This name is reserved by + the following decision of the W3C XML Plenary and XML Coordination groups:

    @@ -277,17 +277,17 @@ Schema itself, or with the XML namespace itself. In other words, if the XML Schema or XML namespaces change, the version of this document at - http://www.w3.org/2001/xml.xsd - - will change accordingly; the version at + http://www.w3.org/2001/xml.xsd + + will change accordingly; the version at - http://www.w3.org/2009/01/xml.xsd - + http://www.w3.org/2009/01/xml.xsd + will not change.

    - Previous dated (and unchanging) versions of this schema + Previous dated (and unchanging) versions of this schema document are at:

      diff --git a/samples/development-frameworks/laravel/vendor/symfony/var-dumper/Tests/VarClonerTest.php b/samples/development-frameworks/laravel/vendor/symfony/var-dumper/Tests/VarClonerTest.php index 31e3a40a..2af1e752 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/var-dumper/Tests/VarClonerTest.php +++ b/samples/development-frameworks/laravel/vendor/symfony/var-dumper/Tests/VarClonerTest.php @@ -79,7 +79,7 @@ Symfony\Component\VarDumper\Cloner\Data Object ( [type] => object [class] => stdClass - [value] => + [value] => [cut] => 0 [handle] => %i [refCount] => 0 @@ -94,7 +94,7 @@ Symfony\Component\VarDumper\Cloner\Data Object ( [type] => object [class] => stdClass - [value] => + [value] => [cut] => 0 [handle] => %i [refCount] => 0 @@ -105,7 +105,7 @@ Symfony\Component\VarDumper\Cloner\Data Object ( [type] => object [class] => stdClass - [value] => + [value] => [cut] => 0 [handle] => %i [refCount] => 0 @@ -160,7 +160,7 @@ Symfony\Component\VarDumper\Cloner\Data Object ( [type] => object [class] => %s - [value] => + [value] => [cut] => 0 [handle] => %i [refCount] => 0 diff --git a/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml b/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml index b72a9b69..1300a940 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml +++ b/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml @@ -7,7 +7,7 @@ yaml: | ex2: "foo # bar" # comment ex3: 'foo # bar' # comment ex4: foo # comment - ex5: foo # comment with tab before + ex5: foo # comment with tab before ex6: foo#foo # comment here ex7: foo # ignore me # and me php: | diff --git a/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml b/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml index a427be1c..ea8554b0 100644 --- a/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml +++ b/samples/development-frameworks/laravel/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml @@ -60,7 +60,7 @@ yaml: | foo - + bar php: | array('foo' => array('bar' => "foo\n\n\n \nbar\n")) @@ -74,7 +74,7 @@ yaml: | foo - + bar php: | array('foo' => array('bar' => "\nfoo\n\nbar\n")) diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj index 0ce1ccbb..d6ff59d9 100644 --- a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/DemoWorkload.csproj @@ -195,7 +195,7 @@ - diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs index d75e8b4a..a18ccb37 100644 --- a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.Designer.cs @@ -72,9 +72,9 @@ ((System.ComponentModel.ISupportInitialize)(this.chtPageReads)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.chtCPU)).BeginInit(); this.SuspendLayout(); - // + // // btnRun - // + // this.btnRun.BackColor = System.Drawing.Color.White; this.btnRun.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnRun.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -86,9 +86,9 @@ this.btnRun.Text = "Start"; this.btnRun.UseVisualStyleBackColor = false; this.btnRun.Click += new System.EventHandler(this.OnRunClick); - // + // // btnStop - // + // this.btnStop.BackColor = System.Drawing.Color.White; this.btnStop.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnStop.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -101,9 +101,9 @@ this.btnStop.Text = "Stop"; this.btnStop.UseVisualStyleBackColor = false; this.btnStop.Click += new System.EventHandler(this.btnStop_Click); - // + // // btnRegress - // + // this.btnRegress.BackColor = System.Drawing.Color.White; this.btnRegress.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnRegress.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -115,9 +115,9 @@ this.btnRegress.Text = "Regress"; this.btnRegress.UseVisualStyleBackColor = false; this.btnRegress.Click += new System.EventHandler(this.btnRegress_Click); - // + // // btnAutoTune - // + // this.btnAutoTune.BackColor = System.Drawing.Color.White; this.btnAutoTune.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnAutoTune.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -129,9 +129,9 @@ this.btnAutoTune.Text = "Auto Tune"; this.btnAutoTune.UseVisualStyleBackColor = false; this.btnAutoTune.Click += new System.EventHandler(this.btnAutoTune_Click); - // + // // lbResults - // + // this.lbResults.BackColor = System.Drawing.Color.Transparent; this.lbResults.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lbResults.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(166))))); @@ -141,9 +141,9 @@ this.lbResults.TabIndex = 31; this.lbResults.Text = "Baseline"; this.lbResults.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // + // // menuStrip1 - // + // this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.optionsToolStripMenuItem}); @@ -153,32 +153,32 @@ this.menuStrip1.Size = new System.Drawing.Size(815, 24); this.menuStrip1.TabIndex = 32; this.menuStrip1.Text = "menuStrip1"; - // + // // optionsToolStripMenuItem - // + // this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.configurationToolStripMenuItem, this.exitToolStripMenuItem}); this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 22); this.optionsToolStripMenuItem.Text = "Options"; - // + // // configurationToolStripMenuItem - // + // this.configurationToolStripMenuItem.Name = "configurationToolStripMenuItem"; this.configurationToolStripMenuItem.Size = new System.Drawing.Size(148, 22); this.configurationToolStripMenuItem.Text = "Configuration"; this.configurationToolStripMenuItem.Click += new System.EventHandler(this.configurationToolStripMenuItem_Click); - // + // // exitToolStripMenuItem - // + // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.Size = new System.Drawing.Size(148, 22); this.exitToolStripMenuItem.Text = "Exit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); - // + // // ErrorMessages - // + // this.ErrorMessages.Location = new System.Drawing.Point(846, 79); this.ErrorMessages.Multiline = true; this.ErrorMessages.Name = "ErrorMessages"; @@ -187,9 +187,9 @@ this.ErrorMessages.Size = new System.Drawing.Size(360, 272); this.ErrorMessages.TabIndex = 5; this.ErrorMessages.TabStop = false; - // + // // chtTPS - // + // this.chtTPS.BackColor = System.Drawing.Color.Transparent; chartArea1.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Seconds; chartArea1.AxisX.MajorGrid.Enabled = false; @@ -222,9 +222,9 @@ this.chtTPS.Size = new System.Drawing.Size(755, 267); this.chtTPS.TabIndex = 33; this.chtTPS.Text = "chtTPS"; - // + // // statusStrip1 - // + // this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripStatusLabel1, @@ -236,40 +236,40 @@ this.statusStrip1.Size = new System.Drawing.Size(815, 22); this.statusStrip1.TabIndex = 35; this.statusStrip1.Text = "statusStrip1"; - // + // // toolStripStatusLabel1 - // + // this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; this.toolStripStatusLabel1.Size = new System.Drawing.Size(80, 17); this.toolStripStatusLabel1.Text = "Elapsed Time:"; - // + // // lblTime - // + // this.lblTime.Name = "lblTime"; this.lblTime.Size = new System.Drawing.Size(13, 17); this.lblTime.Text = "0"; - // + // // toolStripStatusLabel3 - // + // this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; this.toolStripStatusLabel3.Size = new System.Drawing.Size(100, 17); this.toolStripStatusLabel3.Text = "Running Threads:"; - // + // // lblThreads - // + // this.lblThreads.Name = "lblThreads"; this.lblThreads.Size = new System.Drawing.Size(13, 17); this.lblThreads.Text = "0"; - // + // // splitContainer1 - // + // this.splitContainer1.BackColor = System.Drawing.Color.Transparent; this.splitContainer1.Location = new System.Drawing.Point(0, 25); this.splitContainer1.Name = "splitContainer1"; this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; - // + // // splitContainer1.Panel1 - // + // this.splitContainer1.Panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.splitContainer1.Panel1.Controls.Add(this.btnReset); this.splitContainer1.Panel1.Controls.Add(this.btnAutoTune); @@ -280,17 +280,17 @@ this.splitContainer1.Panel1.Controls.Add(this.btnRun); this.splitContainer1.Panel1.Controls.Add(this.btnStop); this.splitContainer1.Panel1.Controls.Add(this.lbResults); - // + // // splitContainer1.Panel2 - // + // this.splitContainer1.Panel2.Controls.Add(this.chtPageReads); this.splitContainer1.Panel2.Controls.Add(this.chtCPU); this.splitContainer1.Size = new System.Drawing.Size(786, 655); this.splitContainer1.SplitterDistance = 398; this.splitContainer1.TabIndex = 39; - // + // // btnReset - // + // this.btnReset.BackColor = System.Drawing.Color.White; this.btnReset.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnReset.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -302,9 +302,9 @@ this.btnReset.Text = "Reset"; this.btnReset.UseVisualStyleBackColor = false; this.btnReset.Click += new System.EventHandler(this.btnReset_Click); - // + // // label2 - // + // this.label2.AutoSize = true; this.label2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -314,9 +314,9 @@ this.label2.Size = new System.Drawing.Size(142, 17); this.label2.TabIndex = 42; this.label2.Text = "Batch Requests / sec"; - // + // // btnToggle - // + // this.btnToggle.BackColor = System.Drawing.Color.White; this.btnToggle.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnToggle.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -328,9 +328,9 @@ this.btnToggle.Text = "Show diagnostics "; this.btnToggle.UseVisualStyleBackColor = false; this.btnToggle.Click += new System.EventHandler(this.btnToggle_Click); - // + // // chtPageReads - // + // chartArea2.AxisX.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.False; chartArea2.AxisX.LabelStyle.Enabled = false; chartArea2.AxisX.LineColor = System.Drawing.Color.White; @@ -361,9 +361,9 @@ this.chtPageReads.TabIndex = 42; this.chtPageReads.Text = "chtPageReads"; this.chtPageReads.Click += new System.EventHandler(this.chtPageReads_Click); - // + // // chtCPU - // + // this.chtCPU.BackColor = System.Drawing.Color.Transparent; chartArea3.AxisX.LabelStyle.Enabled = false; chartArea3.AxisX.LineColor = System.Drawing.Color.White; @@ -399,9 +399,9 @@ this.chtCPU.Size = new System.Drawing.Size(786, 253); this.chtCPU.TabIndex = 41; this.chtCPU.Click += new System.EventHandler(this.chtCPU_Click); - // + // // label3 - // + // this.label3.AutoSize = true; this.label3.BackColor = System.Drawing.Color.Transparent; this.label3.Location = new System.Drawing.Point(843, 40); @@ -409,9 +409,9 @@ this.label3.Size = new System.Drawing.Size(83, 13); this.label3.TabIndex = 11; this.label3.Text = "Error Messages:"; - // + // // FrmMain - // + // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.BackColor = System.Drawing.Color.White; diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs index e05f3d43..8653c8ed 100644 --- a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.cs @@ -1,15 +1,15 @@ -//---------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, -// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES -// OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. -//---------------------------------------------------------------------------------- -// The example companies, organizations, products, domain names, -// e-mail addresses, logos, people, places, and events depicted -// herein are fictitious. No association with any real company, -// organization, product, domain name, email address, logo, person, -// places, or events is intended or should be inferred. +//---------------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +//---------------------------------------------------------------------------------- +// The example companies, organizations, products, domain names, +// e-mail addresses, logos, people, places, and events depicted +// herein are fictitious. No association with any real company, +// organization, product, domain name, email address, logo, person, +// places, or events is intended or should be inferred. using System; using System.Collections.Generic; @@ -22,12 +22,12 @@ using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using System.Windows.Forms.Integration; -/// -/// -/// Documentation References: +/// +/// +/// Documentation References: /// Automatic Tuning: http://docs.microsoft.com/sql/relational-databases/automatic-tuning/automatic-tuning -/// -/// +/// +/// namespace DemoWorkload { @@ -36,7 +36,7 @@ namespace DemoWorkload delegate void SetTextCallback(string text); public Object ErrorLock = new Object(); - public Object StopLock = new Object(); + public Object StopLock = new Object(); List RunningThreads = new List(); Thread MonitorThread; @@ -48,7 +48,7 @@ namespace DemoWorkload int TPSChartTime = 0; public int ReadAutoTune() - { + { string ConfigSelect = string.Format("select count(*) from sys.database_automatic_tuning_options where actual_state = 1"); System.Data.SqlClient.SqlConnection conn = new SqlConnection(Program.CONN_STR); @@ -79,13 +79,13 @@ namespace DemoWorkload { InitializeComponent(); } - + delegate void SetInt64Callback(Int64 value); delegate void SetIntCallback(int value); - /// + /// /// Adds a line of text into the message box - /// + /// private void AddText(string text) { // InvokeRequired required compares the thread ID of the @@ -102,31 +102,31 @@ namespace DemoWorkload } } - /// + /// /// Updates the thread count display - /// + /// private void UpdateCount(string TC) { try { this.lblThreads.Text = TC.ToString(); } catch (Exception ex) { ShowThreadExceptionDialog("UpdateCount", ex); } } - /// + /// /// Updates the elapsed time display - /// + /// private void UpdateElapsed(string Elapsed) { - this.lblTime.Text = Elapsed.ToString(); + this.lblTime.Text = Elapsed.ToString(); } - /// - /// Updates the CPU% bar in the chart + /// + /// Updates the CPU% bar in the chart /// Note that this proc does NOT cause the chart to refresh. /// that is done in UpdateTPS(), which should be called after this proc. - /// + /// private void UpdateCPUChart(int CPU) { - try { + try { if (this.statusStrip1.InvokeRequired) { SetIntCallback d = new SetIntCallback(UpdateCPUChart); @@ -143,12 +143,12 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdateCPUChart", ex); } } - /// + /// /// Updates PageReads in the Chart - /// + /// private void UpdatePageReadChart(Int64 PageReads) { - try { + try { if (this.statusStrip1.InvokeRequired) { SetInt64Callback d = new SetInt64Callback(UpdatePageReadChart); @@ -165,12 +165,12 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdatePageReadChart", ex); } } - /// + /// /// Updates the TPS bar in the chart, and causes the whole chart to be re-drawn with the new data. - /// + /// private void UpdateTPSChart(Int64 TPS) { - try { + try { if (this.statusStrip1.InvokeRequired) { SetInt64Callback d = new SetInt64Callback(UpdateTPSChart); @@ -181,9 +181,9 @@ namespace DemoWorkload // Updating Speedometer if (TPS >= 0) { - //double normalizedTPS = (double)TPS; + //double normalizedTPS = (double)TPS; //uiControls.speedDial.CurrentValue = normalizedTPS; - //uiControls.speedDial.DialText = normalizedTPS.ToString("#.##"); + //uiControls.speedDial.DialText = normalizedTPS.ToString("#.##"); // Updating TPS chart TPSChartTime++; @@ -207,9 +207,9 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdateTPSChart", ex); } } - /// + /// /// Updates Results - /// + /// public void UpdateResults(string Results) { try @@ -235,9 +235,9 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdateResults", ex); } } - /// + /// /// Executes Read Commands - /// + /// void OnRunClick(object sender, EventArgs e) { try @@ -268,7 +268,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("OnRunClick", ex); } } - /// + /// /// Executes Transactions on the target server /// void ThreadWorker(object tp) @@ -317,7 +317,7 @@ namespace DemoWorkload } } - /// + /// /// Thread Monitor /// void ThreadMonitor() @@ -377,7 +377,7 @@ namespace DemoWorkload } mo_tables = ReadAutoTune(); - + if (mo_tables == 0) { //This is the case where Auto Tuning is turned OFF. @@ -468,7 +468,7 @@ namespace DemoWorkload UpdateTPSChart(TPS); } - /// + /// /// Stop Button /// private void btnStop_Click(object sender, EventArgs e) @@ -478,7 +478,7 @@ namespace DemoWorkload Stopped = true; } } - /// + /// /// Application Exit /// private void exitToolStripMenuItem_Click(object sender, EventArgs e) @@ -486,7 +486,7 @@ namespace DemoWorkload Application.Exit(); } - /// + /// /// Regression Button /// private void btnRegress_Click(object sender, EventArgs e) @@ -534,7 +534,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("btnRegress_Click", ex); } } - /// + /// /// Auto Tuning Button /// private void btnAutoTune_Click(object sender, EventArgs e) @@ -586,7 +586,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("btnAutoTune_Click", ex); } } - /// + /// /// Reset Button /// private void btnReset_Click(object sender, EventArgs e) @@ -632,7 +632,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("btnReset_Click", ex); } } - /// + /// /// Configuration Settings /// private void configurationToolStripMenuItem_Click(object sender, EventArgs e) @@ -645,7 +645,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("configurationToolStripMenuItem_Click", ex); } } - /// + /// /// Show Diagnostics /// private void btnToggle_Click(object sender, EventArgs e) @@ -667,7 +667,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("btnToggle_Click", ex); } } - /// + /// /// Frm Main Load /// private void FrmMain_Load(object sender, EventArgs e) @@ -685,7 +685,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("FrmMain_Load", ex);} } - /// + /// /// Frm Main Closing /// private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) @@ -701,7 +701,7 @@ namespace DemoWorkload } } - /// + /// /// Creates an error message and displays it. /// private static DialogResult ShowThreadExceptionDialog(string title, Exception e) @@ -723,7 +723,7 @@ namespace DemoWorkload } } - /// + /// /// ThreadParams Class /// class ThreadParams diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx index 8176630a..32dc6cfe 100644 --- a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/FrmMain.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/GlobalSuppressions.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/GlobalSuppressions.cs index 04ce0dc9c1287556cfa4af767969df0b21b598f6..b23b84d12785877fbf0df2af9e8b76b1b7fd6b3b 100644 GIT binary patch delta 24 gcmX@ay^DK81=Hjzre~Xzm}M9zH?Xu!W@Ft00CnOB+yDRo delta 32 lcmdnReTaKQ1rwvf /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -23,15 +23,15 @@ namespace DemoWorkload.Properties { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// @@ -45,7 +45,7 @@ namespace DemoWorkload.Properties { return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. @@ -59,7 +59,7 @@ namespace DemoWorkload.Properties { resourceCulture = value; } } - + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -69,7 +69,7 @@ namespace DemoWorkload.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -79,7 +79,7 @@ namespace DemoWorkload.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx index 3e218d5d..54fb5c4b 100644 --- a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs index 413e5601..66d78315 100644 --- a/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs +++ b/samples/features/automatic-tuning/force-last-good-plan-2/DemoWorkload/Properties/Settings.Designer.cs @@ -9,14 +9,14 @@ //------------------------------------------------------------------------------ namespace DemoWorkload.Properties { - - + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - + public static Settings Default { get { return defaultInstance; diff --git a/samples/features/automatic-tuning/force-last-good-plan-2/README.md b/samples/features/automatic-tuning/force-last-good-plan-2/README.md index a36771e2..960d4bd8 100644 --- a/samples/features/automatic-tuning/force-last-good-plan-2/README.md +++ b/samples/features/automatic-tuning/force-last-good-plan-2/README.md @@ -37,7 +37,7 @@ This Windows Forms sample application built on .NET Framework 4.6 demonstrates t 7. Build the app for release and run it. Do not use the debugger, as that will slow down the app. -8. Start the workload with the **Start** button, and run for a while to show perf profile. Then press the **Regress** button to introduce the problem and observe the throughput going down. +8. Start the workload with the **Start** button, and run for a while to show perf profile. Then press the **Regress** button to introduce the problem and observe the throughput going down. 9. Run for a while to show perf profile of regressed workload, and then press the **Auto Tuning** button and observe the system going back to a previously good plan captured by Query Store, and throughput is restored to initial Baseline status. You can tweak aspects of the workload (e.g., number of threads) through the configuration form accessed using the "Options" menu. No need to recompile or restart the application. diff --git a/samples/features/automatic-tuning/force-last-good-plan/Controllers/DemoController.cs b/samples/features/automatic-tuning/force-last-good-plan/Controllers/DemoController.cs index 072a9c4f..cbdb9f45 100644 --- a/samples/features/automatic-tuning/force-last-good-plan/Controllers/DemoController.cs +++ b/samples/features/automatic-tuning/force-last-good-plan/Controllers/DemoController.cs @@ -9,7 +9,7 @@ namespace FlgpWwiDemo.Controllers public class DemoController : Controller { IQueryMapper queryMapper = null; - + public DemoController(IQueryMapper queryMapper) { this.queryMapper = queryMapper; @@ -27,7 +27,7 @@ namespace FlgpWwiDemo.Controllers await this.queryMapper .OnError(ex=> status = ex.Message) .ExecuteReader("EXEC dbo.report 7", reader => { - result = reader.GetDecimal(0); + result = reader.GetDecimal(0); end = DateTimeOffset.Now.ToUnixTimeMilliseconds(); }); return "{\"x\":\"" + DateTime.Now.ToUniversalTime().ToString() + "\",\"y\":" + (end-start) + ",\"start\":" + start + ",\"end\":" + end + ",\"result\":" + result +",\"status\":\"" + status + "\"}"; diff --git a/samples/features/automatic-tuning/force-last-good-plan/README.md b/samples/features/automatic-tuning/force-last-good-plan/README.md index 0dedd5c9..43b79da3 100644 --- a/samples/features/automatic-tuning/force-last-good-plan/README.md +++ b/samples/features/automatic-tuning/force-last-good-plan/README.md @@ -12,7 +12,7 @@ This code sample demonstrates how [Automatic tuning in SQL Server 2017 CTP2.0+]( -## About this sample +## About this sample 1. **Applies to:** SQL Server 2017 (or higher) Enterprise / Developer / Evaluation Edition 2. **Key features:** - Automatic tuning / forcing last good plan diff --git a/samples/features/automatic-tuning/force-last-good-plan/Startup.cs b/samples/features/automatic-tuning/force-last-good-plan/Startup.cs index e42b4f8e..be05784d 100644 --- a/samples/features/automatic-tuning/force-last-good-plan/Startup.cs +++ b/samples/features/automatic-tuning/force-last-good-plan/Startup.cs @@ -31,7 +31,7 @@ namespace FlgpWwiDemo public void ConfigureServices(IServiceCollection services) { string ConnString = Configuration["ConnectionStrings:Wwi"]; - + // Adding data access services/components. services.AddTransient( sp => new QueryMapper(new SqlConnection(ConnString)) diff --git a/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/demo-full.sql b/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/demo-full.sql index 5f09ff8a..2e965328 100644 --- a/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/demo-full.sql +++ b/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/demo-full.sql @@ -146,7 +146,7 @@ FROM sys.dm_db_tuning_recommendations [recommended plan_id] int '$.recommendedPlanId' ) as planForceDetails; - + -- 5. Recommendation is in "Verifying" state, but the last good plan is forced, so the query will be faster: EXEC sp_executesql N'select avg([UnitPrice]*[Quantity]) from Sales.OrderLines diff --git a/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-blank-db.sql b/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-blank-db.sql index f4295b94..a39eb54f 100644 --- a/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-blank-db.sql +++ b/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-blank-db.sql @@ -17,13 +17,13 @@ GO CREATE SCHEMA [Sequences]; GO -CREATE SEQUENCE [Sequences].[OrderLineID] +CREATE SEQUENCE [Sequences].[OrderLineID] AS [int] START WITH 231413 INCREMENT BY 1 MINVALUE -2147483648 MAXVALUE 2147483647 - CACHE; + CACHE; GO CREATE TABLE Sales.OrderLines( @@ -39,10 +39,10 @@ CREATE TABLE Sales.OrderLines( PickingCompletedWhen datetime2(7) NULL, LastEditedBy int NOT NULL, LastEditedWhen datetime2(7) NOT NULL -); +); GO ALTER TABLE [Sales].[OrderLines] - ADD CONSTRAINT [DF_Sales_OrderLines_OrderLineID] + ADD CONSTRAINT [DF_Sales_OrderLines_OrderLineID] DEFAULT (NEXT VALUE FOR [Sequences].[OrderLineID]) FOR [OrderLineID] GO ALTER TABLE [Sales].[OrderLines] diff --git a/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-wwi-db.sql b/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-wwi-db.sql index 5bb4ebb8..68b4a6fa 100644 --- a/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-wwi-db.sql +++ b/samples/features/automatic-tuning/force-last-good-plan/sql-scripts/init-wwi-db.sql @@ -18,7 +18,7 @@ CREATE NONCLUSTERED COLUMNSTORE INDEX [NCCX_Sales_OrderLines] ON [Sales].[OrderL [UnitPrice], [PickedQuantity], [PackageTypeID] -- adding package type id for demo purpose -)WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) +)WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) GO CREATE OR ALTER PROCEDURE [dbo].[initialize] 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 index 3fe6979e..1ac7a548 100644 --- 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 @@ -76,7 +76,7 @@ done # Reset kube # -sudo apt-get purge -y kubeadm --allow-change-held-packages +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 @@ -85,7 +85,7 @@ 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." 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 9dca7dac..90bd0dc2 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 @@ -82,7 +82,7 @@ done # Reset kube # -sudo apt-get purge -y kubeadm --allow-change-held-packages +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 @@ -91,7 +91,7 @@ sudo apt -y autoremove sudo rm -rf ~/.kube # Clean up working folders. -# +# export AZUREARCDATACONTROLLER_DIR=aadatacontroller if [ -d "$AZUREARCDATACONTROLLER_DIR" ]; then echo "Removing working directory $AZUREARCDATACONTROLLER_DIR." 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 index 896e6ddb..a0b9e199 100644 --- 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 @@ -110,7 +110,7 @@ touch $LOG_FILE # echo "" echo "######################################################################################" -echo "Starting installing packages..." +echo "Starting installing packages..." # Install docker. # @@ -150,11 +150,11 @@ 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 + 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 + 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 @@ -171,7 +171,7 @@ echo "Azdata has been successfully installed." # Load all pre-requisites for Kubernetes. # echo "###########################################################################" -echo "Starting to setup pre-requisites for kubernetes..." +echo "Starting to setup pre-requisites for kubernetes..." # Setup the kubernetes preprequisites. # @@ -252,13 +252,13 @@ for i in $(seq 1 $PV_COUNT); do sudo mount --bind /azurearc/local-storage/$vol /azurearc/local-storage/$vol done -echo "Kubernetes pre-requisites have been completed." +echo "Kubernetes pre-requisites have been completed." # Setup kubernetes cluster including remove taint on master. # echo "" echo "#############################################################################" -echo "Starting to setup Kubernetes master..." +echo "Starting to setup Kubernetes master..." # Initialize a kubernetes cluster on the current node. # @@ -325,7 +325,7 @@ echo "Kubernetes master setup done." # echo "" echo "############################################################################" -echo "Starting to deploy azdata cluster..." +echo "Starting to deploy azdata cluster..." # Command to create cluster for single node cluster. # @@ -348,7 +348,7 @@ azdata arc dc config replace --path azure-arc-custom/control.json --json-values azdata arc dc config replace --path azure-arc-custom/control.json --json-values '$.spec.storage.logs.className=local-storage' azdata arc dc create --name $ARC_DC_NAME --path azure-arc-custom --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." +echo "Azure Arc Data Controller cluster created." # Setting context to cluster. # diff --git a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller.sh b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller.sh index 616f6b29..fc2ba5d0 100644 --- a/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller.sh +++ b/samples/features/azure-arc/deployment/kubeadm/ubuntu-single-node-vm/setup-controller.sh @@ -111,7 +111,7 @@ touch $LOG_FILE # echo "" echo "######################################################################################" -echo "Starting installing packages..." +echo "Starting installing packages..." # Install docker. # @@ -147,7 +147,7 @@ sudo apt install -y libodbc1 odbcinst odbcinst1debian2 unixodbc apt-transport-ht # Download and install azdata package # echo "" -echo "Downloading azdata installer from" $AZDATA_PRIVATE_PREVIEW_DEB_PACKAGE +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 cd - @@ -175,7 +175,7 @@ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash # Load all pre-requisites for Kubernetes. # echo "###########################################################################" -echo "Starting to setup pre-requisites for kubernetes..." +echo "Starting to setup pre-requisites for kubernetes..." # Setup the kubernetes preprequisites. # @@ -256,13 +256,13 @@ for i in $(seq 1 $PV_COUNT); do sudo mount --bind /azurearc/local-storage/$vol /azurearc/local-storage/$vol done -echo "Kubernetes pre-requisites have been completed." +echo "Kubernetes pre-requisites have been completed." # Setup kubernetes cluster including remove taint on master. # echo "" echo "#############################################################################" -echo "Starting to setup Kubernetes master..." +echo "Starting to setup Kubernetes master..." # Initialize a kubernetes cluster on the current node. # @@ -329,14 +329,14 @@ echo "Kubernetes master setup done." # echo "" echo "############################################################################" -echo "Starting to deploy azdata cluster..." +echo "Starting to deploy azdata cluster..." # Command to create cluster for single node cluster. # 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." +echo "Azure Arc Data Controller cluster created." # Setting context to cluster. # diff --git a/samples/features/azure-arc/deployment/kubeadm/ubuntu/local-storage-provisioner.yaml b/samples/features/azure-arc/deployment/kubeadm/ubuntu/local-storage-provisioner.yaml index cc22b85a..11c0ca06 100644 --- a/samples/features/azure-arc/deployment/kubeadm/ubuntu/local-storage-provisioner.yaml +++ b/samples/features/azure-arc/deployment/kubeadm/ubuntu/local-storage-provisioner.yaml @@ -30,16 +30,16 @@ reclaimPolicy: Delete apiVersion: v1 kind: ConfigMap metadata: - name: local-provisioner-config + name: local-provisioner-config namespace: local-storage data: - storageClassMap: | + storageClassMap: | local-storage: hostDir: /azurearc/local-storage mountDir: /azurearc/local-storage blockCleanerCommand: - "/scripts/shred.sh" - - "2" + - "2" --- apiVersion: apps/v1 kind: DaemonSet @@ -51,7 +51,7 @@ metadata: spec: selector: matchLabels: - app: local-volume-provisioner + app: local-volume-provisioner template: metadata: labels: @@ -61,7 +61,7 @@ spec: containers: - image: "quay.io/external_storage/local-volume-provisioner:v2.1.0" imagePullPolicy: "Always" - name: provisioner + name: provisioner securityContext: privileged: true env: @@ -70,16 +70,16 @@ spec: fieldRef: fieldPath: spec.nodeName volumeMounts: - - mountPath: /etc/provisioner/config + - mountPath: /etc/provisioner/config name: provisioner-config - readOnly: true + readOnly: true - mountPath: /azurearc/local-storage name: local-storage - mountPropagation: "HostToContainer" + mountPropagation: "HostToContainer" volumes: - name: provisioner-config configMap: - name: local-provisioner-config + name: local-provisioner-config - name: local-storage hostPath: path: /azurearc/local-storage diff --git a/samples/features/columnstore/in-memory-columnstore/hk_cs_dmvs.sql b/samples/features/columnstore/in-memory-columnstore/hk_cs_dmvs.sql index 7938175f..c8a6be53 100644 --- a/samples/features/columnstore/in-memory-columnstore/hk_cs_dmvs.sql +++ b/samples/features/columnstore/in-memory-columnstore/hk_cs_dmvs.sql @@ -4,7 +4,7 @@ USE MASTER /* SELECT name FROM sys.system_objects -WHERE name LIKE '%xtp%memory%' +WHERE name LIKE '%xtp%memory%' ORDER BY name */ @@ -12,12 +12,12 @@ WHERE name LIKE '%xtp%memory%' select committed_kb, committed_target_kb from sys.dm_os_sys_info -select pool_id,convert(char(30), name) as Name, min_memory_percent, max_memory_percent, max_memory_kb/1024 as max_memory_in_MB, used_memory_kb/1024 as used_memory_in_MB, +select pool_id,convert(char(30), name) as Name, min_memory_percent, max_memory_percent, max_memory_kb/1024 as max_memory_in_MB, used_memory_kb/1024 as used_memory_in_MB, target_memory_kb/1024 as target_memory_in_MB from sys.dm_resource_governor_resource_pools -select convert(char(20), object_name(object_id)) as Name,* +select convert(char(20), object_name(object_id)) as Name,* from sys.dm_db_xtp_table_memory_stats where object_id> 0 @@ -29,31 +29,31 @@ select Sum( memory_allocated_for_indexes_kb + memory_allocated_for_table_kb)/102 from sys.dm_db_xtp_table_memory_stats -- consumer memory -select convert(char(20), object_name(object_id)) as Name, * +select convert(char(20), object_name(object_id)) as Name, * from sys.dm_db_xtp_memory_consumers select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_db_xtp_memory_consumers select * from sys.dm_xtp_system_memory_consumers -select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB +select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_xtp_system_memory_consumers -select type, name, memory_node_id, pages_kb/1024 as pages_MB -from sys.dm_os_memory_clerks +select type, name, memory_node_id, pages_kb/1024 as pages_MB +from sys.dm_os_memory_clerks where type like '%xtp%' select type, sum(pages_in_bytes/1024) as size_kb -from sys.dm_os_memory_objects +from sys.dm_os_memory_objects where type like '%xtp%' group by type -select sum(pages_in_bytes)/(1024*1024) as pages_in_MB +select sum(pages_in_bytes)/(1024*1024) as pages_in_MB from sys.dm_os_memory_objects where type like '%xtp%' -select * +select * from sys.dm_os_memory_objects where type like '%xtp%' @@ -67,14 +67,14 @@ from sys.dm_db_xtp_table_memory_stats select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_db_xtp_memory_consumers -select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB +select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_xtp_system_memory_consumers -select type, name, memory_node_id, pages_kb/1024 as pages_MB -from sys.dm_os_memory_clerks +select type, name, memory_node_id, pages_kb/1024 as pages_MB +from sys.dm_os_memory_clerks where type like '%xtp%' select type, sum(pages_in_bytes/1024) as size_kb -from sys.dm_os_memory_objects +from sys.dm_os_memory_objects where type like '%xtp%' group by type \ No newline at end of file diff --git a/samples/features/columnstore/in-memory-columnstore/hk_memory_dmvs.sql b/samples/features/columnstore/in-memory-columnstore/hk_memory_dmvs.sql index 7938175f..c8a6be53 100644 --- a/samples/features/columnstore/in-memory-columnstore/hk_memory_dmvs.sql +++ b/samples/features/columnstore/in-memory-columnstore/hk_memory_dmvs.sql @@ -4,7 +4,7 @@ USE MASTER /* SELECT name FROM sys.system_objects -WHERE name LIKE '%xtp%memory%' +WHERE name LIKE '%xtp%memory%' ORDER BY name */ @@ -12,12 +12,12 @@ WHERE name LIKE '%xtp%memory%' select committed_kb, committed_target_kb from sys.dm_os_sys_info -select pool_id,convert(char(30), name) as Name, min_memory_percent, max_memory_percent, max_memory_kb/1024 as max_memory_in_MB, used_memory_kb/1024 as used_memory_in_MB, +select pool_id,convert(char(30), name) as Name, min_memory_percent, max_memory_percent, max_memory_kb/1024 as max_memory_in_MB, used_memory_kb/1024 as used_memory_in_MB, target_memory_kb/1024 as target_memory_in_MB from sys.dm_resource_governor_resource_pools -select convert(char(20), object_name(object_id)) as Name,* +select convert(char(20), object_name(object_id)) as Name,* from sys.dm_db_xtp_table_memory_stats where object_id> 0 @@ -29,31 +29,31 @@ select Sum( memory_allocated_for_indexes_kb + memory_allocated_for_table_kb)/102 from sys.dm_db_xtp_table_memory_stats -- consumer memory -select convert(char(20), object_name(object_id)) as Name, * +select convert(char(20), object_name(object_id)) as Name, * from sys.dm_db_xtp_memory_consumers select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_db_xtp_memory_consumers select * from sys.dm_xtp_system_memory_consumers -select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB +select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_xtp_system_memory_consumers -select type, name, memory_node_id, pages_kb/1024 as pages_MB -from sys.dm_os_memory_clerks +select type, name, memory_node_id, pages_kb/1024 as pages_MB +from sys.dm_os_memory_clerks where type like '%xtp%' select type, sum(pages_in_bytes/1024) as size_kb -from sys.dm_os_memory_objects +from sys.dm_os_memory_objects where type like '%xtp%' group by type -select sum(pages_in_bytes)/(1024*1024) as pages_in_MB +select sum(pages_in_bytes)/(1024*1024) as pages_in_MB from sys.dm_os_memory_objects where type like '%xtp%' -select * +select * from sys.dm_os_memory_objects where type like '%xtp%' @@ -67,14 +67,14 @@ from sys.dm_db_xtp_table_memory_stats select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_db_xtp_memory_consumers -select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB +select sum(allocated_bytes)/(1024*1024) as total_allocated_MB, sum(used_bytes)/(1024*1024) as total_used_MB from sys.dm_xtp_system_memory_consumers -select type, name, memory_node_id, pages_kb/1024 as pages_MB -from sys.dm_os_memory_clerks +select type, name, memory_node_id, pages_kb/1024 as pages_MB +from sys.dm_os_memory_clerks where type like '%xtp%' select type, sum(pages_in_bytes/1024) as size_kb -from sys.dm_os_memory_objects +from sys.dm_os_memory_objects where type like '%xtp%' group by type \ No newline at end of file diff --git a/samples/features/columnstore/in-memory-columnstore/hkcs-demo.sql b/samples/features/columnstore/in-memory-columnstore/hkcs-demo.sql index 9010ac05..1b932f99 100644 --- a/samples/features/columnstore/in-memory-columnstore/hkcs-demo.sql +++ b/samples/features/columnstore/in-memory-columnstore/hkcs-demo.sql @@ -7,19 +7,19 @@ GO CREATE DATABASE [imoltp] CONTAINMENT = NONE - ON PRIMARY + ON PRIMARY ( NAME = N'imoltp_data', FILENAME = N'C:\data\imoltp_Data.mdf' , SIZE = 102400KB , MAXSIZE = 5GB, FILEGROWTH = 1024000KB ) - LOG ON + LOG ON ( NAME = N'imoltp_log', FILENAME = N'C:\data\imoltp_Log.ldf ' , SIZE = 52400KB , MAXSIZE = 5GB , FILEGROWTH = 102400KB ) GO ALTER DATABASE imoltp ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA -ALTER DATABASE imoltp ADD FILE (name='imoltp_mod', filename='c:\data\imoltp_mod') TO FILEGROUP imoltp_mod +ALTER DATABASE imoltp ADD FILE (name='imoltp_mod', filename='c:\data\imoltp_mod') TO FILEGROUP imoltp_mod GO --- drop the database with +-- drop the database with -- pool management DROP RESOURCE POOL Poolimoltp go @@ -105,7 +105,7 @@ select count(*) from t_colstor_hk -- look at the rowgroups select object_name(object_id), index_id, row_group_id, delta_store_hobt_id, state_desc, total_rows, size_in_bytes, trim_reason, trim_reason_desc, transition_to_compressed_state_desc -from sys.dm_db_column_store_row_group_physical_stats +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('t_colstor_hk') -- run spec proc to move rows from delta tail @@ -113,9 +113,9 @@ where object_id = object_id('t_colstor_hk') -- If you set migration policy to 0, as above, migration happens regardless of policy (ie. whether or not data is cold). declare @oid int = object_id('t_colstor_hk') exec sp_memory_optimized_cs_migration @oid -go - - +go + + set statistics time on @@ -134,5 +134,5 @@ from t_colstor_hk select avg (convert (bigint, unitsold)) -from t_colstor_hk with (index = [pk_t_colstor_hk]) +from t_colstor_hk with (index = [pk_t_colstor_hk]) diff --git a/samples/features/columnstore/nonclustered-columnstore/compression-delay-setup.sql b/samples/features/columnstore/nonclustered-columnstore/compression-delay-setup.sql index 599fda39..939f6cca 100644 --- a/samples/features/columnstore/nonclustered-columnstore/compression-delay-setup.sql +++ b/samples/features/columnstore/nonclustered-columnstore/compression-delay-setup.sql @@ -28,7 +28,7 @@ go select @loop = 0 begin tran - while (@loop < 100000) + while (@loop < 100000) begin select @accountkey = @loop select @accountdescription = 'accountdesc ' + convert(varchar(20), @accountkey) @@ -58,7 +58,7 @@ create table ncci_target ( AccountCodeAlternatekey int) create clustered index idx_ci_ncci_target on ncci_target (accountkey) -create nonclustered columnstore index idxncci_ncci_target on +create nonclustered columnstore index idxncci_ncci_target on ncci_target (accountkey, accountdescription, accounttype, accountcodealternatekey) with (compression_delay= 0) @@ -72,7 +72,7 @@ create table ncci_target_delay ( AccountCodeAlternatekey int) create clustered index idx_ci_ncci_target_delay on ncci_target_delay (accountkey) -create nonclustered columnstore index idxncci_ncci_target_delay on +create nonclustered columnstore index idxncci_ncci_target_delay on ncci_target_delay (accountkey, accountdescription, accounttype, accountcodealternatekey) with (compression_delay= 30) @@ -90,8 +90,8 @@ go 12 -- look at rowgroups -select object_name(object_id), * -from sys.dm_db_column_store_row_group_physical_stats +select object_name(object_id), * +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id ('ncci_target') or object_id=object_id('ncci_target_delay') -- manual diff --git a/samples/features/columnstore/nonclustered-columnstore/ncci_demo.sql b/samples/features/columnstore/nonclustered-columnstore/ncci_demo.sql index 605ed86f..3baaf172 100644 --- a/samples/features/columnstore/nonclustered-columnstore/ncci_demo.sql +++ b/samples/features/columnstore/nonclustered-columnstore/ncci_demo.sql @@ -10,9 +10,9 @@ go CREATE DATABASE [ncci] CONTAINMENT = NONE - ON PRIMARY + ON PRIMARY ( NAME = N'ncci_data', FILENAME = N'C:\data\ncci_Data.mdf' , SIZE = 102400KB , MAXSIZE = 5GB, FILEGROWTH = 1024000KB ) - LOG ON + LOG ON ( NAME = N'ncci_log', FILENAME = N'C:\data\ncci_Log.ldf ' , SIZE = 52400KB , MAXSIZE = 5GB , FILEGROWTH = 102400KB ) GO @@ -70,7 +70,7 @@ begin set @accountkey = convert (int, RAND ()*1000) set @orderstatus = 5 - set @orderstatusdesc = + set @orderstatusdesc = case @orderstatus WHEN 0 THEN 'Order Started' WHEN 1 THEN 'Order Closed' @@ -102,7 +102,7 @@ CREATE NONCLUSTERED COLUMNSTORE INDEX orders_ncci ON orders (accountkey, custom -- look at the rowgroups select object_name(object_id), index_id, row_group_id, delta_store_hobt_id, state_desc, total_rows, trim_reason_desc, transition_to_compressed_state_desc -from sys.dm_db_column_store_row_group_physical_stats +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('orders') @@ -133,7 +133,7 @@ begin set @orderstatus = convert (smallint, RAND()*5) if (@orderstatus = 5) set @orderstatus = 4 - set @orderstatusdesc = + set @orderstatusdesc = case @orderstatus WHEN 0 THEN 'Order Started' WHEN 1 THEN 'Order Closed' @@ -162,7 +162,7 @@ select count(*) from orders -- look at the rowgroups select object_name(object_id), index_id, row_group_id, delta_store_hobt_id, state_desc, total_rows, trim_reason_desc, transition_to_compressed_state_desc -from sys.dm_db_column_store_row_group_physical_stats +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('orders') @@ -178,7 +178,7 @@ select top 5 customername, sum (PurchasePrice), Avg (PurchasePrice) from orders where purchaseprice > 90.0 and OrderStatus=5 group by customername - + -- a complex query without NCCI select top 5 customername, sum (PurchasePrice), Avg (PurchasePrice) from orders @@ -241,7 +241,7 @@ begin set @accountkey = convert (int, RAND ()*1000000) set @orderstatus = 5 - set @orderstatusdesc = + set @orderstatusdesc = case @orderstatus WHEN 0 THEN 'Order Started' WHEN 1 THEN 'Order Closed' @@ -263,7 +263,7 @@ end go -CREATE NONCLUSTERED COLUMNSTORE INDEX orders_filtered_ncci +CREATE NONCLUSTERED COLUMNSTORE INDEX orders_filtered_ncci ON orders_filtered (accountkey, customername, purchaseprice, orderstatus) where orderstatus = 5 @@ -271,12 +271,12 @@ select * from sys.indexes where object_id=object_id('orders_filtered') -- look at the rowgroups select object_name(object_id), index_id, row_group_id, delta_store_hobt_id, state_desc, total_rows, trim_reason_desc, transition_to_compressed_state_desc -from sys.dm_db_column_store_row_group_physical_stats +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('orders_filtered') select sum (total_rows) -from sys.dm_db_column_store_row_group_physical_stats +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('orders_filtered') -- set stats off @@ -307,7 +307,7 @@ begin set @orderstatus = convert (smallint, RAND()*5) if (@orderstatus = 5) set @orderstatus = 4 - set @orderstatusdesc = + set @orderstatusdesc = case @orderstatus WHEN 0 THEN 'Order Started' WHEN 1 THEN 'Order Closed' @@ -331,16 +331,16 @@ go -- START the demo here -select count(*) As [Total Rows] from orders_filtered -select count(*) AS [Closed Orders] from orders_filtered where OrderStatus = 5 +select count(*) As [Total Rows] from orders_filtered +select count(*) AS [Closed Orders] from orders_filtered where OrderStatus = 5 select sum (total_rows) -from sys.dm_db_column_store_row_group_physical_stats +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('orders_filtered') -- look at the rowgroups select object_name(object_id), index_id, row_group_id, delta_store_hobt_id, state_desc, total_rows, trim_reason_desc, transition_to_compressed_state_desc -from sys.dm_db_column_store_row_group_physical_stats +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('orders_filtered') @@ -365,7 +365,7 @@ select top 5 customername, sum (PurchasePrice), Avg (PurchasePrice) from orders_filtered where purchaseprice > 90.0 and OrderStatus = 5 group by customername - + -- a more complex query without NCCI @@ -420,13 +420,13 @@ end go ---create NCCI -CREATE NONCLUSTERED COLUMNSTORE INDEX orders_filtered2_NCCI -ON orders_filtered2 (accountkey, accountdescription, unitsold) where accountkey > 0 +--create NCCI +CREATE NONCLUSTERED COLUMNSTORE INDEX orders_filtered2_NCCI +ON orders_filtered2 (accountkey, accountdescription, unitsold) where accountkey > 0 -- look at the row groups -select * -from sys.dm_db_column_store_row_group_physical_stats +select * +from sys.dm_db_column_store_row_group_physical_stats where object_id = object_id('orders_filtered2') select * from sys.index_columns where object_id = object_id('orders_filtered2') @@ -436,7 +436,7 @@ select * from sys.index_columns where object_id = object_id('orders_filtered2') sELECT segment_id, object_name(p.object_id), s.column_id, s.segment_id, s.min_data_id, s.max_data_id, s.encoding_type FROM sys.column_store_segments s, sys.partitions p where object_id = object_id('orders_filtered2') and -p.hobt_id = s.hobt_id +p.hobt_id = s.hobt_id -- show the query plan with filtered index -- since there is no index to filter, it will do a table scan diff --git a/samples/features/data-migration-assistant/PowerShell Script/DMA_Processor_V5.0.ps1 b/samples/features/data-migration-assistant/PowerShell Script/DMA_Processor_V5.0.ps1 index 05b62d21..9d691670 100644 --- a/samples/features/data-migration-assistant/PowerShell Script/DMA_Processor_V5.0.ps1 +++ b/samples/features/data-migration-assistant/PowerShell Script/DMA_Processor_V5.0.ps1 @@ -5,18 +5,18 @@ #the object code form of the Sample Code, provided that you agree: #(i) to not use Our name, logo, or trademarks to market Your software product in which the Sample Code is embedded; #(ii) to include a valid copyright notice on Your software product in which the Sample Code is embedded; and -#(iii) to indemnify, hold harmless, and defend Us and our suppliers from and against any claims or lawsuits, including attorneys' fees, that arise or result from the use or distribution of the Sample Code. -# ----------------------------------------------------------------------------- +#(iii) to indemnify, hold harmless, and defend Us and our suppliers from and against any claims or lawsuits, including attorneys' fees, that arise or result from the use or distribution of the Sample Code. +# ----------------------------------------------------------------------------- # -# Script: DMA_Processor.ps1 +# Script: DMA_Processor.ps1 # Author: Chris Lound - Senior Premier Field Engineer - Data Platform. -# Date: 08/02/2017 +# Date: 08/02/2017 # Version: 5.0 -# Synopsis: Create reporting objects and loads JSON files from DMA output folder into SQL server -# Keywords: +# Synopsis: Create reporting objects and loads JSON files from DMA output folder into SQL server +# Keywords: # Notes: A processed folder is created in the root folder of the folder containing the DMA JSON output (user specified). Script currently only supports windows authentication to SQL Server. -# Comments: -# 1.0 Initial Release - 22/11/2016 +# Comments: +# 1.0 Initial Release - 22/11/2016 # 2.0 Refactored JSON shredder for SQL2014 and below. Made this the only shredding function by removing the SQL2016 dependency # 3.0 Built in weighted breaking changes. Added table to support breaking change weighting and updated view to use it for reporting. Also removed Azure Artifacts # 3.1 Change importdate type to datetime. Added DBOwner column for reportdata table. - 16/02/2017 @@ -33,7 +33,7 @@ #Import JSON to SQL on prem or azure -function dmaProcessor +function dmaProcessor { param(     [parameter(Mandatory)] @@ -50,18 +50,18 @@ param(     [parameter(Mandatory)]     [ValidateNotNullOrEmpty()] - [ValidateSet("SQLServer")] + [ValidateSet("SQLServer")] [string] $processTo ) #Create database objects [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null $srv = New-Object Microsoft.SqlServer.Management.SMO.Server($serverName) - + #create reporting database $dbCheck = $srv.Databases | Where {$_.Name -eq "$databaseName"} | Select Name if(!$dbCheck) - { + { $db = New-Object Microsoft.SqlServer.Management.Smo.Database ($srv, $databaseName) $db.Create() @@ -77,7 +77,7 @@ param( #create ReportData table $tableCheck = $db.Tables | Where {$_.Name -eq "ReportData"} if(!$tableCheck) - { + { $ReportDatatbl = New-Object Microsoft.SqlServer.Management.Smo.Table($db, "ReportData") $col1 = New-Object Microsoft.SqlServer.Management.Smo.Column($ReportDatatbl, "ImportDate", [Microsoft.SqlServer.Management.Smo.DataType]::DateTime) @@ -101,7 +101,7 @@ param( $col19 = New-Object Microsoft.SqlServer.Management.Smo.Column($ReportDatatbl, "DBOwner", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(128)) $col20 = New-Object Microsoft.SqlServer.Management.Smo.Column($ReportDatatbl, "AssessmentTarget", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(50)) $col21 = New-Object Microsoft.SqlServer.Management.Smo.Column($ReportDatatbl, "AssessmentName", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(128)) - + $ReportDatatbl.Columns.Add($col1) $ReportDatatbl.Columns.Add($col2) $ReportDatatbl.Columns.Add($col3) @@ -119,11 +119,11 @@ param( $ReportDatatbl.Columns.Add($col15) $ReportDatatbl.Columns.Add($col16) $ReportDatatbl.Columns.Add($col17) - $ReportDatatbl.Columns.Add($col18) + $ReportDatatbl.Columns.Add($col18) $ReportDatatbl.Columns.Add($col19) $ReportDatatbl.Columns.Add($col20) - $ReportDatatbl.Columns.Add($col21) - + $ReportDatatbl.Columns.Add($col21) + $ReportDatatbl.Create() Write-Host ("Table ReportData created successfully") -ForegroundColor Green } @@ -135,7 +135,7 @@ param( #create AzureFeatureParity table $tableCheck2 = $db.Tables | Where {$_.Name -eq "AzureFeatureParity"} if(!$tableCheck2) - { + { $AzureReportDatatbl = New-Object Microsoft.SqlServer.Management.Smo.Table($db, "AzureFeatureParity") $col1 = New-Object Microsoft.SqlServer.Management.Smo.Column($AzureReportDatatbl, "ImportDate", [Microsoft.SqlServer.Management.Smo.DataType]::DateTime) @@ -169,7 +169,7 @@ param( $AzureReportDatatbl.Columns.Add($col13) $AzureReportDatatbl.Columns.Add($col14) $AzureReportDatatbl.Columns.Add($col15) - + $AzureReportDatatbl.Create() Write-Host ("Table AzureFeatureParity created successfully") -ForegroundColor Green } @@ -181,7 +181,7 @@ param( #create BreakingChangeWeighting table $tableCheck3 = $db.Tables | Where {$_.Name -eq "BreakingChangeWeighting"} if(!$tableCheck3) - { + { $BreakingChangetbl = New-Object Microsoft.SqlServer.Management.Smo.Table($db, "BreakingChangeWeighting") $col1 = New-Object Microsoft.SqlServer.Management.Smo.Column($BreakingChangetbl, "RuleId", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(36)) @@ -193,21 +193,21 @@ param( $col6 = New-Object Microsoft.SqlServer.Management.Smo.Column($BreakingChangetbl, "ChangeRank", [Microsoft.SqlServer.Management.Smo.DataType]::TinyInt) $Col6.Computed = $True $Col6.ComputedText = "(Effort + FixTime + Cost) / 3" - + $BreakingChangetbl.Columns.Add($col1) $BreakingChangetbl.Columns.Add($col2) $BreakingChangetbl.Columns.Add($col3) $BreakingChangetbl.Columns.Add($col4) $BreakingChangetbl.Columns.Add($col5) $BreakingChangetbl.Columns.Add($col6) - + $BreakingChangetbl.Create() $PK = New-Object Microsoft.SqlServer.Management.Smo.Index($BreakingChangetbl,"PK_BreakingChangeWeighting_RuleId") $PK.IndexKeyType = "DriPrimaryKey" $IdxCol = New-Object Microsoft.SqlServer.Management.Smo.IndexedColumn($PK, $col1.Name) - $PK.IndexedColumns.Add($IdxCol) + $PK.IndexedColumns.Add($IdxCol) $PK.Create() Write-Host ("Table BreakingChangeWeighting created successfully") -ForegroundColor Green @@ -221,9 +221,9 @@ param( $vwCheck1 = $db.Views | Where {$_.Name -eq "DatabaseCategoryRanking"} if(!$vwCheck1) { - $vwDatabaseCategoryRanking = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "DatabaseCategoryRanking", "dbo" - - $vwDatabaseCategoryRanking.TextHeader = "CREATE VIEW [dbo].[DatabaseCategoryRanking] AS" + $vwDatabaseCategoryRanking = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "DatabaseCategoryRanking", "dbo" + + $vwDatabaseCategoryRanking.TextHeader = "CREATE VIEW [dbo].[DatabaseCategoryRanking] AS" $vwDatabaseCategoryRanking.TextBody=@" WITH DatabaseRanking AS @@ -240,21 +240,21 @@ SELECT [Name] AS "DatabaseName" ,ChangeCategoryPercentage FROM DatabaseRanking; "@ - - $vwDatabaseCategoryRanking.Create() + + $vwDatabaseCategoryRanking.Create() Write-Host ("View DatabaseCategoryRanking created successfully") -ForegroundColor Green } else { Write-Host ("View DatabaseCategoryRanking already exists") -ForegroundColor Yellow } - + $vwCheck2 = $db.Views | Where {$_.Name -eq "UpgradeSuccessRanking"} if(!$vwCheck2) { - $vwUpgradeSuccessRanking = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "UpgradeSuccessRanking", "dbo" - - $vwUpgradeSuccessRanking.TextHeader = "CREATE VIEW [dbo].[UpgradeSuccessRanking] AS" + $vwUpgradeSuccessRanking = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "UpgradeSuccessRanking", "dbo" + + $vwUpgradeSuccessRanking.TextHeader = "CREATE VIEW [dbo].[UpgradeSuccessRanking] AS" $vwUpgradeSuccessRanking.TextBody=@" WITH issuecount AS @@ -294,7 +294,7 @@ IssueTotaled AS ( SELECT *, behaviorchange + deprecatedcount + breakingchange + MigrationBlocker AS 'Total' -FROM distinctissues +FROM distinctissues ), RankedDatabases AS @@ -316,13 +316,13 @@ SELECT InstanceName ,CASE WHEN BehaviorChange > 0 THEN BehaviorChange ELSE 1 END AS "BehaviorChange" ,CASE WHEN DeprecatedCount > 0 THEN DeprecatedCount ELSE 1 END AS "DeprecatedCount" ,CASE WHEN BreakingChange > 0 THEN BreakingChange ELSE 1 END AS "BreakingChange" - --,CASE WHEN NotDefined > 0 THEN NotDefined ELSE 1 END AS "NotDefined" - ,CASE WHEN MigrationBlocker > 0 THEN MigrationBlocker ELSE 1 END AS "MigrationBlocker" + --,CASE WHEN NotDefined > 0 THEN NotDefined ELSE 1 END AS "NotDefined" + ,CASE WHEN MigrationBlocker > 0 THEN MigrationBlocker ELSE 1 END AS "MigrationBlocker" FROM RankedDatabases "@ - - $vwUpgradeSuccessRanking.Create() - Write-Host ("View UpgradeSuccessRanking created successfully") -ForegroundColor Green + + $vwUpgradeSuccessRanking.Create() + Write-Host ("View UpgradeSuccessRanking created successfully") -ForegroundColor Green } else { @@ -332,9 +332,9 @@ FROM RankedDatabases $vwCheck3 = $db.Views | Where {$_.Name -eq "UpgradeSuccessRanking_OnPrem"} if(!$vwCheck3) { - $vwUpgradeSuccessRankingop = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "UpgradeSuccessRanking_OnPrem", "dbo" - - $vwUpgradeSuccessRankingop.TextHeader = "CREATE VIEW [dbo].[UpgradeSuccessRanking_OnPrem] AS" + $vwUpgradeSuccessRankingop = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "UpgradeSuccessRanking_OnPrem", "dbo" + + $vwUpgradeSuccessRankingop.TextHeader = "CREATE VIEW [dbo].[UpgradeSuccessRanking_OnPrem] AS" $vwUpgradeSuccessRankingop.TextBody=@" WITH issuecount AS @@ -371,7 +371,7 @@ IssueTotaled AS ( SELECT *, behaviorchange + deprecatedcount + breakingchange AS 'Total' -FROM distinctissues +FROM distinctissues ), RankedDatabases AS @@ -394,9 +394,9 @@ SELECT InstanceName FROM RankedDatabases "@ - - $vwUpgradeSuccessRankingop.Create() - Write-Host ("View UpgradeSuccessRanking_OnPrem created successfully") -ForegroundColor Green + + $vwUpgradeSuccessRankingop.Create() + Write-Host ("View UpgradeSuccessRanking_OnPrem created successfully") -ForegroundColor Green } else { @@ -407,9 +407,9 @@ FROM RankedDatabases $vwCheck4 = $db.Views | Where {$_.Name -eq "UpgradeSuccessRanking_Azure"} if(!$vwCheck4) { - $vwUpgradeSuccessRankingaz = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "UpgradeSuccessRanking_Azure", "dbo" - - $vwUpgradeSuccessRankingaz.TextHeader = "CREATE VIEW [dbo].[UpgradeSuccessRanking_Azure] AS" + $vwUpgradeSuccessRankingaz = New-Object -TypeName Microsoft.SqlServer.Management.SMO.View -argumentlist $db, "UpgradeSuccessRanking_Azure", "dbo" + + $vwUpgradeSuccessRankingaz.TextHeader = "CREATE VIEW [dbo].[UpgradeSuccessRanking_Azure] AS" $vwUpgradeSuccessRankingaz.TextBody=@" WITH issuecount AS @@ -448,7 +448,7 @@ IssueTotaled AS ( SELECT *, behaviorchange + deprecatedcount + breakingchange + MigrationBlocker AS 'Total' -FROM distinctissues +FROM distinctissues ), RankedDatabases AS @@ -469,12 +469,12 @@ SELECT InstanceName ,CASE WHEN BehaviorChange > 0 THEN BehaviorChange ELSE 1 END AS "BehaviorChange" ,CASE WHEN DeprecatedCount > 0 THEN DeprecatedCount ELSE 1 END AS "DeprecatedCount" ,CASE WHEN BreakingChange > 0 THEN BreakingChange ELSE 1 END AS "BreakingChange" - ,CASE WHEN MigrationBlocker > 0 THEN MigrationBlocker ELSE 1 END AS "MigrationBlocker" + ,CASE WHEN MigrationBlocker > 0 THEN MigrationBlocker ELSE 1 END AS "MigrationBlocker" FROM RankedDatabases "@ - - $vwUpgradeSuccessRankingaz.Create() - Write-Host ("View UpgradeSuccessRanking_Azure created successfully") -ForegroundColor Green + + $vwUpgradeSuccessRankingaz.Create() + Write-Host ("View UpgradeSuccessRanking_Azure created successfully") -ForegroundColor Green } else { @@ -486,7 +486,7 @@ FROM RankedDatabases if(!$ttCheck) { $JSONResultstt = New-Object -TypeName Microsoft.SqlServer.Management.Smo.UserDefinedTableType -ArgumentList $db, "JSONResults" - + $col1 = New-Object Microsoft.SqlServer.Management.Smo.Column($JSONResultstt, "ImportDate", [Microsoft.SqlServer.Management.Smo.DataType]::DateTime) $col2 = New-Object Microsoft.SqlServer.Management.Smo.Column($JSONResultstt, "InstanceName", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(50)) $col3 = New-Object Microsoft.SqlServer.Management.Smo.Column($JSONResultstt, "Status", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(30)) @@ -508,7 +508,7 @@ FROM RankedDatabases $col19 = New-Object Microsoft.SqlServer.Management.Smo.Column($JSONResultstt, "DBOwner", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(128)) $col20 = New-Object Microsoft.SqlServer.Management.Smo.Column($JSONResultstt, "AssessmentTarget", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(50)) $col21 = New-Object Microsoft.SqlServer.Management.Smo.Column($JSONResultstt, "AssessmentName", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(128)) - + $JSONResultstt.Columns.Add($col1) $JSONResultstt.Columns.Add($col2) $JSONResultstt.Columns.Add($col3) @@ -526,24 +526,24 @@ FROM RankedDatabases $JSONResultstt.Columns.Add($col15) $JSONResultstt.Columns.Add($col16) $JSONResultstt.Columns.Add($col17) - $JSONResultstt.Columns.Add($col18) + $JSONResultstt.Columns.Add($col18) $JSONResultstt.Columns.Add($col19) - $JSONResultstt.Columns.Add($col20) - $JSONResultstt.Columns.Add($col21) + $JSONResultstt.Columns.Add($col20) + $JSONResultstt.Columns.Add($col21) $JSONResultstt.Create() - Write-Host ("Table Type JSONResults created successfully") -ForegroundColor Green + Write-Host ("Table Type JSONResults created successfully") -ForegroundColor Green } else { Write-Host ("Table Type JSONResults already exists") -ForegroundColor Yellow } - + $ttCheck2 = $db.UserDefinedTableTypes | Where {$_.Name -eq "AzureFeatureParityResults"} if(!$ttCheck2) { $AzureParityResultstt = New-Object -TypeName Microsoft.SqlServer.Management.Smo.UserDefinedTableType -ArgumentList $db, "AzureFeatureParityResults" - + $col1 = New-Object Microsoft.SqlServer.Management.Smo.Column($AzureParityResultstt, "ImportDate", [Microsoft.SqlServer.Management.Smo.DataType]::DateTime) $col2 = New-Object Microsoft.SqlServer.Management.Smo.Column($AzureParityResultstt, "ServerName", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(128)) $col3 = New-Object Microsoft.SqlServer.Management.Smo.Column($AzureParityResultstt, "Version", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(15)) @@ -560,7 +560,7 @@ FROM RankedDatabases $col14 = New-Object Microsoft.SqlServer.Management.Smo.Column($AzureParityResultstt, "ImpactedObjectType", [Microsoft.SqlServer.Management.Smo.DataType]::VarChar(30)) $col15 = New-Object Microsoft.SqlServer.Management.Smo.Column($AzureParityResultstt, "ImpactDetail", [Microsoft.SqlServer.Management.Smo.DataType]::VarCharMax) - + $AzureParityResultstt.Columns.Add($col1) $AzureParityResultstt.Columns.Add($col2) $AzureParityResultstt.Columns.Add($col3) @@ -578,19 +578,19 @@ FROM RankedDatabases $AzureParityResultstt.Columns.Add($col15) $AzureParityResultstt.Create() - Write-Host ("Table Type AzureFeatureParityResults created successfully") -ForegroundColor Green + Write-Host ("Table Type AzureFeatureParityResults created successfully") -ForegroundColor Green } else { Write-Host ("Table Type AzureFeatureParityResults already exists") -ForegroundColor Yellow - } - + } + #Create Stored Procedures $procCheck = $db.StoredProcedures | Where {$_.Name -eq "JSONResults_Insert"} if(!$procCheck) { $JSONResults_Insert = New-Object -TypeName Microsoft.SqlServer.Management.Smo.StoredProcedure -ArgumentList $db, "JSONResults_Insert", "dbo" - + $JSONResults_Insert.TextHeader = "CREATE PROCEDURE dbo.JSONResults_Insert @JSONResults JSONResults READONLY AS" $JSONResults_Insert.TextBody = @" BEGIN @@ -603,7 +603,7 @@ END "@ $JSONResults_Insert.Create() - Write-Host ("Stored Procedure JSONNResults_Insert created successfully") -ForegroundColor Green + Write-Host ("Stored Procedure JSONNResults_Insert created successfully") -ForegroundColor Green } else { @@ -614,7 +614,7 @@ END if(!$procCheck2) { $AzureFeatureParityResults_Insert = New-Object -TypeName Microsoft.SqlServer.Management.Smo.StoredProcedure -ArgumentList $db, "AzureFeatureParityResults_Insert", "dbo" - + $AzureFeatureParityResults_Insert.TextHeader = "CREATE PROCEDURE dbo.AzureFeatureParityResults_Insert @AzureFeatureParityResults AzureFeatureParityResults READONLY AS" $AzureFeatureParityResults_Insert.TextBody = @" BEGIN @@ -627,7 +627,7 @@ END "@ $AzureFeatureParityResults_Insert.Create() - Write-Host ("Stored Procedure AzureFeatureParityResults_Insert created successfully") -ForegroundColor Green + Write-Host ("Stored Procedure AzureFeatureParityResults_Insert created successfully") -ForegroundColor Green } else { @@ -646,23 +646,23 @@ END if((Test-Path $processedDir) -eq $false) { - new-item $processedDir -ItemType directory + new-item $processedDir -ItemType directory Write-Host ("Processed directory created successfully at [$processDir]") -ForegroundColor Green } else { Write-Host ("Processed directory already exists") -ForegroundColor Yellow } -   +   # if there are no files to process stop importer $FileCheck = Get-ChildItem $jsonDirectory -Filter *.JSON if($FileCheck.Count -eq 0) { - Write-Host ("There are no JSON assessment files to process") -ForegroundColor Yellow + Write-Host ("There are no JSON assessment files to process") -ForegroundColor Yellow Break } - - + + $connectionString = "Server=$serverName;Database=$databaseName;Trusted_Connection=True;" #Populate the breaking change reference data @@ -671,7 +671,7 @@ END { #populate static data into BreakingChangeWeighting - + $CommandText = @' INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR00001','Syntax issue on the source server',1,1,1), ('Microsoft.Rules.Data.Upgrade.UR00006','BACKUP LOG WITH NO_LOG|TRUNCATE_ONLY statements are not supported',1,1,1), @@ -700,27 +700,27 @@ INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR0000 ('Microsoft.Rules.Data.Upgrade.UR00336','Certain XPath functions are not allowed in OPENXML queries',1,1,1) '@ - $conn = New-Object System.Data.SqlClient.SqlConnection $connectionString + $conn = New-Object System.Data.SqlClient.SqlConnection $connectionString $conn.Open() | Out-Null - $cmd = New-Object System.Data.SqlClient.SqlCommand + $cmd = New-Object System.Data.SqlClient.SqlCommand $cmd.Connection = $conn $cmd.CommandType = [System.Data.CommandType]"Text" $cmd.CommandText= $CommandText - + $ds=New-Object system.Data.DataSet $da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd) $da.fill($ds) $conn.Close() } - + # importer for SQL2014 and previous versions. Done via PowerShell - Get-ChildItem $jsonDirectory -Filter *.JSON | + Get-ChildItem $jsonDirectory -Filter *.JSON | Foreach-Object { - + $filename = $_.FullName - #ReportData datatable { + #ReportData datatable $datatable = New-Object -type system.data.datatable $datatable.columns.add("ImportDate",[DateTime]) | Out-Null $datatable.columns.add("InstanceName",[String]) | Out-Null @@ -764,9 +764,9 @@ INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR0000 $processStartTime = Get-Date - $datetime = Get-Date + $datetime = Get-Date $content = Get-Content $_.FullName -Raw - + # when a database assessment fails the assessment recommendations and impacted objects arrays # will be blank. Setting them to default values allows for the errors to be captured $blankAssessmentRecommendations = (New-Object PSObject | @@ -780,60 +780,60 @@ INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR0000 Add-Member -PassThru NoteProperty Recommendation NA | Add-Member -PassThru NoteProperty MoreInfo NA | Add-Member -PassThru NoteProperty ImpactedObjects NA - ) - + ) + $blankImpactedObjects = (New-Object PSObject | Add-Member -PassThru NoteProperty Name NA | Add-Member -PassThru NoteProperty ObjectType NA | - Add-Member -PassThru NoteProperty ImpactDetail NA + Add-Member -PassThru NoteProperty ImpactDetail NA ) $blankImpactedDatabases = (New-Object PSObject | Add-Member -PassThru NoteProperty Name NA | Add-Member -PassThru NoteProperty ObjectType NA | - Add-Member -PassThru NoteProperty ImpactDetail NA - ) + Add-Member -PassThru NoteProperty ImpactDetail NA + ) # Start looping through each JSON array - + #fill dataset for ReportData table foreach($obj in (ConvertFrom-Json $content)) #level 1, the actual file - { + { foreach($database in $obj.Databases) #level 2, the sources { $database.AssessmentRecommendations = if($database.AssessmentRecommendations.Length -eq 0) {$blankAssessmentRecommendations } else {$database.AssessmentRecommendations} - + foreach($assessment in $database.AssessmentRecommendations) #level 3, the assessment { - + $assessment.ImpactedObjects = if ($assessment.ImpactedObjects.Length -eq 0) {$blankImpactedObjects} else {$assessment.ImpactedObjects} foreach($impactedobj in $assessment.ImpactedObjects) #level 4, the impacted objects { - + #TODO Get date here will eventually be replace with timestamp from JSON file $datatable.rows.add((Get-Date).toString(), $database.ServerName, $database.Status, $database.Name, $database.SizeMB, $database.CompatibilityLevel, $assessment.CompatibilityLevel, $assessment.Category, $assessment.severity, $assessment.ChangeCategory, $assessment.RuleId, $assessment.Title, $assessment.Impact, $assessment.Recommendation, $assessment.MoreInfo, $impactedobj.Name, $impactedobj.ObjectType, $impactedobj.ImpactDetail, $null, $obj.TargetPlatform, $obj.Name) | Out-Null } } } - } + } #fill data set for AzureFeatureParity table foreach($obj in (ConvertFrom-Json $content)) #level 1, the actual file - { + { foreach($serverInstances in $obj.ServerInstances) #level 2, the ServerInstances { foreach($assessment in $serverInstances.AssessmentRecommendations) #level 3, the assessment { $impactedDatabases = if (($assessment.ImpactedDatabases -eq $null) -or ($assessment.ImpactedDatabases.Length -eq 0)) {$blankImpactedDatabases} else {$assessment.ImpactedDatabases} - + foreach($impacteddbs in $impactedDatabases) #level 4, the impacted objects - { + { #TODO Get date here will eventually be replace with timestamp from JSON file $azuredatatable.rows.add((Get-Date).toString(), $serverInstances.ServerName, $serverInstances.Version, $serverInstances.Status, $assessment.Category, $assessment.Severity, $assessment.FeatureParityCategory, $assessment.RuleId, $assessment.Title, $assessment.Impact, $assessment.Recommendation, $assessment.MoreInfo, $impacteddbs.Name, $impacteddbs.ObjectType, $impacteddbs.ImpactDetail) | Out-Null } - + } } } @@ -841,11 +841,11 @@ INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR0000 $rowcount_rd = $datatable.rows.Count $rowcount_afp = $azuredatatable.rows.Count - $query1='dbo.JSONResults_Insert' - $query2='dbo.AzureFeatureParityResults_Insert' + $query1='dbo.JSONResults_Insert' + $query2='dbo.AzureFeatureParityResults_Insert' #Connect - $conn = New-Object System.Data.SqlClient.SqlConnection $connectionString + $conn = New-Object System.Data.SqlClient.SqlConnection $connectionString $conn.Open() | Out-Null $cmd1 = New-Object System.Data.SqlClient.SqlCommand @@ -861,19 +861,19 @@ INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR0000 $cmd2.CommandText= $query2 $cmd2.Parameters.Add("@AzureFeatureParityResults" , [System.Data.SqlDbType]::Structured) | Out-Null $cmd2.Parameters["@AzureFeatureParityResults"].Value = $azuredatatable - + $ds1=New-Object system.Data.DataSet $da1=New-Object system.Data.SqlClient.SqlDataAdapter($cmd1) - + $ds2=New-Object system.Data.DataSet $da2=New-Object system.Data.SqlClient.SqlDataAdapter($cmd2) - + # ensure that the dataset can write to the database, if not the dont move the file to processed directory try { $da1.fill($ds1) | Out-Null $da2.fill($ds2) | out-null - + try { Move-Item $filename $processedDir -Force @@ -901,7 +901,7 @@ INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR0000 $datatable.Clear() $azuredatatable.Clear() - + } } @@ -916,11 +916,11 @@ INSERT INTO BreakingChangeWeighting VALUES ('Microsoft.Rules.Data.Upgrade.UR0000 dmaProcessor -serverName localhost ` -databaseName DMAReporting ` -jsonDirectory "C:\DMAResults\" ` - -processTo SQLServer - + -processTo SQLServer -# To process on a named instance use SERVERNAME\INSTANCENAME as the -serverName + +# To process on a named instance use SERVERNAME\INSTANCENAME as the -serverName #------------------------------------------------------------------------------------ END EXECUTE FUNCTIONS ------------------------------------------------------------------------------------ diff --git a/samples/features/data-migration-assistant/PowerShell Script/README.md b/samples/features/data-migration-assistant/PowerShell Script/README.md index f5aff367..1343b6c4 100644 --- a/samples/features/data-migration-assistant/PowerShell Script/README.md +++ b/samples/features/data-migration-assistant/PowerShell Script/README.md @@ -49,7 +49,7 @@ To run this sample, you need the following prerequisites. - databaseName - jsonDirectory - processTo - + For more information, see [Consolidate Assessment Reports](https://docs.microsoft.com/sql/dma/dma-consolidatereports). 2. Set PowerShell execution policy to bypass for current session, as follows. diff --git a/samples/features/epm-framework/3.0/0Setup Scripts/EPM_Create_Database_Objects.sql b/samples/features/epm-framework/3.0/0Setup Scripts/EPM_Create_Database_Objects.sql index 36201803..ab254ea5 100644 --- a/samples/features/epm-framework/3.0/0Setup Scripts/EPM_Create_Database_Objects.sql +++ b/samples/features/epm-framework/3.0/0Setup Scripts/EPM_Create_Database_Objects.sql @@ -1,6 +1,6 @@ /* SQLCMD script to generate the required -objects to support a centralized +objects to support a centralized Policy-Based Management solution. This is the first script to run. @@ -27,10 +27,10 @@ EXEC sys.sp_executesql N'CREATE SCHEMA [policy] AUTHORIZATION [dbo]' --Start create tables and indexes ---Create the table to store the results from the +--Create the table to store the results from the --PowerShell evaluation. IF NOT EXISTS(SELECT * FROM sys.objects WHERE type = N'U' AND name = N'PolicyHistory') -BEGIN +BEGIN CREATE TABLE [policy].[PolicyHistory]( [PolicyHistoryID] [int] IDENTITY NOT NULL , [EvaluatedServer] [nvarchar](50) NULL, @@ -45,7 +45,7 @@ BEGIN END GO IF EXISTS(SELECT * FROM sys.columns WHERE object_id = object_id('policy.policyhistory') AND name = 'PolicyResult') - BEGIN + BEGIN ALTER TABLE policy.PolicyHistory DROP COLUMN PolicyResult END @@ -58,7 +58,7 @@ GO CREATE XML INDEX IX_EvaluationResults_PROPERTY ON policy.PolicyHistory(EvaluationResults) USING XML INDEX IX_EvaluationResults - FOR PROPERTY + FOR PROPERTY GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluatedPolicy') @@ -75,20 +75,20 @@ GO INCLUDE ([PolicyHistoryID],[EvaluationDateTime],[EvaluatedPolicy]) GO ---Create the table to store the error information from the +--Create the table to store the error information from the --failed PowerShell executions. IF NOT EXISTS( SELECT * FROM sys.objects WHERE type = N'U' AND name = N'EvaluationErrorHistory' ) -BEGIN +BEGIN CREATE TABLE [policy].[EvaluationErrorHistory]( [ErrorHistoryID] [int] IDENTITY(1,1) NOT NULL, [EvaluatedServer] [nvarchar](50) NULL, [EvaluationDateTime] [datetime] NULL, [EvaluatedPolicy] [nvarchar](128) NULL, [EvaluationResults] [nvarchar](max) NOT NULL, - CONSTRAINT PK_EvaluationErrorHistory PRIMARY KEY CLUSTERED + CONSTRAINT PK_EvaluationErrorHistory PRIMARY KEY CLUSTERED ( [ErrorHistoryID] ASC )) ON [PRIMARY] @@ -110,8 +110,8 @@ GO --Create the table to store the policy result details. ---This table is loaded with the procedure ---policy.epm_LoadPolicyHistoryDetail or through +--This table is loaded with the procedure +--policy.epm_LoadPolicyHistoryDetail or through --the SQL Server 2008 SSIS policy package. IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND type in (N'U')) BEGIN @@ -139,20 +139,20 @@ GO DROP INDEX IX_EvaluatedPolicy ON policy.PolicyHistoryDetail GO CREATE INDEX IX_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] - ([EvaluatedPolicy]) - INCLUDE ([PolicyHistoryID], - [EvaluatedServer], - [EvaluationDateTime], - [MonthYear], - [policy_id], - [CategoryName], - [EvaluatedObject], + ([EvaluatedPolicy]) + INCLUDE ([PolicyHistoryID], + [EvaluatedServer], + [EvaluationDateTime], + [MonthYear], + [policy_id], + [CategoryName], + [EvaluatedObject], [PolicyResult]) IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView') DROP INDEX IX_PolicyHistoryView ON policy.PolicyHistoryDetail GO - CREATE NONCLUSTERED INDEX [IX_PolicyHistoryView] ON [policy].[PolicyHistoryDetail] + CREATE NONCLUSTERED INDEX [IX_PolicyHistoryView] ON [policy].[PolicyHistoryDetail] ( [EvaluatedPolicy] ASC, [EvaluatedServer] ASC, [EvaluatedObject] ASC, @@ -166,7 +166,7 @@ GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedServer') DROP INDEX IX_EvaluatedServer ON policy.PolicyHistoryDetail GO - CREATE NONCLUSTERED INDEX [IX_EvaluatedServer] ON [policy].[PolicyHistoryDetail] + CREATE NONCLUSTERED INDEX [IX_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ( [EvaluatedServer] ASC, [EvaluatedPolicy] ASC, [EvaluatedObject] ASC, @@ -187,7 +187,7 @@ GO CREATE STATISTICS [Stat_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluatedPolicy], [CategoryName]) GO - IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName') + IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName') DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName] GO CREATE STATISTICS [Stat_CategoryName] ON [policy].[PolicyHistoryDetail]([CategoryName], [EvaluatedServer]) @@ -222,8 +222,8 @@ GO --The following function will support nested --CMS folders for the EPM Framework --The function must be created in a database ON the ---CMS server. This database will also store the ---policy history. +--CMS server. This database will also store the +--policy history. USE $(ManagementDatabase) GO @@ -232,7 +232,7 @@ IF EXISTS(SELECT * FROM sys.objects WHERE name = 'pfn_ServerGroupInstances' AND GO CREATE FUNCTION policy.pfn_ServerGroupInstances (@server_group_name NVARCHAR(128)) - RETURNS @ServerGroups TABLE + RETURNS @ServerGroups TABLE (server_name nvarchar(128) , GroupName nvarchar(128) ) @@ -247,15 +247,15 @@ CREATE FUNCTION policy.pfn_ServerGroupInstances ON s.server_group_id = ssg.server_group_id END ELSE - WITH ServerGroups(parent_id, server_group_id, name) AS + WITH ServerGroups(parent_id, server_group_id, name) AS ( - SELECT parent_id, server_group_id, name + SELECT parent_id, server_group_id, name FROM msdb.dbo.sysmanagement_shared_server_groups tg WHERE is_system_object = 0 AND (tg.name = @server_group_name OR @server_group_name = '') UNION ALL - SELECT cg.parent_id, cg.server_group_id, cg.name + SELECT cg.parent_id, cg.server_group_id, cg.name FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id @@ -263,31 +263,31 @@ CREATE FUNCTION policy.pfn_ServerGroupInstances INSERT @ServerGroups SELECT s.server_name, sg.name as GroupName FROM [msdb].[dbo].[sysmanagement_shared_registered_servers_internal] s - INNER JOIN ServerGroups SG + INNER JOIN ServerGroups SG ON s.server_group_id = sg.server_group_id RETURN END GO ---Create the views which are used in +--Create the views which are used in --the policy reports ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]')) DROP VIEW [policy].[v_ServerGroups] GO -CREATE VIEW policy.v_ServerGroups AS +CREATE VIEW policy.v_ServerGroups AS WITH ServerGroups(parent_id , server_group_id , GroupName , GroupLevel , Sort - , GroupValue) - AS + , GroupValue) + AS (SELECT parent_id , server_group_id , cast('ALL' as varchar(500)) - , 1 as GroupLevel + , 1 as GroupLevel , cast('ALL' as varchar(500)) as Sort , cast('' as varchar(255))AS GroupValue FROM msdb.dbo.sysmanagement_shared_server_groups tg @@ -310,18 +310,18 @@ CREATE VIEW policy.v_ServerGroups AS , GroupLevel , Sort , GroupValue - FROM ServerGroups + FROM ServerGroups GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]')) DROP VIEW [policy].[v_PolicyHistory] GO CREATE VIEW policy.v_PolicyHistory AS --The policy.v_PolicyHistory view will return all results ---and identify the policy evaluation result AS PASS, FAIL, or +--and identify the policy evaluation result AS PASS, FAIL, or --ERROR. The ERROR result indicates that the policy was not able --to evaluate against an object. SELECT PH.PolicyHistoryID @@ -337,12 +337,12 @@ AS , PH.MonthYear FROM policy.PolicyHistoryDetail PH INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy - INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON + INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]')) DROP VIEW policy.v_PolicyHistory_Rank GO @@ -365,14 +365,14 @@ CREATE VIEW policy.v_PolicyHistory_Rank AS GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_LastEvaluation]')) DROP VIEW policy.v_PolicyHistory_LastEvaluation GO CREATE VIEW policy.v_PolicyHistory_LastEvaluation AS - --The policy.v_PolicyHistory_LastEvaluation view will - --the last result for any given policy evaluated against + --The policy.v_PolicyHistory_LastEvaluation view will + --the last result for any given policy evaluated against --an object. This view requires the v_PolicyHistory view --exist. SELECT PolicyHistoryID @@ -398,21 +398,21 @@ AS GO ---Create a view to return all errors. Errors will be returned from +--Create a view to return all errors. Errors will be returned from --the table EvaluationErrorHistory and the errors in the PolicyHistory --table. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]')) DROP VIEW policy.v_EvaluationErrorHistory GO CREATE VIEW policy.v_EvaluationErrorHistory AS - SELECT + SELECT EEH.ErrorHistoryID , EEH.EvaluatedServer , EEH.EvaluationDateTime , EEH.EvaluatedPolicy - , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 + , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1) ELSE EEH.EvaluatedServer END @@ -424,7 +424,7 @@ AS , 'ERROR' AS PolicyResult FROM policy.EvaluationErrorHistory AS EEH INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = EEH.EvaluatedPolicy - INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON + INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id UNION ALL SELECT PolicyHistoryID @@ -443,13 +443,13 @@ GO --Create a view to return the last error for each policy against --an instance. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory_LastEvaluation]')) DROP VIEW policy.v_EvaluationErrorHistory_LastEvaluation GO CREATE VIEW policy.v_EvaluationErrorHistory_LastEvaluation AS - SELECT + SELECT ErrorHistoryID , EvaluatedServer , EvaluationDateTime @@ -465,7 +465,7 @@ AS ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc FROM policy.v_EvaluationErrorHistory EEH WHERE NOT EXISTS ( - SELECT * + SELECT * FROM policy.PolicyHistoryDetail PH WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy AND PH.EvaluatedServer = EEH.EvaluatedServer @@ -474,7 +474,7 @@ GO --Create the procedures ---epm_LoadPolicyHistoryDetail will load the details from the +--epm_LoadPolicyHistoryDetail will load the details from the --XML documents in PolicyHistory to the PolicyHistoryDetails --table. IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[policy].[epm_LoadPolicyHistoryDetail]') AND type in (N'P', N'PC')) @@ -498,17 +498,17 @@ AS , MonthYear , PolicyHistorySource ) - SELECT + SELECT PH.PolicyHistoryID , PH.EvaluatedServer , PH.EvaluationDateTime , PH.EvaluatedPolicy , Res.Expr.value('(../DMF:TargetQueryExpression)[1]', 'nvarchar(150)') AS EvaluatedObject , (CASE WHEN Res.Expr.value('(../DMF:Result)[1]', 'nvarchar(150)')= 'FALSE' AND Expr.value('(../DMF:Exception)[1]', 'nvarchar(max)') = '' - THEN 'FAIL' + THEN 'FAIL' WHEN Res.Expr.value('(../DMF:Result)[1]', 'nvarchar(150)')= 'FALSE' AND Expr.value('(../DMF:Exception)[1]', 'nvarchar(max)')<> '' THEN 'ERROR' - ELSE 'PASS' + ELSE 'PASS' END) AS PolicyResult , Expr.value('(../DMF:Exception)[1]', 'nvarchar(max)') AS ExceptionMessage , CAST(Expr.value('(../DMF:ResultDetail)[1]', 'nvarchar(max)')AS XML) AS ResultDetail @@ -517,15 +517,15 @@ AS , datename(month, EvaluationDateTime) + ' ' + datename(year, EvaluationDateTime) AS MonthYear , 'PowerShell EPM Framework' FROM policy.PolicyHistory AS PH - INNER JOIN msdb.dbo.syspolicy_policies AS p + INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy - INNER JOIN msdb.dbo.syspolicy_policy_categories AS c + INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id CROSS APPLY EvaluationResults.nodes(' declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; //TargetQueryExpression' ) AS Res(Expr) - WHERE NOT EXISTS (SELECT * + WHERE NOT EXISTS (SELECT * FROM policy.PolicyHistoryDetail PHD WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID); @@ -537,15 +537,15 @@ AS , EvaluatedPolicy , EvaluationResults ) - SELECT + SELECT PH.EvaluatedServer , PH.EvaluationDateTime , PH.EvaluatedPolicy , Expr.value('(../DMF:Exception)[1]', 'nvarchar(max)') AS ExceptionMessage FROM policy.PolicyHistory AS PH - INNER JOIN msdb.dbo.syspolicy_policies AS p + INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy - INNER JOIN msdb.dbo.syspolicy_policy_categories AS c + INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id CROSS APPLY EvaluationResults.nodes(' declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; @@ -554,9 +554,9 @@ AS WHERE EvaluationResults.exist('declare namespace DMF="http://schemas.microsoft.com/sqlserver/DMF/2007/08"; //DMF:EvaluationDetail' ) = 0 - AND Res.Expr.value('(../DMF:Result)[1]', 'nvarchar(150)')= 'FALSE' + AND Res.Expr.value('(../DMF:Result)[1]', 'nvarchar(150)')= 'FALSE' AND Expr.value('(../DMF:Exception)[1]', 'nvarchar(max)')<> '' - AND NOT EXISTS (SELECT * + AND NOT EXISTS (SELECT * FROM policy.PolicyHistoryDetail PHD WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID); @@ -576,7 +576,7 @@ AS , MonthYear , PolicyHistorySource ) - SELECT + SELECT PH.PolicyHistoryID , PH.EvaluatedServer , PH.EvaluationDateTime @@ -590,9 +590,9 @@ AS , datename(month, EvaluationDateTime) + ' ' + datename(year, EvaluationDateTime) AS MonthYear , 'PowerShell EPM Framework' FROM policy.PolicyHistory AS PH - INNER JOIN msdb.dbo.syspolicy_policies AS p + INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy - INNER JOIN msdb.dbo.syspolicy_policy_categories AS c + INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id CROSS APPLY EvaluationResults.nodes(' declare default element namespace "http://schemas.microsoft.com/sqlserver/DMF/2007/08"; @@ -602,7 +602,7 @@ AS //DMF:EvaluationDetail' ) = 0 AND Expr.value('(../DMF:Exception)[1]', 'nvarchar(max)')= '' - AND NOT EXISTS (SELECT * + AND NOT EXISTS (SELECT * FROM policy.PolicyHistoryDetail PHD WHERE PHD.PolicyHistoryID = PH.PolicyHistoryID) GO diff --git a/samples/features/epm-framework/3.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_3.0.0.ps1 b/samples/features/epm-framework/3.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_3.0.0.ps1 index d42db70f..a6dd39e0 100644 --- a/samples/features/epm-framework/3.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_3.0.0.ps1 +++ b/samples/features/epm-framework/3.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_3.0.0.ps1 @@ -7,12 +7,12 @@ param([string]$ConfigurationGroup=$(Throw ` -PolicyCategoryFilter Category"), ` [string]$EvalMode=$(Throw "Parameter missing: -EvalMode EvalMode")) -# Parameter -ConfigurationGroup specifies the +# Parameter -ConfigurationGroup specifies the # Central Management Server group to evaluate -# Parameter -PolicyCategoryFilter specifies the +# Parameter -PolicyCategoryFilter specifies the # category of policies to evaluate # Parameter -EvalMode accepts "Check" to report policy -# results, "Configure" to reconfigure any violations +# results, "Configure" to reconfigure any violations # Declare variables to define the central warehouse # in which to write the output, store the policies @@ -27,7 +27,7 @@ Remove-Item -Path $ResultDirDel #Function to insert policy evaluation results #into SQL Server - table policy.PolicyHistory -function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults) +function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults) { &{ $sqlQueryText = "INSERT INTO policy.PolicyHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResults')" @@ -35,13 +35,13 @@ function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $Evaluate } trap { - $ExceptionText = $_.Exception.Message -replace "'", "" + $ExceptionText = $_.Exception.Message -replace "'", "" } } -#Function to insert policy evaluation errors +#Function to insert policy evaluation errors #into SQL Server - table policy.EvaluationErrorHistory -function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape) +function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape) { &{ $sqlQueryText = "INSERT INTO policy.EvaluationErrorHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResultsEscape')" @@ -49,7 +49,7 @@ function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedS } trap { - $ExceptionText = $_.Exception.Message -replace "'", "" + $ExceptionText = $_.Exception.Message -replace "'", "" } } @@ -70,7 +70,7 @@ $dr = $cmd.ExecuteReader(); # the policies. For each server and policy, # call cmdlet to evaluate policy on server -while ($dr.Read()) { +while ($dr.Read()) { $ServerName = $dr.GetValue(0); foreach ($Policy in $PolicyStore.Policies) { @@ -80,18 +80,18 @@ while ($dr.Read()) { $OutputFile = $ResultDir + ("{0}_{1}.xml" -f (Encode-SqlName $ServerName ), (Encode-SqlName $Policy.Name)); Invoke-PolicyEvaluation -Policy $Policy -TargetServerName $ServerName -AdHocPolicyEvaluationMode $EvalMode -OutputXML > $OutputFile; $PolicyResult = Get-Content $OutputFile -encoding UTF8; - $PolicyResult = $PolicyResult -replace "'", "" + $PolicyResult = $PolicyResult -replace "'", "" PolicyHistoryInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $PolicyResult; } trap [Exception] - { - $ExceptionText = $_.Exception.Message -replace "'", "" + { + $ExceptionText = $_.Exception.Message -replace "'", "" $ExceptionMessage = $_.Exception.GetType().FullName + ", " + $ExceptionText PolicyErrorInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $ExceptionMessage; - continue; + continue; } } - } + } } $dr.Close() diff --git a/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDashboard.rdl b/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDashboard.rdl index 6780bcee..50dcc140 100644 --- a/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDashboard.rdl +++ b/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDashboard.rdl @@ -135,9 +135,9 @@ WHERE CategoryName IN (@CategoryName) AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) OR @ServerGroupName = '') -AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) +AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) AND EvaluationDateTime < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DateMonth)+1,0)) -OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) +OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) AND @DateMonth = '1900-01-01')) @@ -166,14 +166,14 @@ AND @DateMonth = '1900-01-01')) PolicyDW - SELECT CASE - WHEN EXISTS - (SELECT * - FROM policy.v_PolicyHistory_LastEvaluation iple - WHERE iple.EvaluatedServer = ple.EvaluatedServer - AND iple.PolicyResult = 'fail') + SELECT CASE + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple + WHERE iple.EvaluatedServer = ple.EvaluatedServer + AND iple.PolicyResult = 'fail') THEN 'Out of Compliance' - ELSE 'In Compliance' + ELSE 'In Compliance' END AS InstanceStatus , EvaluatedServer FROM policy.v_PolicyHistory ple @@ -1123,7 +1123,7 @@ SUM(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value - =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, + =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, Fields!PolicyResult.Value= "ERROR", 1, Fields!PolicyResult.Value= "PASS", 0)) @@ -1214,7 +1214,7 @@ Fields!PolicyResult.Value = "PASS", "Black") =Fields!PolicyResult.Value @@ -1270,7 +1270,7 @@ Fields!PolicyResult.Value = "PASS", "Black") diff --git a/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDetails.rdl b/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDetails.rdl index 2d34b38d..b1224cc2 100644 --- a/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDetails.rdl +++ b/samples/features/epm-framework/3.0/2Reporting/PolicyReports/PolicyReports/PolicyDetails.rdl @@ -61,7 +61,7 @@ PolicyDW - SELECT p.policy_id, c.name AS cName, p.name AS pName, p.date_created, p.created_by, p.date_modified, p.modified_by, p.description, p.help_text, p.help_link, p.is_enabled, + SELECT p.policy_id, c.name AS cName, p.name AS pName, p.date_created, p.created_by, p.date_modified, p.modified_by, p.description, p.help_text, p.help_link, p.is_enabled, c.policy_category_id FROM msdb.dbo.syspolicy_policies AS p INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id diff --git a/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Create_Database_Objects.sql b/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Create_Database_Objects.sql index cdda9126..f6c1e2ad 100644 --- a/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Create_Database_Objects.sql +++ b/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Create_Database_Objects.sql @@ -24,7 +24,7 @@ EXEC sys.sp_executesql N'CREATE SCHEMA [policy] AUTHORIZATION [dbo]' --Create the table to store the results from the PowerShell evaluation. IF NOT EXISTS(SELECT * FROM sys.objects WHERE type = N'U' AND name = N'PolicyHistory') -BEGIN +BEGIN CREATE TABLE [policy].[PolicyHistory]( [PolicyHistoryID] [int] IDENTITY NOT NULL , [EvaluatedServer] [nvarchar](50) NULL, @@ -38,7 +38,7 @@ BEGIN END GO IF EXISTS(SELECT * FROM sys.columns WHERE object_id = object_id('policy.policyhistory') AND name = 'PolicyResult') - BEGIN + BEGIN ALTER TABLE policy.PolicyHistory DROP COLUMN PolicyResult END @@ -51,7 +51,7 @@ GO CREATE XML INDEX IX_EvaluationResults_PROPERTY ON policy.PolicyHistory (EvaluationResults) USING XML INDEX IX_EvaluationResults -FOR PROPERTY +FOR PROPERTY GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluatedPolicy') @@ -75,7 +75,7 @@ GO --Create the table to store the error information from the failed PowerShell executions. IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = N'U' AND name = N'EvaluationErrorHistory') -BEGIN +BEGIN CREATE TABLE [policy].[EvaluationErrorHistory]( [ErrorHistoryID] [int] IDENTITY(1,1) NOT NULL, [EvaluatedServer] [nvarchar](50) NULL, @@ -150,8 +150,8 @@ GO ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY (PolicyHistoryID) REFERENCES policy.PolicyHistory - (PolicyHistoryID) - ON UPDATE CASCADE + (PolicyHistoryID) + ON UPDATE CASCADE ON DELETE CASCADE GO @@ -164,7 +164,7 @@ GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy') DROP INDEX IX_EvaluatedPolicy ON policy.PolicyHistoryDetail GO -CREATE INDEX IX_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy]) +CREATE INDEX IX_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy]) INCLUDE ([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [MonthYear], [policy_id], [CategoryName], [EvaluatedObject], [PolicyResult]) GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView') @@ -230,7 +230,7 @@ GO CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy]) GO -IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer] GO CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer]) @@ -370,8 +370,8 @@ GO --Create the function to support server selection. --The following function will support nested CMS folders for the EPM Framework. ---The function must be created in a database ON the CMS server. ---This database will also store the policy history. +--The function must be created in a database ON the CMS server. +--This database will also store the policy history. USE $(ManagementDatabase) GO @@ -381,14 +381,14 @@ GO CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128)) RETURNS TABLE AS -RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS +RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS ( - SELECT parent_id, server_group_id, name + SELECT parent_id, server_group_id, name FROM msdb.dbo.sysmanagement_shared_server_groups tg WHERE is_system_object = 0 AND (tg.name = @server_group_name OR @server_group_name = '') UNION ALL - SELECT cg.parent_id, cg.server_group_id, cg.name + SELECT cg.parent_id, cg.server_group_id, cg.name FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id ) @@ -411,14 +411,14 @@ IF @server_group_name = '' ON s.server_group_id = ssg.server_group_id END ELSE - WITH ServerGroups(parent_id, server_group_id, name) AS + WITH ServerGroups(parent_id, server_group_id, name) AS ( - SELECT parent_id, server_group_id, name + SELECT parent_id, server_group_id, name FROM msdb.dbo.sysmanagement_shared_server_groups tg WHERE is_system_object = 0 AND (tg.name = @server_group_name OR @server_group_name = '') UNION ALL - SELECT cg.parent_id, cg.server_group_id, cg.name + SELECT cg.parent_id, cg.server_group_id, cg.name FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id ) @@ -433,17 +433,17 @@ GO --Create the views which are used in the policy reports ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]')) DROP VIEW [policy].[v_ServerGroups] GO -CREATE VIEW policy.v_ServerGroups AS -WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) -AS +CREATE VIEW policy.v_ServerGroups AS +WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) +AS (SELECT parent_id , server_group_id , CAST('ALL' AS varchar(500)) - , 1 AS GroupLevel + , 1 AS GroupLevel , CAST('ALL' AS varchar(500)) AS Sort , CAST('' AS varchar(255)) AS GroupValue FROM msdb.dbo.sysmanagement_shared_server_groups tg @@ -459,18 +459,18 @@ FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id) SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue -FROM ServerGroups +FROM ServerGroups GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]')) DROP VIEW [policy].[v_PolicyHistory] GO CREATE VIEW [policy].[v_PolicyHistory] AS --The policy.v_PolicyHistory view will return all results ---and identify the policy evaluation result AS PASS, FAIL, or +--and identify the policy evaluation result AS PASS, FAIL, or --ERROR. The ERROR result indicates that the policy was not able --to evaluate against an object. SELECT PH.PolicyHistoryID @@ -487,18 +487,18 @@ SELECT PH.PolicyHistoryID FROM policy.PolicyHistoryDetail PH INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy --INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id -AND PH.EvaluatedPolicy NOT IN (SELECT spp.name - FROM msdb.dbo.syspolicy_policies spp +AND PH.EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb.dbo.syspolicy_policies spp INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id WHERE spc.name = 'Disabled') GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]')) DROP VIEW policy.v_PolicyHistory_Rank GO -CREATE VIEW policy.v_PolicyHistory_Rank +CREATE VIEW policy.v_PolicyHistory_Rank AS SELECT PolicyHistoryID , EvaluatedServer @@ -517,13 +517,13 @@ SELECT PolicyHistoryID FROM policy.v_PolicyHistory VPH GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_LastEvaluation]')) DROP VIEW policy.v_PolicyHistory_LastEvaluation GO CREATE VIEW policy.v_PolicyHistory_LastEvaluation AS ---The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. +--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. --This view requires the v_PolicyHistory view exist. SELECT PolicyHistoryID , EvaluatedServer @@ -547,9 +547,9 @@ AND NOT EXISTS( AND PH.EvaluationDateTime > VPH.EvaluationDateTime) GO ---Create a view to return all errors. +--Create a view to return all errors. --Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]')) DROP VIEW policy.v_EvaluationErrorHistory GO @@ -559,7 +559,7 @@ SELECT EEH.ErrorHistoryID , EEH.EvaluatedServer , EEH.EvaluationDateTime , EEH.EvaluatedPolicy - , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 + , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1) ELSE EEH.EvaluatedServer END @@ -589,7 +589,7 @@ GO --Create a view to return the last error for each policy against --an instance. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory_LastEvaluation]')) DROP VIEW policy.v_EvaluationErrorHistory_LastEvaluation GO @@ -610,7 +610,7 @@ SELECT ErrorHistoryID ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc FROM policy.v_EvaluationErrorHistory EEH WHERE NOT EXISTS ( - SELECT * + SELECT * FROM policy.PolicyHistoryDetail PH WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy AND PH.EvaluatedServer = EEH.EvaluatedServer @@ -688,7 +688,7 @@ SELECT PolicyHistoryID , policy_id , CategoryName , MonthYear - , PolicyHistorySource + , PolicyHistorySource FROM cteEval WHERE cteEval.[TopRank] = 1'; -- Remove duplicates @@ -722,10 +722,10 @@ SELECT PH.PolicyHistoryID , PH.EvaluatedPolicy , ''No Targets Found'' AS EvaluatedObject , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' - THEN ''FAIL'' + THEN ''FAIL'' WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> '''' THEN ''ERROR'' - ELSE ''PASS'' + ELSE ''PASS'' END) AS PolicyResult , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage , NULL AS ResultDetail diff --git a/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql b/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql index 7035124d..0c38e601 100644 --- a/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql +++ b/samples/features/epm-framework/4.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql @@ -21,7 +21,7 @@ IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[Policy DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy] GO -IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName') +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName') DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName] GO @@ -81,8 +81,8 @@ GO ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY (PolicyHistoryID) REFERENCES policy.PolicyHistory - (PolicyHistoryID) - ON UPDATE CASCADE + (PolicyHistoryID) + ON UPDATE CASCADE ON DELETE CASCADE GO @@ -149,7 +149,7 @@ GO CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy]) GO -IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer] GO CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer]) @@ -289,8 +289,8 @@ GO --Update the function to support server selection. --The following function will support nested CMS folders for the EPM Framework. ---The function must be created in a database ON the CMS server. ---This database will also store the policy history. +--The function must be created in a database ON the CMS server. +--This database will also store the policy history. USE $(ManagementDatabase) GO @@ -300,14 +300,14 @@ GO CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128)) RETURNS TABLE AS -RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS +RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS ( - SELECT parent_id, server_group_id, name + SELECT parent_id, server_group_id, name FROM msdb.dbo.sysmanagement_shared_server_groups tg WHERE is_system_object = 0 AND (tg.name = @server_group_name OR @server_group_name = '') UNION ALL - SELECT cg.parent_id, cg.server_group_id, cg.name + SELECT cg.parent_id, cg.server_group_id, cg.name FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id ) @@ -322,13 +322,13 @@ GO IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]')) DROP VIEW [policy].[v_ServerGroups] GO -CREATE VIEW policy.v_ServerGroups AS -WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) -AS +CREATE VIEW policy.v_ServerGroups AS +WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) +AS (SELECT parent_id , server_group_id , CAST('ALL' AS varchar(500)) - , 1 AS GroupLevel + , 1 AS GroupLevel , CAST('ALL' AS varchar(500)) AS Sort , CAST('' AS varchar(255)) AS GroupValue FROM msdb.dbo.sysmanagement_shared_server_groups tg @@ -344,7 +344,7 @@ FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id) SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue -FROM ServerGroups +FROM ServerGroups GO IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]')) @@ -353,7 +353,7 @@ GO CREATE VIEW [policy].[v_PolicyHistory] AS --The policy.v_PolicyHistory view will return all results ---and identify the policy evaluation result AS PASS, FAIL, or +--and identify the policy evaluation result AS PASS, FAIL, or --ERROR. The ERROR result indicates that the policy was not able --to evaluate against an object. SELECT PH.PolicyHistoryID @@ -370,8 +370,8 @@ SELECT PH.PolicyHistoryID FROM policy.PolicyHistoryDetail PH INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy --INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id -AND PH.EvaluatedPolicy NOT IN (SELECT spp.name - FROM msdb.dbo.syspolicy_policies spp +AND PH.EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb.dbo.syspolicy_policies spp INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id WHERE spc.name = 'Disabled') GO @@ -379,7 +379,7 @@ GO IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]')) DROP VIEW policy.v_PolicyHistory_Rank GO -CREATE VIEW policy.v_PolicyHistory_Rank +CREATE VIEW policy.v_PolicyHistory_Rank AS SELECT PolicyHistoryID , EvaluatedServer @@ -403,7 +403,7 @@ DROP VIEW policy.v_PolicyHistory_LastEvaluation GO CREATE VIEW policy.v_PolicyHistory_LastEvaluation AS ---The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. +--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. --This view requires the v_PolicyHistory view exist. SELECT PolicyHistoryID , EvaluatedServer @@ -427,9 +427,9 @@ AND NOT EXISTS( AND PH.EvaluationDateTime > VPH.EvaluationDateTime) GO ---Create a view to return all errors. +--Create a view to return all errors. --Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]')) DROP VIEW policy.v_EvaluationErrorHistory GO @@ -439,7 +439,7 @@ SELECT EEH.ErrorHistoryID , EEH.EvaluatedServer , EEH.EvaluationDateTime , EEH.EvaluatedPolicy - , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 + , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1) ELSE EEH.EvaluatedServer END @@ -487,7 +487,7 @@ SELECT ErrorHistoryID ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc FROM policy.v_EvaluationErrorHistory EEH WHERE NOT EXISTS ( - SELECT * + SELECT * FROM policy.PolicyHistoryDetail PH WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy AND PH.EvaluatedServer = EEH.EvaluatedServer @@ -564,7 +564,7 @@ SELECT PolicyHistoryID , policy_id , CategoryName , MonthYear - , PolicyHistorySource + , PolicyHistorySource FROM cteEval WHERE cteEval.[TopRank] = 1'; -- Remove duplicates @@ -598,10 +598,10 @@ SELECT PH.PolicyHistoryID , PH.EvaluatedPolicy , ''No Targets Found'' AS EvaluatedObject , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' - THEN ''FAIL'' + THEN ''FAIL'' WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> '''' THEN ''ERROR'' - ELSE ''PASS'' + ELSE ''PASS'' END) AS PolicyResult , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage , NULL AS ResultDetail diff --git a/samples/features/epm-framework/4.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_4.ps1 b/samples/features/epm-framework/4.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_4.ps1 index d962c387..76254160 100644 --- a/samples/features/epm-framework/4.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_4.ps1 +++ b/samples/features/epm-framework/4.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_4.ps1 @@ -7,12 +7,12 @@ param([string]$ConfigurationGroup=$(Throw ` -PolicyCategoryFilter Category"), ` [string]$EvalMode=$(Throw "Parameter missing: -EvalMode EvalMode")) -# Parameter -ConfigurationGroup specifies the +# Parameter -ConfigurationGroup specifies the # Central Management Server group to evaluate -# Parameter -PolicyCategoryFilter specifies the +# Parameter -PolicyCategoryFilter specifies the # category of policies to evaluate # Parameter -EvalMode accepts "Check" to report policy -# results, "Configure" to reconfigure any violations +# results, "Configure" to reconfigure any violations # Declare variables to define the central warehouse # in which to write the output, store the policies @@ -23,7 +23,7 @@ $ResultDir = "E:\Results\" # End of variables #Function to insert policy evaluation results into SQL Server - table policy.PolicyHistory -function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults) +function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults) { &{ $sqlQueryText = "INSERT INTO policy.PolicyHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResults')" @@ -31,12 +31,12 @@ function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $Evaluate } trap { - $ExceptionText = $_.Exception.Message -replace "'", "" + $ExceptionText = $_.Exception.Message -replace "'", "" } } #Function to insert policy evaluation errors into SQL Server - table policy.EvaluationErrorHistory -function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape) +function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape) { &{ $sqlQueryText = "INSERT INTO policy.EvaluationErrorHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResultsEscape')" @@ -49,7 +49,7 @@ function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedS } #Function to delete files from this policy only -function PolicyFileDelete($File) +function PolicyFileDelete($File) { # Delete evaluation files in the directory. Remove-Item -Path $File @@ -77,7 +77,7 @@ $dr = $cmd.ExecuteReader(); # the policies. For each server and policy, # call cmdlet to evaluate policy on server and delete xml file afterwards -while ($dr.Read()) { +while ($dr.Read()) { $ServerName = $dr.GetValue(0); foreach ($Policy in $PolicyStore.Policies) { @@ -87,22 +87,22 @@ while ($dr.Read()) { $OutputFile = $ResultDir + ("{0}_{1}.xml" -f (Encode-SqlName $ServerName ), ($Policy.Name)); Invoke-PolicyEvaluation -Policy $Policy -TargetServerName $ServerName -AdHocPolicyEvaluationMode $EvalMode -OutputXML > $OutputFile; $PolicyResult = Get-Content $OutputFile -encoding UTF8; - $PolicyResult = $PolicyResult -replace "'", "" + $PolicyResult = $PolicyResult -replace "'", "" PolicyHistoryInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $PolicyResult; $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name)); PolicyFileDelete $File; } trap [Exception] - { + { $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name)); PolicyFileDelete $File; - $ExceptionText = $_.Exception.Message -replace "'", "" + $ExceptionText = $_.Exception.Message -replace "'", "" $ExceptionMessage = $_.Exception.GetType().FullName + ", " + $ExceptionText PolicyErrorInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $ExceptionMessage; - continue; + continue; } } - } + } } $dr.Close() diff --git a/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDashboard.rdl b/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDashboard.rdl index 7becb2c0..9c0bca2b 100644 --- a/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDashboard.rdl +++ b/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDashboard.rdl @@ -137,9 +137,9 @@ AND EvaluatedPolicy IN (@EvaluatedPolicy) AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) OR @ServerGroupName = '') -AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) +AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) AND EvaluationDateTime < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DateMonth)+1,0)) -OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) +OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) AND @DateMonth = '1900-01-01')) true @@ -173,24 +173,24 @@ AND @DateMonth = '1900-01-01')) =Parameters!ServerGroupName.Value - SELECT CASE - WHEN EXISTS - (SELECT * - FROM policy.v_PolicyHistory_LastEvaluation iple + SELECT CASE + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple WHERE iple.EvaluatedServer = ple.EvaluatedServer AND iple.CategoryName IN (@CategoryName) AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) AND iple.PolicyResult = 'FAIL') THEN 'Out of Compliance' - WHEN EXISTS - (SELECT * - FROM policy.v_PolicyHistory_LastEvaluation iple + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple WHERE iple.EvaluatedServer = ple.EvaluatedServer AND iple.CategoryName IN (@CategoryName) AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) AND iple.PolicyResult = 'ERROR') THEN 'Unknown' - ELSE 'In Compliance' + ELSE 'In Compliance' END AS InstanceStatus , EvaluatedServer FROM policy.v_PolicyHistory ple @@ -1396,7 +1396,7 @@ Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value - =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, + =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, Fields!PolicyResult.Value= "ERROR", 1, Fields!PolicyResult.Value= "PASS", 0)) @@ -1497,7 +1497,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1554,7 +1554,7 @@ Fields!PolicyResult.Value = "PASS", "Black") Segoe UI 9pt g - =SWITCH(Fields!PolicyResult.Value = "FAIL", "Firebrick", + =SWITCH(Fields!PolicyResult.Value = "FAIL", "Firebrick", Fields!PolicyResult.Value = "ERROR", "Red", Fields!PolicyResult.Value = "PASS", "Black") @@ -1595,7 +1595,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1652,7 +1652,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1688,7 +1688,7 @@ Fields!PolicyResult.Value = "PASS", "Black") diff --git a/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDetails.rdl b/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDetails.rdl index e0fcd65f..acb74d9c 100644 --- a/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDetails.rdl +++ b/samples/features/epm-framework/4.0/2Reporting/PolicyReports/PolicyDetails.rdl @@ -18,7 +18,7 @@ =Parameters!pid.Value - SELECT p.policy_id, c.name AS cName, p.name AS pName, p.date_created, p.created_by, p.date_modified, p.modified_by, p.description, p.help_text, p.help_link, p.is_enabled, + SELECT p.policy_id, c.name AS cName, p.name AS pName, p.date_created, p.created_by, p.date_modified, p.modified_by, p.description, p.help_text, p.help_link, p.is_enabled, c.policy_category_id FROM msdb.dbo.syspolicy_policies AS p INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id diff --git a/samples/features/epm-framework/4.0/2Reporting/PolicyReports/ReportHistory.rsd b/samples/features/epm-framework/4.0/2Reporting/PolicyReports/ReportHistory.rsd index 5e70e06a..ea9060d9 100644 --- a/samples/features/epm-framework/4.0/2Reporting/PolicyReports/ReportHistory.rsd +++ b/samples/features/epm-framework/4.0/2Reporting/PolicyReports/ReportHistory.rsd @@ -28,8 +28,8 @@ , EvaluationDateTime , EvaluatedPolicy , EvaluatedObject - , CASE WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) - WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' + , CASE WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' WHEN EvaluatedObject = 'No Targets Found' THEN EvaluatedObject + '\' ELSE RIGHT(EvaluatedObject, CHARINDEX('\',REVERSE(EvaluatedObject))-1) + '\' END AS AggEvaluatedObject , PolicyResult @@ -43,8 +43,8 @@ AND EvaluatedPolicy IN (@EvaluatedPolicy) AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) OR @ServerGroupName = '') -AND EvaluatedPolicy NOT IN (SELECT spp.name - FROM msdb..syspolicy_policies spp +AND EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb..syspolicy_policies spp INNER JOIN msdb..syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id WHERE spc.name = 'Disabled') ORDER BY PolicyResult, EvaluatedServer diff --git a/samples/features/epm-framework/4.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql b/samples/features/epm-framework/4.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql index 9542e462..79fd3a61 100644 --- a/samples/features/epm-framework/4.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql +++ b/samples/features/epm-framework/4.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql @@ -5,8 +5,8 @@ EXEC msdb.dbo.sp_syspolicy_rename_condition @name = N'SQL Server 2005 or a Later GO /* -Notes: -Remove from "Surface Area Configuration for Database Engine 2005 and 2000 Features" condition all 2005 only features. +Notes: +Remove from "Surface Area Configuration for Database Engine 2005 and 2000 Features" condition all 2005 only features. Then change "Surface Area Configuration for Database Engine 2008 Features" to apply from SQL 2005 onwards, otherwise policy evaluation fails. */ @@ -140,7 +140,7 @@ EXEC msdb.dbo.sp_syspolicy_update_policy @name='Public Not Granted Server Permis GO -- Fix typos or extra white spaces in descriptions -EXEC msdb.dbo.sp_syspolicy_update_policy @name='SQL Server Affinity Mask', @description=N'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. +EXEC msdb.dbo.sp_syspolicy_update_policy @name='SQL Server Affinity Mask', @description=N'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. Confirms whether the setting affinity mask of server is set to zero.' GO @@ -153,7 +153,7 @@ EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Cluster Disk R http://support.microsoft.com/kb/311081' GO -EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Driver Control Error', @description=N'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. +EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Driver Control Error', @description=N'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. http://support.microsoft.com/kb/259237 http://support.microsoft.com/kb/154690' GO @@ -174,11 +174,11 @@ http://support.microsoft.com/kb/885688' GO EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log I/O Error During Hard Page Fault Error', @description=N'Detects I/O Error during hard page fault in System Log. -http://support.microsoft.com/kb/304415 +http://support.microsoft.com/kb/304415 http://support.microsoft.com/kb/305547' GO -EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Storage System I/O Timeout Error', @description=N'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. -http://support.microsoft.com/kb/259237 +EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Storage System I/O Timeout Error', @description=N'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 controlle +http://support.microsoft.com/kb/259237 http://support.microsoft.com/kb/154690' GO \ No newline at end of file diff --git a/samples/features/epm-framework/4.0/README.md b/samples/features/epm-framework/4.0/README.md index feeae570..f4b076e8 100644 --- a/samples/features/epm-framework/4.0/README.md +++ b/samples/features/epm-framework/4.0/README.md @@ -2,7 +2,7 @@ Over 4.12.1 below, EPM Framework 4.12.2 includes the following updates (as per received feedback): Fixed collation issues on views and reports -Over 4.12 below, EPM Framework 4.12.1 includes the following updates (as per received feedback): +Over 4.12 below, EPM Framework 4.12.1 includes the following updates (as per received feedback): - Update documentation with PS security related information. - Added existence check conditions to "4FixImportedPolicies" to avoid errors when not all default policies were imported. - Fixed call to evaluation details sub-report not auto selecting policies, when called from "Failed Object Count by Policy Category" chart. @@ -13,23 +13,23 @@ Over 4.12 below, EPM Framework 4.12.1 includes the following updates (as per rec - Added call to evaluation details sub-report from "Objects in Failed State" value in the top-left of the Policy Dashboard. - In PBM_Custom.zip, corrected script calling in job creation script. -Over 4.11 below, EPM Framework 4.12 includes the following updates (as per received feedback): +Over 4.11 below, EPM Framework 4.12 includes the following updates (as per received feedback): - Fixed issue with failed execution under SQL Agent PS job due to Write-Output. - Fixed issue with Invoke-PolicyEvaluation and null values. -- Added resilience with different PS versions. +- Added resilience with different PS versions. - Added server filtering options in PolicyEvaluationDetails and PolicyEvaluationErrors sub-reports. - In PBM_Custom.zip, fixed condition for "Enterprise Features" policy that generated evaluation errors. -Over 4.1 below, EPM Framework 4.11 includes the following updates (as per received feedback): +Over 4.1 below, EPM Framework 4.11 includes the following updates (as per received feedback): - Fixed sub-reports deployment fail due to failed validation. - Fixed issue in Data Loading Stored Procedure. -The EPM Framework 4.1 includes the following updates: +The EPM Framework 4.1 includes the following updates: - New PS script Improved resilience when running from CMS hosted on SQL Server 2008, 2008R2, 2012 and 2014. - Improved resilience when used with PS v2, v3 and v4. - Improved Data Loading Stored Procedure, where some policy results might not be loaded (this has been identified as active since EPM v3). -The EPM Framework 4.0 includes the following updates: +The EPM Framework 4.0 includes the following updates: - For enhanced support of large environments Reviewed database design, including views and indexing. - Redesigned data load procedure. - PowerShell execution now deletes XML files as soon as load is done - improves space usage on temp folder. @@ -40,8 +40,8 @@ Tested from SQL Server 2000 to 2014. Note: an upgrade script for all the relevant database objects is provided, supporting direct upgrade from v3 and v4. Please check the documentation for further information. We are also providing a set of scripts as an extension to the base set of Microsoft provided policies, and assumes the user has previously imported these Microsoft provided policies, as described by the "Configure/Create Policies and Centralize on the Central Management Server" section of the EPM Configuration Documentation. -These scripts have some fixes for the Microsoft provided policies, and include extra policies: -- Determining the if SQL Server instances are at the recommended SP level. Note that the condition has to be updated with proper build numbers for the policy to be current. +These scripts have some fixes for the Microsoft provided policies, and include extra policies: +- Determining the if SQL Server instances are at the recommended SP level. Note that the condition has to be updated with proper build numbers for the policy to be current. - Determining the if SQL Server instances are at the recommended CU or Hotfix. Note that the condition has to be updated with proper build numbers for the policy to be current. - Do I have log backups older than 24h? - Do I have full backups on read-write, full RM databases? @@ -54,7 +54,7 @@ These scripts have some fixes for the Microsoft provided policies, and include e - Do I have more VLFs than my rule-of-thumb? This has a 100 VLF threshold – change as appropriate. - Am I using Enterprise SKU features? Maybe I need to move a database to another server, and if it’s not an Enterprise Edition, so I must account for this? - Is Maximum Server Memory set at default? You will want to set this setting different from default. -- Is Server Memory set at a fixed value? +- Is Server Memory set at a fixed value? - Are DB Compatibility levels same as engine version? - Is Tempdb number of files appropriate? Regarding number of schedulers and if is multiple of 4? - Do TempDB data file sizes match? diff --git a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql index 1319b5b6..22b37b64 100644 --- a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql +++ b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Create_Database_Objects.sql @@ -24,7 +24,7 @@ EXEC sys.sp_executesql N'CREATE SCHEMA [policy] AUTHORIZATION [dbo]' --Create the table to store the results from the PowerShell evaluation. IF NOT EXISTS(SELECT * FROM sys.objects WHERE type = N'U' AND name = N'PolicyHistory') -BEGIN +BEGIN CREATE TABLE [policy].[PolicyHistory]( [PolicyHistoryID] [int] IDENTITY NOT NULL , [EvaluatedServer] [nvarchar](50) NULL, @@ -38,7 +38,7 @@ BEGIN END GO IF EXISTS(SELECT * FROM sys.columns WHERE object_id = object_id('policy.policyhistory') AND name = 'PolicyResult') - BEGIN + BEGIN ALTER TABLE policy.PolicyHistory DROP COLUMN PolicyResult END @@ -51,7 +51,7 @@ GO CREATE XML INDEX IX_EvaluationResults_PROPERTY ON policy.PolicyHistory (EvaluationResults) USING XML INDEX IX_EvaluationResults -FOR PROPERTY +FOR PROPERTY GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistory]') AND name = N'IX_EvaluatedPolicy') @@ -75,7 +75,7 @@ GO --Create the table to store the error information from the failed PowerShell executions. IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = N'U' AND name = N'EvaluationErrorHistory') -BEGIN +BEGIN CREATE TABLE [policy].[EvaluationErrorHistory]( [ErrorHistoryID] [int] IDENTITY(1,1) NOT NULL, [EvaluatedServer] [nvarchar](50) NULL, @@ -150,8 +150,8 @@ GO ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY (PolicyHistoryID) REFERENCES policy.PolicyHistory - (PolicyHistoryID) - ON UPDATE CASCADE + (PolicyHistoryID) + ON UPDATE CASCADE ON DELETE CASCADE GO @@ -164,7 +164,7 @@ GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_EvaluatedPolicy') DROP INDEX IX_EvaluatedPolicy ON policy.PolicyHistoryDetail GO -CREATE INDEX IX_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy]) +CREATE INDEX IX_EvaluatedPolicy ON [policy].[PolicyHistoryDetail] ([EvaluatedPolicy]) INCLUDE ([PolicyHistoryID], [EvaluatedServer], [EvaluationDateTime], [MonthYear], [policy_id], [CategoryName], [EvaluatedObject], [PolicyResult]) GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = N'IX_PolicyHistoryView') @@ -230,7 +230,7 @@ GO CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy]) GO -IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer] GO CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer]) @@ -370,8 +370,8 @@ GO --Create the function to support server selection. --The following function will support nested CMS folders for the EPM Framework. ---The function must be created in a database ON the CMS server. ---This database will also store the policy history. +--The function must be created in a database ON the CMS server. +--This database will also store the policy history. USE $(ManagementDatabase) GO @@ -381,14 +381,14 @@ GO CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128)) RETURNS TABLE AS -RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS +RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS ( - SELECT parent_id, server_group_id, name + SELECT parent_id, server_group_id, name FROM msdb.dbo.sysmanagement_shared_server_groups tg WHERE is_system_object = 0 AND (tg.name = @server_group_name OR @server_group_name = '') UNION ALL - SELECT cg.parent_id, cg.server_group_id, cg.name + SELECT cg.parent_id, cg.server_group_id, cg.name FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id ) @@ -411,14 +411,14 @@ IF @server_group_name = '' ON s.server_group_id = ssg.server_group_id END ELSE - WITH ServerGroups(parent_id, server_group_id, name) AS + WITH ServerGroups(parent_id, server_group_id, name) AS ( - SELECT parent_id, server_group_id, name + SELECT parent_id, server_group_id, name FROM msdb.dbo.sysmanagement_shared_server_groups tg WHERE is_system_object = 0 AND (tg.name = @server_group_name OR @server_group_name = '') UNION ALL - SELECT cg.parent_id, cg.server_group_id, cg.name + SELECT cg.parent_id, cg.server_group_id, cg.name FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id ) @@ -433,17 +433,17 @@ GO --Create the views which are used in the policy reports ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]')) DROP VIEW [policy].[v_ServerGroups] GO -CREATE VIEW policy.v_ServerGroups AS -WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) -AS +CREATE VIEW policy.v_ServerGroups AS +WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) +AS (SELECT parent_id , server_group_id , CAST('ALL' AS varchar(500)) - , 1 AS GroupLevel + , 1 AS GroupLevel , CAST('ALL' AS varchar(500)) AS Sort , CAST('' AS varchar(255)) AS GroupValue FROM msdb.dbo.sysmanagement_shared_server_groups tg @@ -459,18 +459,18 @@ FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id) SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue -FROM ServerGroups +FROM ServerGroups GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]')) DROP VIEW [policy].[v_PolicyHistory] GO CREATE VIEW [policy].[v_PolicyHistory] AS --The policy.v_PolicyHistory view will return all results ---and identify the policy evaluation result AS PASS, FAIL, or +--and identify the policy evaluation result AS PASS, FAIL, or --ERROR. The ERROR result indicates that the policy was not able --to evaluate against an object. SELECT PH.PolicyHistoryID @@ -487,18 +487,18 @@ SELECT PH.PolicyHistoryID FROM policy.PolicyHistoryDetail PH INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy --INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id -AND PH.EvaluatedPolicy NOT IN (SELECT spp.name - FROM msdb.dbo.syspolicy_policies spp +AND PH.EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb.dbo.syspolicy_policies spp INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id WHERE spc.name = 'Disabled') GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]')) DROP VIEW policy.v_PolicyHistory_Rank GO -CREATE VIEW policy.v_PolicyHistory_Rank +CREATE VIEW policy.v_PolicyHistory_Rank AS SELECT PolicyHistoryID , EvaluatedServer @@ -517,13 +517,13 @@ SELECT PolicyHistoryID FROM policy.v_PolicyHistory VPH GO ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_LastEvaluation]')) DROP VIEW policy.v_PolicyHistory_LastEvaluation GO CREATE VIEW policy.v_PolicyHistory_LastEvaluation AS ---The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. +--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. --This view requires the v_PolicyHistory view exist. SELECT PolicyHistoryID , EvaluatedServer @@ -547,9 +547,9 @@ AND NOT EXISTS( AND PH.EvaluationDateTime > VPH.EvaluationDateTime) GO ---Create a view to return all errors. +--Create a view to return all errors. --Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]')) DROP VIEW policy.v_EvaluationErrorHistory GO @@ -559,7 +559,7 @@ SELECT EEH.ErrorHistoryID , EEH.EvaluatedServer , EEH.EvaluationDateTime , EEH.EvaluatedPolicy - , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 + , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1) ELSE EEH.EvaluatedServer END @@ -577,10 +577,10 @@ SELECT PolicyHistoryID , EvaluatedServer , EvaluationDateTime , EvaluatedPolicy - , CASE WHEN CHARINDEX('\', REVERSE(EvaluatedObject)) >0 - THEN RIGHT(EvaluatedObject,CHARINDEX('\', REVERSE(EvaluatedObject)) - 1) - ELSE EvaluatedObject - END + , CASE WHEN CHARINDEX('\', REVERSE(EvaluatedObject)) >0 + THEN RIGHT(EvaluatedObject,CHARINDEX('\', REVERSE(EvaluatedObject)) - 1) + ELSE EvaluatedObject + END AS EvaluatedObject , ExceptionMessage , policy_id @@ -593,7 +593,7 @@ GO --Create a view to return the last error for each policy against --an instance. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory_LastEvaluation]')) DROP VIEW policy.v_EvaluationErrorHistory_LastEvaluation GO @@ -614,7 +614,7 @@ SELECT ErrorHistoryID ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc FROM policy.v_EvaluationErrorHistory EEH WHERE NOT EXISTS ( - SELECT * + SELECT * FROM policy.PolicyHistoryDetail PH WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy AND PH.EvaluatedServer = EEH.EvaluatedServer @@ -692,7 +692,7 @@ SELECT PolicyHistoryID , policy_id , CategoryName , MonthYear - , PolicyHistorySource + , PolicyHistorySource FROM cteEval WHERE cteEval.[TopRank] = 1'; -- Remove duplicates @@ -726,10 +726,10 @@ SELECT PH.PolicyHistoryID , PH.EvaluatedPolicy , ''No Targets Found'' AS EvaluatedObject , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' - THEN ''FAIL'' + THEN ''FAIL'' WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> '''' THEN ''ERROR'' - ELSE ''PASS'' + ELSE ''PASS'' END) AS PolicyResult , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage , NULL AS ResultDetail diff --git a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql index 7035124d..0c38e601 100644 --- a/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql +++ b/samples/features/epm-framework/5.0/0Setup Scripts/EPM_Upgrade_Database_Objects.sql @@ -21,7 +21,7 @@ IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[Policy DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_EvaluatedPolicy] GO -IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName') +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName') DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName] GO @@ -81,8 +81,8 @@ GO ALTER TABLE policy.PolicyHistoryDetail ADD CONSTRAINT FK_PolicyHistoryDetail_PolicyHistory FOREIGN KEY (PolicyHistoryID) REFERENCES policy.PolicyHistory - (PolicyHistoryID) - ON UPDATE CASCADE + (PolicyHistoryID) + ON UPDATE CASCADE ON DELETE CASCADE GO @@ -149,7 +149,7 @@ GO CREATE STATISTICS [Stat_EvaluationDateTime_EvaluatedPolicy] ON [policy].[PolicyHistoryDetail]([EvaluationDateTime], [EvaluatedPolicy]) GO -IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') +IF EXISTS(SELECT * FROM sys.stats WHERE object_id = OBJECT_ID(N'[policy].[PolicyHistoryDetail]') AND name = 'Stat_CategoryName_EvaluatedServer') DROP STATISTICS policy.[PolicyHistoryDetail].[Stat_CategoryName_EvaluatedServer] GO CREATE STATISTICS [Stat_CategoryName_EvaluatedServer] ON [policy].[PolicyHistoryDetail] ([CategoryName], [EvaluatedServer]) @@ -289,8 +289,8 @@ GO --Update the function to support server selection. --The following function will support nested CMS folders for the EPM Framework. ---The function must be created in a database ON the CMS server. ---This database will also store the policy history. +--The function must be created in a database ON the CMS server. +--This database will also store the policy history. USE $(ManagementDatabase) GO @@ -300,14 +300,14 @@ GO CREATE FUNCTION [policy].[pfn_ServerGroupInstances] (@server_group_name NVARCHAR(128)) RETURNS TABLE AS -RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS +RETURN(WITH ServerGroups(parent_id, server_group_id, name) AS ( - SELECT parent_id, server_group_id, name + SELECT parent_id, server_group_id, name FROM msdb.dbo.sysmanagement_shared_server_groups tg WHERE is_system_object = 0 AND (tg.name = @server_group_name OR @server_group_name = '') UNION ALL - SELECT cg.parent_id, cg.server_group_id, cg.name + SELECT cg.parent_id, cg.server_group_id, cg.name FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id ) @@ -322,13 +322,13 @@ GO IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_ServerGroups]')) DROP VIEW [policy].[v_ServerGroups] GO -CREATE VIEW policy.v_ServerGroups AS -WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) -AS +CREATE VIEW policy.v_ServerGroups AS +WITH ServerGroups(parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue) +AS (SELECT parent_id , server_group_id , CAST('ALL' AS varchar(500)) - , 1 AS GroupLevel + , 1 AS GroupLevel , CAST('ALL' AS varchar(500)) AS Sort , CAST('' AS varchar(255)) AS GroupValue FROM msdb.dbo.sysmanagement_shared_server_groups tg @@ -344,7 +344,7 @@ FROM msdb.dbo.sysmanagement_shared_server_groups cg INNER JOIN ServerGroups pg ON cg.parent_id = pg.server_group_id) SELECT parent_id, server_group_id, GroupName, GroupLevel, Sort, GroupValue -FROM ServerGroups +FROM ServerGroups GO IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory]')) @@ -353,7 +353,7 @@ GO CREATE VIEW [policy].[v_PolicyHistory] AS --The policy.v_PolicyHistory view will return all results ---and identify the policy evaluation result AS PASS, FAIL, or +--and identify the policy evaluation result AS PASS, FAIL, or --ERROR. The ERROR result indicates that the policy was not able --to evaluate against an object. SELECT PH.PolicyHistoryID @@ -370,8 +370,8 @@ SELECT PH.PolicyHistoryID FROM policy.PolicyHistoryDetail PH INNER JOIN msdb.dbo.syspolicy_policies AS p ON p.name = PH.EvaluatedPolicy --INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id -AND PH.EvaluatedPolicy NOT IN (SELECT spp.name - FROM msdb.dbo.syspolicy_policies spp +AND PH.EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb.dbo.syspolicy_policies spp INNER JOIN msdb.dbo.syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id WHERE spc.name = 'Disabled') GO @@ -379,7 +379,7 @@ GO IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_PolicyHistory_Rank]')) DROP VIEW policy.v_PolicyHistory_Rank GO -CREATE VIEW policy.v_PolicyHistory_Rank +CREATE VIEW policy.v_PolicyHistory_Rank AS SELECT PolicyHistoryID , EvaluatedServer @@ -403,7 +403,7 @@ DROP VIEW policy.v_PolicyHistory_LastEvaluation GO CREATE VIEW policy.v_PolicyHistory_LastEvaluation AS ---The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. +--The policy.v_PolicyHistory_LastEvaluation view will the last result for any given policy evaluated against an object. --This view requires the v_PolicyHistory view exist. SELECT PolicyHistoryID , EvaluatedServer @@ -427,9 +427,9 @@ AND NOT EXISTS( AND PH.EvaluationDateTime > VPH.EvaluationDateTime) GO ---Create a view to return all errors. +--Create a view to return all errors. --Errors will be returned from the table EvaluationErrorHistory and the errors in the PolicyHistory table. ---Drop the view if it exists. +--Drop the view if it exists. IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[policy].[v_EvaluationErrorHistory]')) DROP VIEW policy.v_EvaluationErrorHistory GO @@ -439,7 +439,7 @@ SELECT EEH.ErrorHistoryID , EEH.EvaluatedServer , EEH.EvaluationDateTime , EEH.EvaluatedPolicy - , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 + , CASE WHEN CHARINDEX('\', EEH.EvaluatedServer) > 0 THEN RIGHT(EEH.EvaluatedServer, CHARINDEX('\', REVERSE(EEH.EvaluatedServer)) - 1) ELSE EEH.EvaluatedServer END @@ -487,7 +487,7 @@ SELECT ErrorHistoryID ORDER BY EvaluationDateTime DESC)AS EvaluationOrderDesc FROM policy.v_EvaluationErrorHistory EEH WHERE NOT EXISTS ( - SELECT * + SELECT * FROM policy.PolicyHistoryDetail PH WHERE PH.EvaluatedPolicy = EEH.EvaluatedPolicy AND PH.EvaluatedServer = EEH.EvaluatedServer @@ -564,7 +564,7 @@ SELECT PolicyHistoryID , policy_id , CategoryName , MonthYear - , PolicyHistorySource + , PolicyHistorySource FROM cteEval WHERE cteEval.[TopRank] = 1'; -- Remove duplicates @@ -598,10 +598,10 @@ SELECT PH.PolicyHistoryID , PH.EvaluatedPolicy , ''No Targets Found'' AS EvaluatedObject , (CASE WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') = '''' - THEN ''FAIL'' + THEN ''FAIL'' WHEN Res.Expr.value(''(../DMF:Result)[1]'', ''nvarchar(150)'')= ''FALSE'' AND Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'')<> '''' THEN ''ERROR'' - ELSE ''PASS'' + ELSE ''PASS'' END) AS PolicyResult , Expr.value(''(../DMF:Exception)[1]'', ''nvarchar(max)'') AS ExceptionMessage , NULL AS ResultDetail diff --git a/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 b/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 index cf12aa07..660a2a50 100644 --- a/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 +++ b/samples/features/epm-framework/5.0/1Down Version Evaluation PS/EPM_EnterpriseEvaluation_5.ps1 @@ -1,7 +1,7 @@ # Evaluate specific Policies against a Server List # Uses the Invoke-PolicyEvaluation Cmdlet -#SAMPLE: #.\EPM_EnterpriseEvaluation_5.ps1 -ConfigurationGroup "DEV" -PolicyCategoryFilter "Name Pattern" –EvalMode “Check” +#SAMPLE: #.\EPM_EnterpriseEvaluation_5.ps1 -ConfigurationGroup "DEV" -PolicyCategoryFilter "Name Pattern" �EvalMode �Check� <# Run Powershell ISE as Admin @@ -25,12 +25,12 @@ param([string]$ConfigurationGroup=$(Throw ` Remove-Module SQLPS -Force -ErrorAction SilentlyContinue Import-Module SqlServer -DisableNameChecking -MinimumVersion "21.0.171.78" -# Parameter -ConfigurationGroup specifies the +# Parameter -ConfigurationGroup specifies the # Central Management Server group to evaluate -# Parameter -PolicyCategoryFilter specifies the +# Parameter -PolicyCategoryFilter specifies the # category of policies to evaluate # Parameter -EvalMode accepts "Check" to report policy -# results, "Configure" to reconfigure any violations +# results, "Configure" to reconfigure any violations # Declare variables to define the central warehouse # in which to write the output, store the policies @@ -41,7 +41,7 @@ $ResultDir = "E:\Results\" # End of variables #Function to insert policy evaluation results into SQL Server - table policy.PolicyHistory -function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults) +function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResults) { &{ $sqlQueryText = "INSERT INTO policy.PolicyHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResults')" @@ -49,12 +49,12 @@ function PolicyHistoryInsert($sqlServerVariable, $sqlDatabaseVariable, $Evaluate } trap { - $ExceptionText = $_.Exception.Message -replace "'", "" + $ExceptionText = $_.Exception.Message -replace "'", "" } } #Function to insert policy evaluation errors into SQL Server - table policy.EvaluationErrorHistory -function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape) +function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedServer, $EvaluatedPolicy, $EvaluationResultsEscape) { &{ $sqlQueryText = "INSERT INTO policy.EvaluationErrorHistory (EvaluatedServer, EvaluatedPolicy, EvaluationResults) VALUES(N'$EvaluatedServer', N'$EvaluatedPolicy', N'$EvaluationResultsEscape')" @@ -67,7 +67,7 @@ function PolicyErrorInsert($sqlServerVariable, $sqlDatabaseVariable, $EvaluatedS } #Function to delete files from this policy only -function PolicyFileDelete($File) +function PolicyFileDelete($File) { # Delete evaluation files in the directory. Remove-Item -Path $File @@ -95,7 +95,7 @@ $dr = $cmd.ExecuteReader(); # the policies. For each server and policy, # call cmdlet to evaluate policy on server and delete xml file afterwards -while ($dr.Read()) { +while ($dr.Read()) { $ServerName = $dr.GetValue(0); foreach ($Policy in $PolicyStore.Policies) { @@ -105,22 +105,22 @@ while ($dr.Read()) { $OutputFile = $ResultDir + ("{0}_{1}.xml" -f (Encode-SqlName $ServerName ), ($Policy.Name)); Invoke-PolicyEvaluation -Policy $Policy -TargetServerName $ServerName -AdHocPolicyEvaluationMode $EvalMode -OutputXML > $OutputFile; $PolicyResult = Get-Content $OutputFile -encoding UTF8; - $PolicyResult = $PolicyResult -replace "'", "" + $PolicyResult = $PolicyResult -replace "'", "" PolicyHistoryInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $PolicyResult; $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name)); PolicyFileDelete $File; } trap [Exception] - { + { $File = $ResultDir + ("*_{0}.xml" -f ($Policy.Name)); PolicyFileDelete $File; - $ExceptionText = $_.Exception.Message -replace "'", "" + $ExceptionText = $_.Exception.Message -replace "'", "" $ExceptionMessage = $_.Exception.GetType().FullName + ", " + $ExceptionText PolicyErrorInsert $CentralManagementServer $HistoryDatabase $ServerName $Policy.Name $ExceptionMessage; - continue; + continue; } } - } + } } $dr.Close() diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl index 6f88fc78..bdbe92c6 100644 --- a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl @@ -137,9 +137,9 @@ AND EvaluatedPolicy IN (@EvaluatedPolicy) AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) OR @ServerGroupName = '') -AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) +AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) AND EvaluationDateTime < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DateMonth)+1,0)) -OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) +OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) AND @DateMonth = '1900-01-01')) true @@ -173,24 +173,24 @@ AND @DateMonth = '1900-01-01')) =Parameters!ServerGroupName.Value - SELECT CASE - WHEN EXISTS - (SELECT * - FROM policy.v_PolicyHistory_LastEvaluation iple + SELECT CASE + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple WHERE iple.EvaluatedServer = ple.EvaluatedServer AND iple.CategoryName IN (@CategoryName) AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) AND iple.PolicyResult = 'FAIL') THEN 'Out of Compliance' - WHEN EXISTS - (SELECT * - FROM policy.v_PolicyHistory_LastEvaluation iple + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple WHERE iple.EvaluatedServer = ple.EvaluatedServer AND iple.CategoryName IN (@CategoryName) AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) AND iple.PolicyResult = 'ERROR') THEN 'Unknown' - ELSE 'In Compliance' + ELSE 'In Compliance' END AS InstanceStatus , EvaluatedServer FROM policy.v_PolicyHistory ple @@ -1402,7 +1402,7 @@ Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value - =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, + =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, Fields!PolicyResult.Value= "ERROR", 1, Fields!PolicyResult.Value= "PASS", 0)) @@ -1503,7 +1503,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1560,7 +1560,7 @@ Fields!PolicyResult.Value = "PASS", "Black") Segoe UI 9pt g - =SWITCH(Fields!PolicyResult.Value = "FAIL", "Firebrick", + =SWITCH(Fields!PolicyResult.Value = "FAIL", "Firebrick", Fields!PolicyResult.Value = "ERROR", "Red", Fields!PolicyResult.Value = "PASS", "Black") @@ -1601,7 +1601,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1658,7 +1658,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1694,7 +1694,7 @@ Fields!PolicyResult.Value = "PASS", "Black") diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl index daecf3c9..0fa6a857 100644 --- a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl @@ -27,18 +27,18 @@ =Parameters!Object.Value - SELECT + SELECT * ,SUBSTRING (AggEvaluatedObject, 0, CHARINDEX('\',AggEvaluatedObject)) AggEvaluatedObject_First FROM ( - SELECT + SELECT EvaluatedServer , EvaluationDateTime , EvaluatedPolicy , EvaluatedObject - , CASE WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) - WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' + , CASE WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' WHEN EvaluatedObject = 'No Targets Found' THEN EvaluatedObject + '\' ELSE RIGHT(EvaluatedObject, CHARINDEX('\',REVERSE(EvaluatedObject))-1) + '\' END AS AggEvaluatedObject , PolicyResult @@ -50,8 +50,8 @@ FROM WHERE CategoryName IN (@CategoryName) AND EvaluatedPolicy IN (@EvaluatedPolicy) AND EvaluatedServer IN (@ServerName) - AND EvaluatedPolicy NOT IN (SELECT spp.name - FROM msdb..syspolicy_policies spp + AND EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb..syspolicy_policies spp INNER JOIN msdb..syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id WHERE spc.name = 'Disabled') ) A @@ -173,9 +173,9 @@ AND EvaluatedPolicy IN (@EvaluatedPolicy) AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) OR @ServerGroupName = '') -AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) +AND (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, @DateMonth))+1, CAST(DateAdd(Month, -6, @DateMonth) AS DATE)) AND EvaluationDateTime < DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DateMonth)+1,0)) -OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) +OR (EvaluationDateTime >= DATEADD(d,-day(DateAdd(Month, -6, GETDATE()))+1, CAST(DateAdd(Month, -6, GETDATE()) AS DATE)) AND @DateMonth = '1900-01-01')) true @@ -209,24 +209,24 @@ AND @DateMonth = '1900-01-01')) =Parameters!ServerGroupName.Value - SELECT CASE - WHEN EXISTS - (SELECT * - FROM policy.v_PolicyHistory_LastEvaluation iple + SELECT CASE + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple WHERE iple.EvaluatedServer = ple.EvaluatedServer AND iple.CategoryName IN (@CategoryName) AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) AND iple.PolicyResult = 'FAIL') THEN 'Out of Compliance' - WHEN EXISTS - (SELECT * - FROM policy.v_PolicyHistory_LastEvaluation iple + WHEN EXISTS + (SELECT * + FROM policy.v_PolicyHistory_LastEvaluation iple WHERE iple.EvaluatedServer = ple.EvaluatedServer AND iple.CategoryName IN (@CategoryName) AND iple.EvaluatedPolicy IN (@EvaluatedPolicy) AND iple.PolicyResult = 'ERROR') THEN 'Unknown' - ELSE 'In Compliance' + ELSE 'In Compliance' END AS InstanceStatus , EvaluatedServer FROM policy.v_PolicyHistory ple @@ -325,7 +325,7 @@ WHERE CategoryName IN (@CategoryName) SELECT DISTINCT [EvaluatedServer] FROM [policy].[PolicyHistoryDetail] -WHERE +WHERE (EvaluatedServer COLLATE SQL_Latin1_General_CP1_CI_AI IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) OR @ServerGroupName = '') ORDER BY [EvaluatedServer] @@ -349,15 +349,15 @@ ORDER BY [EvaluatedServer] SUBSTRING (AggEvaluatedObject, 0, CHARINDEX('\',AggEvaluatedObject)) AggEvaluatedObject_First FROM ( - SELECT - CASE - WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) - WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' + SELECT + CASE + WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' WHEN EvaluatedObject = 'No Targets Found' THEN EvaluatedObject + '\' - ELSE RIGHT(EvaluatedObject, CHARINDEX('\',REVERSE(EvaluatedObject))-1) + '\' + ELSE RIGHT(EvaluatedObject, CHARINDEX('\',REVERSE(EvaluatedObject))-1) + '\' END AS AggEvaluatedObject FROM [policy].[PolicyHistoryDetail] - WHERE + WHERE EvaluatedServer IN (@ServerName) ) A ORDER BY AggEvaluatedObject_First @@ -1492,7 +1492,7 @@ Sum(IIF(Fields!PolicyResult.Value="FAIL", 1, 0))/COUNT(Fields!PolicyResult.Value - =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, + =SUM(SWITCH(Fields!PolicyResult.Value= "FAIL", 1, Fields!PolicyResult.Value= "ERROR", 1, Fields!PolicyResult.Value= "PASS", 0)) @@ -1593,7 +1593,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1650,7 +1650,7 @@ Fields!PolicyResult.Value = "PASS", "Black") Segoe UI 9pt g - =SWITCH(Fields!PolicyResult.Value = "FAIL", "Firebrick", + =SWITCH(Fields!PolicyResult.Value = "FAIL", "Firebrick", Fields!PolicyResult.Value = "ERROR", "Red", Fields!PolicyResult.Value = "PASS", "Black") @@ -1691,7 +1691,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1748,7 +1748,7 @@ Fields!PolicyResult.Value = "PASS", "Black") @@ -1784,7 +1784,7 @@ Fields!PolicyResult.Value = "PASS", "Black") diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl index e0fcd65f..acb74d9c 100644 --- a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl @@ -18,7 +18,7 @@ =Parameters!pid.Value - SELECT p.policy_id, c.name AS cName, p.name AS pName, p.date_created, p.created_by, p.date_modified, p.modified_by, p.description, p.help_text, p.help_link, p.is_enabled, + SELECT p.policy_id, c.name AS cName, p.name AS pName, p.date_created, p.created_by, p.date_modified, p.modified_by, p.description, p.help_text, p.help_link, p.is_enabled, c.policy_category_id FROM msdb.dbo.syspolicy_policies AS p INNER JOIN msdb.dbo.syspolicy_policy_categories AS c ON p.policy_category_id = c.policy_category_id diff --git a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/ReportHistory.rsd b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/ReportHistory.rsd index 5e70e06a..ea9060d9 100644 --- a/samples/features/epm-framework/5.0/2Reporting/PolicyReports/ReportHistory.rsd +++ b/samples/features/epm-framework/5.0/2Reporting/PolicyReports/ReportHistory.rsd @@ -28,8 +28,8 @@ , EvaluationDateTime , EvaluatedPolicy , EvaluatedObject - , CASE WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) - WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' + , CASE WHEN EvaluatedObject LIKE '%Databases\%\' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + WHEN EvaluatedObject LIKE '%Databases\%' THEN RIGHT(EvaluatedObject, CHARINDEX('\sesabataD',REVERSE(EvaluatedObject))-1) + '\' WHEN EvaluatedObject = 'No Targets Found' THEN EvaluatedObject + '\' ELSE RIGHT(EvaluatedObject, CHARINDEX('\',REVERSE(EvaluatedObject))-1) + '\' END AS AggEvaluatedObject , PolicyResult @@ -43,8 +43,8 @@ AND EvaluatedPolicy IN (@EvaluatedPolicy) AND (EvaluatedServer IN (SELECT server_name FROM policy.pfn_ServerGroupInstances(@ServerGroupName)) OR @ServerGroupName = '') -AND EvaluatedPolicy NOT IN (SELECT spp.name - FROM msdb..syspolicy_policies spp +AND EvaluatedPolicy NOT IN (SELECT spp.name + FROM msdb..syspolicy_policies spp INNER JOIN msdb..syspolicy_policy_categories spc ON spp.policy_category_id = spc.policy_category_id WHERE spc.name = 'Disabled') ORDER BY PolicyResult, EvaluatedServer diff --git a/samples/features/epm-framework/5.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql b/samples/features/epm-framework/5.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql index 9542e462..79fd3a61 100644 --- a/samples/features/epm-framework/5.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql +++ b/samples/features/epm-framework/5.0/4FixImportedPolicies/PBM_Fix_ImportedPolicies.sql @@ -5,8 +5,8 @@ EXEC msdb.dbo.sp_syspolicy_rename_condition @name = N'SQL Server 2005 or a Later GO /* -Notes: -Remove from "Surface Area Configuration for Database Engine 2005 and 2000 Features" condition all 2005 only features. +Notes: +Remove from "Surface Area Configuration for Database Engine 2005 and 2000 Features" condition all 2005 only features. Then change "Surface Area Configuration for Database Engine 2008 Features" to apply from SQL 2005 onwards, otherwise policy evaluation fails. */ @@ -140,7 +140,7 @@ EXEC msdb.dbo.sp_syspolicy_update_policy @name='Public Not Granted Server Permis GO -- Fix typos or extra white spaces in descriptions -EXEC msdb.dbo.sp_syspolicy_update_policy @name='SQL Server Affinity Mask', @description=N'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. +EXEC msdb.dbo.sp_syspolicy_update_policy @name='SQL Server Affinity Mask', @description=N'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. Confirms whether the setting affinity mask of server is set to zero.' GO @@ -153,7 +153,7 @@ EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Cluster Disk R http://support.microsoft.com/kb/311081' GO -EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Driver Control Error', @description=N'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. +EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Driver Control Error', @description=N'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. http://support.microsoft.com/kb/259237 http://support.microsoft.com/kb/154690' GO @@ -174,11 +174,11 @@ http://support.microsoft.com/kb/885688' GO EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log I/O Error During Hard Page Fault Error', @description=N'Detects I/O Error during hard page fault in System Log. -http://support.microsoft.com/kb/304415 +http://support.microsoft.com/kb/304415 http://support.microsoft.com/kb/305547' GO -EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Storage System I/O Timeout Error', @description=N'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. -http://support.microsoft.com/kb/259237 +EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Storage System I/O Timeout Error', @description=N'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 controlle +http://support.microsoft.com/kb/259237 http://support.microsoft.com/kb/154690' GO \ No newline at end of file diff --git a/samples/features/epm-framework/5.0/4FixImportedPolicies/SQL Policy Management - Name Pattern.sql b/samples/features/epm-framework/5.0/4FixImportedPolicies/SQL Policy Management - Name Pattern.sql index 3eaa52d3..0581b945 100644 --- a/samples/features/epm-framework/5.0/4FixImportedPolicies/SQL Policy Management - Name Pattern.sql +++ b/samples/features/epm-framework/5.0/4FixImportedPolicies/SQL Policy Management - Name Pattern.sql @@ -1,15 +1,15 @@ /* -This Sample Code is provided for the purpose of illustration only and is not intended to be used in a production environment. -THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. -We grant You a nonexclusive, royalty-free right to use and modify the Sample Code and to reproduce and distribute -the object code form of the Sample Code, provided that You agree: -(i) to not use Our name, logo, or trademarks to market Your software product in which the Sample Code is embedded; -(ii) to include a valid copyright notice on Your software product in which the Sample Code is embedded; and -(iii) to indentify, hold harmless, and defend Us and Our suppliers from and against any claims or lawsuits, +This Sample Code is provided for the purpose of illustration only and is not intended to be used in a production environment. +THIS SAMPLE CODE AND ANY RELATED INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +We grant You a nonexclusive, royalty-free right to use and modify the Sample Code and to reproduce and distribute +the object code form of the Sample Code, provided that You agree: +(i) to not use Our name, logo, or trademarks to market Your software product in which the Sample Code is embedded; +(ii) to include a valid copyright notice on Your software product in which the Sample Code is embedded; and +(iii) to indentify, hold harmless, and defend Us and Our suppliers from and against any claims or lawsuits, including attorneys' fees, that arise or result from the use or distribution of the Sample Code. -Please note: None of the conditions outlined in the disclaimer above will supersede the terms and +Please note: None of the conditions outlined in the disclaimer above will supersede the terms and conditions contained within the Premier Customer Services Description. */ @@ -19,21 +19,21 @@ GO -------------------------------------------------------------------------------------------------------------------------------------------- --POLICY CATEGORY: Name Pattern -DECLARE @policy_category_id int; +DECLARE @policy_category_id int; -SELECT @policy_category_id = policy_category_id FROM dbo.syspolicy_policy_categories where name = N'Name_Pattern' +SELECT @policy_category_id = policy_category_id FROM dbo.syspolicy_policy_categories where name = N'Name_Pattern' IF (@policy_category_id IS NULL) BEGIN - EXEC msdb.dbo.sp_syspolicy_add_policy_category - @name = N'Name_Pattern' + EXEC msdb.dbo.sp_syspolicy_add_policy_category + @name = N'Name_Pattern' , @mandate_database_subscriptions = 1 - , @policy_category_id = @policy_category_id OUTPUT; + , @policy_category_id = @policy_category_id OUTPUT; END SELECT @policy_category_id as NEW_policy_category_id -GO +GO /* -------------------------------------------------------------------------------------------------------------------------------------------- --DELETE ALL POLICIES @@ -41,22 +41,22 @@ DECLARE @policy_id INT DECLARE CURSOR_POLICIES_TO_DELETE CURSOR FAST_FORWARD FOR SELECT policy_id FROM dbo.syspolicy_policies P - INNER JOIN dbo.syspolicy_policy_categories PC + INNER JOIN dbo.syspolicy_policy_categories PC ON P.policy_category_id = PC.policy_category_id WHERE PC.[name] = N'Name_Pattern' -OPEN CURSOR_POLICIES_TO_DELETE +OPEN CURSOR_POLICIES_TO_DELETE -FETCH NEXT FROM CURSOR_POLICIES_TO_DELETE -INTO @policy_id +FETCH NEXT FROM CURSOR_POLICIES_TO_DELETE +INTO @policy_id -WHILE @@FETCH_STATUS = 0 -BEGIN +WHILE @@FETCH_STATUS = 0 +BEGIN EXEC msdb.dbo.sp_syspolicy_delete_policy @policy_id=@policy_id - FETCH NEXT FROM CURSOR_POLICIES_TO_DELETE - INTO @policy_id -END + FETCH NEXT FROM CURSOR_POLICIES_TO_DELETE + INTO @policy_id +END CLOSE CURSOR_POLICIES_TO_DELETE DEALLOCATE CURSOR_POLICIES_TO_DELETE @@ -72,13 +72,13 @@ DECLARE @target_set_id INT DECLARE CURSOR_OBJECTS_SETS_TO_DELETE CURSOR FAST_FORWARD FOR SELECT object_set_id FROM dbo.syspolicy_object_sets where is_system = 0 -OPEN CURSOR_OBJECTS_SETS_TO_DELETE +OPEN CURSOR_OBJECTS_SETS_TO_DELETE -FETCH NEXT FROM CURSOR_OBJECTS_SETS_TO_DELETE -INTO @object_set_id +FETCH NEXT FROM CURSOR_OBJECTS_SETS_TO_DELETE +INTO @object_set_id -WHILE @@FETCH_STATUS = 0 -BEGIN +WHILE @@FETCH_STATUS = 0 +BEGIN BEGIN TRY EXEC msdb.dbo.sp_syspolicy_delete_object_set @object_set_id=@object_set_id @@ -95,9 +95,9 @@ BEGIN PRINT ERROR_MESSAGE() END CATCH - FETCH NEXT FROM CURSOR_OBJECTS_SETS_TO_DELETE - INTO @object_set_id -END + FETCH NEXT FROM CURSOR_OBJECTS_SETS_TO_DELETE + INTO @object_set_id +END CLOSE CURSOR_OBJECTS_SETS_TO_DELETE DEALLOCATE CURSOR_OBJECTS_SETS_TO_DELETE @@ -112,13 +112,13 @@ DECLARE @condition_id INT DECLARE CURSOR_CONDITIONS_TO_DELETE CURSOR FAST_FORWARD FOR SELECT condition_id FROM dbo.syspolicy_conditions where is_system = 0 -OPEN CURSOR_CONDITIONS_TO_DELETE +OPEN CURSOR_CONDITIONS_TO_DELETE -FETCH NEXT FROM CURSOR_CONDITIONS_TO_DELETE -INTO @condition_id +FETCH NEXT FROM CURSOR_CONDITIONS_TO_DELETE +INTO @condition_id -WHILE @@FETCH_STATUS = 0 -BEGIN +WHILE @@FETCH_STATUS = 0 +BEGIN BEGIN TRY EXEC msdb.dbo.sp_syspolicy_delete_condition @condition_id=@condition_id SELECT 'DELETE @condition_id', @condition_id @@ -127,9 +127,9 @@ BEGIN PRINT ERROR_MESSAGE() END CATCH - FETCH NEXT FROM CURSOR_CONDITIONS_TO_DELETE - INTO @condition_id -END + FETCH NEXT FROM CURSOR_CONDITIONS_TO_DELETE + INTO @condition_id +END CLOSE CURSOR_CONDITIONS_TO_DELETE DEALLOCATE CURSOR_CONDITIONS_TO_DELETE @@ -991,6 +991,6 @@ GO SELECT P.policy_id, P.name, PC.name FROM dbo.syspolicy_policies P -INNER JOIN dbo.syspolicy_policy_categories PC +INNER JOIN dbo.syspolicy_policy_categories PC ON P.policy_category_id = PC.policy_category_id WHERE PC.[name] = N'Name_Pattern' diff --git a/samples/features/epm-framework/5.0/README.md b/samples/features/epm-framework/5.0/README.md index f0290ee8..8ac07e97 100644 --- a/samples/features/epm-framework/5.0/README.md +++ b/samples/features/epm-framework/5.0/README.md @@ -5,7 +5,7 @@ https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-ps-module Over 4.12.1 below, EPM Framework 4.12.2 includes the following updates (as per received feedback): Fixed collation issues on views and reports -Over 4.12 below, EPM Framework 4.12.1 includes the following updates (as per received feedback): +Over 4.12 below, EPM Framework 4.12.1 includes the following updates (as per received feedback): - Update documentation with PS security related information. - Added existence check conditions to "4FixImportedPolicies" to avoid errors when not all default policies were imported. - Fixed call to evaluation details sub-report not auto selecting policies, when called from "Failed Object Count by Policy Category" chart. @@ -16,23 +16,23 @@ Over 4.12 below, EPM Framework 4.12.1 includes the following updates (as per rec - Added call to evaluation details sub-report from "Objects in Failed State" value in the top-left of the Policy Dashboard. - In PBM_Custom.zip, corrected script calling in job creation script. -Over 4.11 below, EPM Framework 4.12 includes the following updates (as per received feedback): +Over 4.11 below, EPM Framework 4.12 includes the following updates (as per received feedback): - Fixed issue with failed execution under SQL Agent PS job due to Write-Output. - Fixed issue with Invoke-PolicyEvaluation and null values. -- Added resilience with different PS versions. +- Added resilience with different PS versions. - Added server filtering options in PolicyEvaluationDetails and PolicyEvaluationErrors sub-reports. - In PBM_Custom.zip, fixed condition for "Enterprise Features" policy that generated evaluation errors. -Over 4.1 below, EPM Framework 4.11 includes the following updates (as per received feedback): +Over 4.1 below, EPM Framework 4.11 includes the following updates (as per received feedback): - Fixed sub-reports deployment fail due to failed validation. - Fixed issue in Data Loading Stored Procedure. -The EPM Framework 4.1 includes the following updates: +The EPM Framework 4.1 includes the following updates: - New PS script Improved resilience when running from CMS hosted on SQL Server 2008, 2008R2, 2012 and 2014. - Improved resilience when used with PS v2, v3 and v4. - Improved Data Loading Stored Procedure, where some policy results might not be loaded (this has been identified as active since EPM v3). -The EPM Framework 4.0 includes the following updates: +The EPM Framework 4.0 includes the following updates: - For enhanced support of large environments Reviewed database design, including views and indexing. - Redesigned data load procedure. - PowerShell execution now deletes XML files as soon as load is done - improves space usage on temp folder. @@ -43,8 +43,8 @@ Tested from SQL Server 2000 to 2014. Note: an upgrade script for all the relevant database objects is provided, supporting direct upgrade from v3 and v4. Please check the documentation for further information. We are also providing a set of scripts as an extension to the base set of Microsoft provided policies, and assumes the user has previously imported these Microsoft provided policies, as described by the "Configure/Create Policies and Centralize on the Central Management Server" section of the EPM Configuration Documentation. -These scripts have some fixes for the Microsoft provided policies, and include extra policies: -- Determining the if SQL Server instances are at the recommended SP level. Note that the condition has to be updated with proper build numbers for the policy to be current. +These scripts have some fixes for the Microsoft provided policies, and include extra policies: +- Determining the if SQL Server instances are at the recommended SP level. Note that the condition has to be updated with proper build numbers for the policy to be current. - Determining the if SQL Server instances are at the recommended CU or Hotfix. Note that the condition has to be updated with proper build numbers for the policy to be current. - Do I have log backups older than 24h? - Do I have full backups on read-write, full RM databases? @@ -57,7 +57,7 @@ These scripts have some fixes for the Microsoft provided policies, and include e - Do I have more VLFs than my rule-of-thumb? This has a 100 VLF threshold – change as appropriate. - Am I using Enterprise SKU features? Maybe I need to move a database to another server, and if it’s not an Enterprise Edition, so I must account for this? - Is Maximum Server Memory set at default? You will want to set this setting different from default. -- Is Server Memory set at a fixed value? +- Is Server Memory set at a fixed value? - Are DB Compatibility levels same as engine version? - Is Tempdb number of files appropriate? Regarding number of schedulers and if is multiple of 4? - Do TempDB data file sizes match? diff --git a/samples/features/epm-framework/README.md b/samples/features/epm-framework/README.md index 3815a1ea..a6a5f3ff 100644 --- a/samples/features/epm-framework/README.md +++ b/samples/features/epm-framework/README.md @@ -1,11 +1,11 @@ -The Enterprise Policy Management Framework is a reporting solution on the state of the enterprise against a desired state defined in a policy. Extend Policy-Based Management to all SQL Server instances in the enterprise. Centralize and report on the policy evaluation results. +The Enterprise Policy Management Framework is a reporting solution on the state of the enterprise against a desired state defined in a policy. Extend Policy-Based Management to all SQL Server instances in the enterprise. Centralize and report on the policy evaluation results. The Enterprise Policy Management Framework (EPM) is a solution to extend SQL Server Policy-Based Management to all versions of SQL Server in an enterprise, including SQL Server 2000 and SQL Server 2005. The EPM Framework will report the state of specified SQL Server instances against policies that define the defined intent, desired configuration, and deployment standards. -When the Enterprise Policy Management Framework (EPM) is implemented, policies will be evaluated against specified instances of SQL Server through PowerShell. This solution will require at least one instance of SQL Server. The PowerShell script will run from this instance through a SQL Server Agent job or manually through the PowerShell interface. The PowerShell script will capture the policy evaluation output and insert the output to a SQL Server table. SQL Server Reporting Services reports will deliver information from the centralized table. +When the Enterprise Policy Management Framework (EPM) is implemented, policies will be evaluated against specified instances of SQL Server through PowerShell. This solution will require at least one instance of SQL Server. The PowerShell script will run from this instance through a SQL Server Agent job or manually through the PowerShell interface. The PowerShell script will capture the policy evaluation output and insert the output to a SQL Server table. SQL Server Reporting Services reports will deliver information from the centralized table. This solution requires the following components are configured in your environment. All SQL Server requirements listed below may be executed from and managed on the same instance: -- SQL Server instance to store policies +- SQL Server instance to store policies - SQL Server instance to act as the Central Management Server - SQL Server instance to execute the PowerShell script - SQL Server management database and policy history table to archive policy evaluation results diff --git a/samples/features/epm-framework/build-process-templates/DefaultTemplate.11.1.xaml b/samples/features/epm-framework/build-process-templates/DefaultTemplate.11.1.xaml index bf54edfd..d7ae8949 100644 --- a/samples/features/epm-framework/build-process-templates/DefaultTemplate.11.1.xaml +++ b/samples/features/epm-framework/build-process-templates/DefaultTemplate.11.1.xaml @@ -52,7 +52,7 @@ All - 11.0 + 11.0 Assembly references and imported namespaces serialized as XML namespaces diff --git a/samples/features/epm-framework/build-process-templates/LabDefaultTemplate.11.xaml b/samples/features/epm-framework/build-process-templates/LabDefaultTemplate.11.xaml index 9e1fb0b5..474e8d95 100644 --- a/samples/features/epm-framework/build-process-templates/LabDefaultTemplate.11.xaml +++ b/samples/features/epm-framework/build-process-templates/LabDefaultTemplate.11.xaml @@ -32,7 +32,7 @@ - + @@ -98,7 +98,7 @@ - + @@ -108,7 +108,7 @@ - + @@ -153,13 +153,13 @@ - + - + diff --git a/samples/features/epm-framework/policy-customizations/1_PBM_CustomPolicies.sql b/samples/features/epm-framework/policy-customizations/1_PBM_CustomPolicies.sql index 75aaa396..4f03b026 100644 --- a/samples/features/epm-framework/policy-customizations/1_PBM_CustomPolicies.sql +++ b/samples/features/epm-framework/policy-customizations/1_PBM_CustomPolicies.sql @@ -851,8 +851,8 @@ EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @ GO Declare @policy_id int -EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'Non-Unique Clustered Indexes', @condition_name=N'Non-Unique Clustered Indexes', @policy_category=N'Microsoft Best Practices: Database Design', @description=N'With few exceptions, every table should have a clustered index. Very few exceptions to this, such as Bulk Load, Staging or some types of Temporary tables. -When creating a clustering index, remember that uniqueness is maintained in key values. Therefore, if you don’t create UNIQUE clustered index, SQL Server will add a 4-byte hidden column to make it unique, the “uniquefier”. +EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'Non-Unique Clustered Indexes', @condition_name=N'Non-Unique Clustered Indexes', @policy_category=N'Microsoft Best Practices: Database Design', @description=N'With few exceptions, every table should have a clustered index. Very few exceptions to this, such as Bulk Load, Staging or some types of Temporary tables. +When creating a clustering index, remember that uniqueness is maintained in key values. Therefore, if you don�t create UNIQUE clustered index, SQL Server will add a 4-byte hidden column to make it unique, the �uniquefier�. Generally, an ideal candidate for a clustering key should be a unique, monotonically increasing and occasionally updated value.', @help_text=N'', @help_link=N'http://msdn.microsoft.com/en-us/library/ms177443.aspx', @schedule_uid=N'00000000-0000-0000-0000-000000000000', @execution_mode=0, @is_enabled=False, @policy_id=@policy_id OUTPUT, @root_condition_name=N'', @object_set=N'Non_Unique_Clustered_Indexes_ObjectSet' Select @policy_id GO @@ -1376,7 +1376,7 @@ GO Declare @policy_id int EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'TempDB Data File Configuration is Optimal', @condition_name=N'TempDB Number of Files is Optimal', @policy_category=N'Microsoft Best Practices: Performance', @description=N'Having multiple TempDB data files can reduce contention and improve performance on active systems. This is because there will be one or more SGAM pages for each file, the main point of contention for mixed allocations. If there is a need to increase above the initial 8 files, do so by multiples of 4 files. -Dividing TempDB into multiple data files of equal size provides a high degree of parallel efficiency in operations that use TempDB. These multiple files do not necessarily need to be on different disks or spindles unless you are also encountering I/O bottlenecks as well. +Dividing TempDB into multiple data files of equal size provides a high degree of parallel efficiency in operations that use TempDB. These multiple files do not necessarily need to be on different disks or spindles unless you are also encountering I/O bottlenecks as well. One disadvantage of having too many TempDB files is that every object in TempDB will have multiple IAM pages. In addition, there will be more switching costs as objects are accessed as well as more managing overhead. On very large systems, 8 TempDB data files may be sufficient, but reconsider this based on the workload. If there is a need to increase above the initial 8 files, do so by multiples of 4 files.', @help_text=N'', @help_link=N'http://support.microsoft.com/kb/2154845/en-us', @is_enabled=False, @execution_mode=0, @policy_id=@policy_id OUTPUT, @root_condition_name=N'SQL Server Version 2005 or a Later Version', @object_set=N'TempDB_Configuration_is_Optimal_ObjectSet' Select @policy_id GO diff --git a/samples/features/epm-framework/policy-customizations/2_PBM_Fix_ImportedPolicies.sql b/samples/features/epm-framework/policy-customizations/2_PBM_Fix_ImportedPolicies.sql index 9542e462..79fd3a61 100644 --- a/samples/features/epm-framework/policy-customizations/2_PBM_Fix_ImportedPolicies.sql +++ b/samples/features/epm-framework/policy-customizations/2_PBM_Fix_ImportedPolicies.sql @@ -5,8 +5,8 @@ EXEC msdb.dbo.sp_syspolicy_rename_condition @name = N'SQL Server 2005 or a Later GO /* -Notes: -Remove from "Surface Area Configuration for Database Engine 2005 and 2000 Features" condition all 2005 only features. +Notes: +Remove from "Surface Area Configuration for Database Engine 2005 and 2000 Features" condition all 2005 only features. Then change "Surface Area Configuration for Database Engine 2008 Features" to apply from SQL 2005 onwards, otherwise policy evaluation fails. */ @@ -140,7 +140,7 @@ EXEC msdb.dbo.sp_syspolicy_update_policy @name='Public Not Granted Server Permis GO -- Fix typos or extra white spaces in descriptions -EXEC msdb.dbo.sp_syspolicy_update_policy @name='SQL Server Affinity Mask', @description=N'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. +EXEC msdb.dbo.sp_syspolicy_update_policy @name='SQL Server Affinity Mask', @description=N'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. Confirms whether the setting affinity mask of server is set to zero.' GO @@ -153,7 +153,7 @@ EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Cluster Disk R http://support.microsoft.com/kb/311081' GO -EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Driver Control Error', @description=N'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. +EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Device Driver Control Error', @description=N'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. http://support.microsoft.com/kb/259237 http://support.microsoft.com/kb/154690' GO @@ -174,11 +174,11 @@ http://support.microsoft.com/kb/885688' GO EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log I/O Error During Hard Page Fault Error', @description=N'Detects I/O Error during hard page fault in System Log. -http://support.microsoft.com/kb/304415 +http://support.microsoft.com/kb/304415 http://support.microsoft.com/kb/305547' GO -EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Storage System I/O Timeout Error', @description=N'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. -http://support.microsoft.com/kb/259237 +EXEC msdb.dbo.sp_syspolicy_update_policy @name='Windows Event Log Storage System I/O Timeout Error', @description=N'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 controlle +http://support.microsoft.com/kb/259237 http://support.microsoft.com/kb/154690' GO \ No newline at end of file diff --git a/samples/features/epm-framework/policy-customizations/4_PBM_Jobs.sql b/samples/features/epm-framework/policy-customizations/4_PBM_Jobs.sql index f50ecea3..d4e3d533 100644 --- a/samples/features/epm-framework/policy-customizations/4_PBM_Jobs.sql +++ b/samples/features/epm-framework/policy-customizations/4_PBM_Jobs.sql @@ -21,46 +21,46 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Audit - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Audit - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Audit', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Audit', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Audit" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Audit" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily', - @enabled=1, - @freq_type=4, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=12, - @freq_relative_interval=0, - @freq_recurrence_factor=0, - @active_start_date=20131105, - @active_end_date=99991231, - @active_start_time=50000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=12, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20131105, + @active_end_date=99991231, + @active_start_time=50000, @active_end_time=235959 --@schedule_uid=N'7cac7a6c-6eb8-44ad-b1c9-c28b3d337f10' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -87,46 +87,46 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Performance - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Performance - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Performance', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Performance', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Performance" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Performance" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily', - @enabled=1, - @freq_type=4, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=12, - @freq_relative_interval=0, - @freq_recurrence_factor=0, - @active_start_date=20131105, - @active_end_date=99991231, - @active_start_time=50000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=12, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20131105, + @active_end_date=99991231, + @active_start_time=50000, @active_end_time=235959 --@schedule_uid=N'7cac7a6c-6eb8-44ad-b1c9-c28b3d337f10' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -153,47 +153,47 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Server Configuration - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Server Configuration - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [Microsoft Best Practices: Server Configuration] Script Date: 26-06-2014 18:29:15 ******/ -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Server Configuration', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Server Configuration', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Server Configuration" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Server Configuration" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily', - @enabled=1, - @freq_type=4, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=12, - @freq_relative_interval=0, - @freq_recurrence_factor=0, - @active_start_date=20131105, - @active_end_date=99991231, - @active_start_time=50000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=12, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20131105, + @active_end_date=99991231, + @active_start_time=50000, @active_end_time=235959 --@schedule_uid=N'7cac7a6c-6eb8-44ad-b1c9-c28b3d337f10' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -220,47 +220,47 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Windows Log File - Mode "Check"', - @enabled=0, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Daily - Windows Log File - Mode "Check"', + @enabled=0, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [Microsoft Best Practices: Windows Log File] Script Date: 26-06-2014 18:29:23 ******/ -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Windows Log File', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Windows Log File', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Windows Log File" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Windows Log File" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily 1h', - @enabled=1, - @freq_type=4, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=6, - @freq_relative_interval=0, - @freq_recurrence_factor=0, - @active_start_date=20131105, - @active_end_date=99991231, - @active_start_time=10000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Daily 1h', + @enabled=1, + @freq_type=4, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=6, + @freq_relative_interval=0, + @freq_recurrence_factor=0, + @active_start_date=20131105, + @active_end_date=99991231, + @active_start_time=10000, @active_end_time=235959 --@schedule_uid=N'2abcaeeb-0b57-4630-9326-0d3040d8e949' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -287,47 +287,47 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Database Configurations - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Database Configurations - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [Microsoft Best Practices: Database Configurations] Script Date: 26-06-2014 18:29:28 ******/ -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Database Configurations', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Database Configurations', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Database Configurations" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Database Configurations" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', - @enabled=1, - @freq_type=8, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=0, - @freq_relative_interval=0, - @freq_recurrence_factor=1, - @active_start_date=20140606, - @active_end_date=99991231, - @active_start_time=120000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20140606, + @active_end_date=99991231, + @active_start_time=120000, @active_end_time=235959 --@schedule_uid=N'a515c257-d125-4b79-b924-2a5c6ade85b4' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -354,47 +354,47 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Database Design - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Database Design - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [Microsoft Best Practices: Database Design] Script Date: 26-06-2014 18:29:35 ******/ -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Database Design', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Database Design', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Database Design" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Database Design" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', - @enabled=1, - @freq_type=8, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=0, - @freq_relative_interval=0, - @freq_recurrence_factor=1, - @active_start_date=20140606, - @active_end_date=99991231, - @active_start_time=120000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20140606, + @active_end_date=99991231, + @active_start_time=120000, @active_end_time=235959 --@schedule_uid=N'a515c257-d125-4b79-b924-2a5c6ade85b4' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -421,46 +421,46 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Maintenance - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Maintenance - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Maintenance', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Maintenance', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Maintenance" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Maintenance" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', - @enabled=1, - @freq_type=8, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=0, - @freq_relative_interval=0, - @freq_recurrence_factor=1, - @active_start_date=20140606, - @active_end_date=99991231, - @active_start_time=120000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20140606, + @active_end_date=99991231, + @active_start_time=120000, @active_end_time=235959 --@schedule_uid=N'a515c257-d125-4b79-b924-2a5c6ade85b4' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -487,46 +487,46 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Security - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Security - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Security', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Security', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Security" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Security" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', - @enabled=1, - @freq_type=8, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=0, - @freq_relative_interval=0, - @freq_recurrence_factor=1, - @active_start_date=20140606, - @active_end_date=99991231, - @active_start_time=120000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20140606, + @active_end_date=99991231, + @active_start_time=120000, @active_end_time=235959 --@schedule_uid=N'a515c257-d125-4b79-b924-2a5c6ade85b4' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -553,46 +553,46 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Surface Area Configuration - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Surface Area Configuration - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Off by Default: Surface Area Configuration', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Off by Default: Surface Area Configuration', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Off by Default: Surface Area Configuration" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Off by Default: Surface Area Configuration" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', - @enabled=1, - @freq_type=8, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=0, - @freq_relative_interval=0, - @freq_recurrence_factor=1, - @active_start_date=20140606, - @active_end_date=99991231, - @active_start_time=120000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20140606, + @active_end_date=99991231, + @active_start_time=120000, @active_end_time=235959 --@schedule_uid=N'a515c257-d125-4b79-b924-2a5c6ade85b4' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback @@ -619,47 +619,47 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Version Audit - Mode "Check"', - @enabled=1, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'No description available.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Execute EPM Policies - Weekly - Version Audit - Mode "Check"', + @enabled=1, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'No description available.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Version Audit', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'PowerShell', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Microsoft Best Practices: Version Audit', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'PowerShell', @command=N'SL "$(PSPath)" -.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Version Audit" -EvalMode "Check"', - @database_name=N'master', - @flags=0, +.\EPM_EnterpriseEvaluation_4.ps1 -ConfigurationGroup "" -PolicyCategoryFilter "Microsoft Best Practices: Version Audit" -EvalMode "Check"', + @database_name=N'master', + @flags=0, @proxy_name=N'Proxy_Powershell' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', - @enabled=1, - @freq_type=8, - @freq_interval=1, - @freq_subday_type=1, - @freq_subday_interval=0, - @freq_relative_interval=0, - @freq_recurrence_factor=1, - @active_start_date=20140606, - @active_end_date=99991231, - @active_start_time=120000, - @active_end_time=235959 +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'EPM Policies: Weekly', + @enabled=1, + @freq_type=8, + @freq_interval=1, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=0, + @freq_recurrence_factor=1, + @active_start_date=20140606, + @active_end_date=99991231, + @active_start_time=120000, + @active_end_time=235959 --@schedule_uid=N'a515c257-d125-4b79-b924-2a5c6ade85b4' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' @@ -685,63 +685,63 @@ IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobId BINARY(16) -EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Purge EPM Policies data', - @enabled=0, - @notify_level_eventlog=0, - @notify_level_email=0, - @notify_level_netsend=0, - @notify_level_page=0, - @delete_level=0, - @description=N'By default, delete evaluation data over 90 days.', - @category_name=N'Policy Management', +EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'Purge EPM Policies data', + @enabled=0, + @notify_level_eventlog=0, + @notify_level_email=0, + @notify_level_netsend=0, + @notify_level_page=0, + @delete_level=0, + @description=N'By default, delete evaluation data over 90 days.', + @category_name=N'Policy Management', @owner_login_name=N'$(JobOwner)', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Delete from PolicyHistory', - @step_id=1, - @cmdexec_success_code=0, - @on_success_action=3, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'TSQL', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Delete from PolicyHistory', + @step_id=1, + @cmdexec_success_code=0, + @on_success_action=3, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', @command=N'WHILE (SELECT COUNT(PolicyHistoryID) FROM policy.PolicyHistory WHERE EvaluationDateTime > DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), -90)) > 0 BEGIN DELETE TOP (5000) FROM policy.PolicyHistory WHERE EvaluationDateTime > DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), -90) -END', - @database_name=N'$(ManagementDatabase)', +END', + @database_name=N'$(ManagementDatabase)', @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Delete from EvaluationErrorHistory', - @step_id=2, - @cmdexec_success_code=0, - @on_success_action=1, - @on_success_step_id=0, - @on_fail_action=2, - @on_fail_step_id=0, - @retry_attempts=0, - @retry_interval=0, - @os_run_priority=0, @subsystem=N'TSQL', +EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Delete from EvaluationErrorHistory', + @step_id=2, + @cmdexec_success_code=0, + @on_success_action=1, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', @command=N'DELETE FROM policy.EvaluationErrorHistory -WHERE EvaluationDateTime > DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), -90)', - @database_name=N'$(ManagementDatabase)', +WHERE EvaluationDateTime > DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), -90)', + @database_name=N'$(ManagementDatabase)', @flags=0 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback -EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'1st Saturday of Every Month', - @enabled=1, - @freq_type=32, - @freq_interval=7, - @freq_subday_type=1, - @freq_subday_interval=0, - @freq_relative_interval=1, - @freq_recurrence_factor=1, - @active_start_date=20140307, - @active_end_date=99991231, - @active_start_time=80000, +EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'1st Saturday of Every Month', + @enabled=1, + @freq_type=32, + @freq_interval=7, + @freq_subday_type=1, + @freq_subday_interval=0, + @freq_relative_interval=1, + @freq_recurrence_factor=1, + @active_start_date=20140307, + @active_end_date=99991231, + @active_start_time=80000, @active_end_time=235959 --@schedule_uid=N'7a06dab6-2331-43aa-834d-3644aed1e102' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/README.md b/samples/features/high availability/Kubernetes/sample-deployment-script/README.md index 5f310612..c6f96aad 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/README.md +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/README.md @@ -12,20 +12,20 @@ Sample script for doing the following: # Other semantics - If user runs the script multiple times with same AG name – deployment fails - (creating a namespace with same name will fail) + (creating a namespace with same name will fail) - If user runs the script multiple times with different AG name – the script will create a new namespace and new operator and new instances will be deployed. This means that users can not use the script to create multiple AGs in the same instances. They will have to use the .yaml edit files route - to create multiple AGs in same instance. + to create multiple AGs in same instance. # Setup/Requirements - python3.5 - pyyaml (Python package) - kubernetes.client (Python package) -Assuming you have `pip` pointing to the python3 version, run the following to +Assuming you have `pip` pointing to the python3 version, run the following to install the required packages: ```sh pip install --user -r requirements.txt diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/deploy-ag.py b/samples/features/high availability/Kubernetes/sample-deployment-script/deploy-ag.py index 2e9c337e..866e4ed5 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/deploy-ag.py +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/deploy-ag.py @@ -19,7 +19,7 @@ from utils import (AgRole, AgMode, OperatorYaml, SqlSecretsYaml, DEFAULT_K8S_AGENTS_IMAGE = ( "mcr.microsoft.com/mssql/ha:2019-CTP2.1-ubuntu") - + TEMPLATES_DIR = "templates" diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/ag-service.yaml b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/ag-service.yaml index 8d912ac0..b1973632 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/ag-service.yaml +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/ag-service.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: + name: namespace: default spec: ports: @@ -10,4 +10,4 @@ spec: port: 1433 selector: type: sqlservr - type: + type: diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/failover.yaml b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/failover.yaml index fcc4cfd9..c8804e44 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/failover.yaml +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/failover.yaml @@ -19,11 +19,11 @@ rules: - resources: ["configmaps"] apiGroups: [""] verbs: ["get", "update"] - resourceNames: + resourceNames: - resources: ["endpoints"] apiGroups: [""] verbs: ["get"] - resourceNames: + resourceNames: - resources: ["pods"] apiGroups: [""] verbs: ["list"] @@ -36,7 +36,7 @@ kind: RoleBinding metadata: name: manual-failover - namespace: + namespace: roleRef: name: manual-failover @@ -55,7 +55,7 @@ kind: Job metadata: name: manual-failover - namespace: + namespace: spec: template: diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/operator.yaml b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/operator.yaml index 8600c91f..f219feba 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/operator.yaml +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/operator.yaml @@ -72,7 +72,7 @@ kind: Deployment metadata: name: mssql-operator - namespace: + namespace: spec: selector: diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pv.yaml b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pv.yaml index eca41c28..43a55845 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pv.yaml +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pv.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: PersistentVolume metadata: - name: + name: labels: storage: spec: @@ -11,5 +11,5 @@ spec: accessModes: - ReadWriteOnce hostPath: - path: + path: diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pvc.yaml b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pvc.yaml index 2fcfe069..ce8ee3bd 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pvc.yaml +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/pvc.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: PersistentVolumeClaim metadata: - name: + name: spec: accessModes: - ReadWriteOnce diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sql-secrets.yaml b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sql-secrets.yaml index 16059e81..81f84264 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sql-secrets.yaml +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sql-secrets.yaml @@ -3,7 +3,7 @@ apiVersion: v1 kind: Secret metadata: name: sql-secrets - namespace: + namespace: data: sapassword: type: Opaque diff --git a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sqlserver.yaml b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sqlserver.yaml index aa69033f..53c114f2 100644 --- a/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sqlserver.yaml +++ b/samples/features/high availability/Kubernetes/sample-deployment-script/templates/sqlserver.yaml @@ -2,7 +2,7 @@ apiVersion: mssql.microsoft.com/v1 kind: SqlServer metadata: - name: + name: namespace: default labels: type: sqlservr diff --git a/samples/features/high availability/Kubernetes/sample-manifest-files/rotate-creds.yaml b/samples/features/high availability/Kubernetes/sample-manifest-files/rotate-creds.yaml index 046c5a54..ab7d916b 100644 --- a/samples/features/high availability/Kubernetes/sample-manifest-files/rotate-creds.yaml +++ b/samples/features/high availability/Kubernetes/sample-manifest-files/rotate-creds.yaml @@ -67,7 +67,7 @@ spec: image: mcr.microsoft.com/mssql/ha:2019-CTP2.1-ubuntu command: ["/mssql-server-k8s-rotate-creds"] env: - - name: MSSQL_K8S_SQL_SERVER_NAME + - name: MSSQL_K8S_SQL_SERVER_NAME value: mssql1 - name: MSSQL_ROTATE_CERT value: "True" @@ -92,4 +92,4 @@ spec: key: sapassword imagePullSecrets: - name: private-registry-key - + diff --git a/samples/features/high availability/Linux/Cluster Configuration/STONITH/Tutorial for vmware fencing agent.md b/samples/features/high availability/Linux/Cluster Configuration/STONITH/Tutorial for vmware fencing agent.md index 3317a8c7..f168ed4f 100644 --- a/samples/features/high availability/Linux/Cluster Configuration/STONITH/Tutorial for vmware fencing agent.md +++ b/samples/features/high availability/Linux/Cluster Configuration/STONITH/Tutorial for vmware fencing agent.md @@ -3,7 +3,7 @@ >[!NOTE] >All examples of using fencing agent for vmware in [RHEL documentation](https://access.redhat.com/solutions/306233) are with `-ssl` option ( or `-z`). That “Default†behavior has changed from just checking any certificate to just signed certs that can be validated. Hence in testing use the `–ssl-insecure`. Can use default if you have a valid certificate. -## Manually Test Fencing Device +## Manually Test Fencing Device The options that are passed in the example below have the following usage: `-a` is IP of Vsphere, `-l` is username, `-p` is password, `-n` is node name you want to fence. Can use `-v` as verbose mode to debug. diff --git a/samples/features/high availability/Linux/Cluster Configuration/STONITH/readme.md b/samples/features/high availability/Linux/Cluster Configuration/STONITH/readme.md index 5b85fff8..fdb2b4bc 100644 --- a/samples/features/high availability/Linux/Cluster Configuration/STONITH/readme.md +++ b/samples/features/high availability/Linux/Cluster Configuration/STONITH/readme.md @@ -13,7 +13,7 @@ Pacemaker cluster vendors require STONITH to be enabled and a fencing device con * On many baremetal recommended seems to be ilo ( ilo/ilo2/ilo3/ilo4 which go over ipmi ) or second option is the ssh equivalents ( ilo3_ssh/ilo4_ssh) * Have to find out what version of ilo machine supports - * For _ssh agents, have to add public key/auth to ilo under the Administration—security to enable passwordless auth + * For _ssh agents, have to add public key/auth to ilo under the Administration—security to enable passwordless auth ## Other fencing configurations diff --git a/samples/features/high availability/readme.md b/samples/features/high availability/readme.md index f1ace644..b9f8caa7 100644 --- a/samples/features/high availability/readme.md +++ b/samples/features/high availability/readme.md @@ -2,6 +2,6 @@ Go to the documentation tutorials to learn more about: -[HADR Solutions on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-business-continuity-dr) +[HADR Solutions on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-business-continuity-dr) [Availability Groups](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/always-on-availability-groups-sql-server) \ No newline at end of file diff --git a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/README.md b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/README.md index 9bd9428a..2a81a6f1 100644 --- a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/README.md +++ b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/README.md @@ -19,14 +19,14 @@ Some results from this benchmark: ## Running this sample -1. Create the database, tables, and stored procedures using the T-SQL scripts in the corresponding subfolders. +1. Create the database, tables, and stored procedures using the T-SQL scripts in the corresponding subfolders. - The hash indexes are sized for a scale factor of 100, which translates to a 24GB database, with bucket_count double the row count. For larger database and memory size, adjust the bucket counts accordingly. - The max bucket_count in SQL Server 2016 is 1 billion. It is OK to have a higher row count. The benchmark performs well with bucket_count of 1 billion and row counts of 5 billion. - There are plans to publish scripts for initial populate of the tables. Timeline is TBD. - Scripts are also provided for corresponding disk-based tables and traditional stored procedures, to compare performance between disk-based and memory-optimized tables. - Data size across the tables is distributed as follows: - + |Table|Weight| |----------|--------| |Customer|1| diff --git a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Database_DiskBased.sql b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Database_DiskBased.sql index 42936076..89a33662 100644 --- a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Database_DiskBased.sql +++ b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Database_DiskBased.sql @@ -2,7 +2,7 @@ -- With SQL Server, make sure SQL Server authentication is enabled, and the sa account is active -- create main database files; for large-scale workloads, add additional containers to the DiskBased_fg filegroup -IF SERVERPROPERTY('EngineEdition') != 5 +IF SERVERPROPERTY('EngineEdition') != 5 BEGIN DECLARE @sql nvarchar(max) = N' CREATE DATABASE DiskBasedDB diff --git a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Indexes_DiskBased.sql b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Indexes_DiskBased.sql index cd7f145f..997bc3c4 100644 --- a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Indexes_DiskBased.sql +++ b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/Disk-Based/Create_Indexes_DiskBased.sql @@ -6,7 +6,7 @@ ---------------------------------------------------------------------------- USE DiskBasedDB GO - + --- --- Set connection attributes --- @@ -23,7 +23,7 @@ GO IF NOT EXISTS ( SELECT name FROM sysindexes WHERE name = 'PK_CUSTOMER' ) CREATE UNIQUE CLUSTERED INDEX PK_CUSTOMER ON Customer( C_ID ) WITH (FILLFACTOR = 100, SORT_IN_TEMPDB=ON, MAXDOP = 8) - ON DiskBased_fg + ON DiskBased_fg GO CHECKPOINT @@ -43,7 +43,7 @@ GO IF NOT EXISTS ( SELECT name FROM sysindexes WHERE name = 'PK_ORDERLINES' ) CREATE CLUSTERED INDEX PK_ORDERLINES ON OrderLines( OL_O_ID ) WITH (FILLFACTOR = 100, SORT_IN_TEMPDB=ON, MAXDOP = 8) - + GO IF NOT EXISTS ( SELECT name FROM sysindexes WHERE name = 'IX_ORDERLINES_NC1' ) diff --git a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Database_InMem.sql b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Database_InMem.sql index fa058185..1e6093f4 100644 --- a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Database_InMem.sql +++ b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Database_InMem.sql @@ -2,7 +2,7 @@ -- With SQL Server, make sure SQL Server authentication is enabled, and the sa account is active -- create main database files; for large-scale workloads, add additional containers in the InMem_fg filegroup -IF SERVERPROPERTY('EngineEdition') != 5 +IF SERVERPROPERTY('EngineEdition') != 5 BEGIN DECLARE @sql nvarchar(max) = N' CREATE DATABASE InMemDB diff --git a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Tables_InMem.sql b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Tables_InMem.sql index 0705d5f0..d2c52f32 100644 --- a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Tables_InMem.sql +++ b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/create-database-and-tables/In-Memory/Create_Tables_InMem.sql @@ -60,7 +60,7 @@ CREATE TABLE dbo.Orders( CONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED HASH ( O_ID ) WITH (BUCKET_COUNT = 10000000), - INDEX IX_Orders_DTS (O_FM_DTS, O_DTS ASC) + INDEX IX_Orders_DTS (O_FM_DTS, O_DTS ASC) ) WITH ( MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA ) GO diff --git a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/DiskBased_StoredProcedures.sql b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/DiskBased_StoredProcedures.sql index 3bacce85..05159a12 100644 --- a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/DiskBased_StoredProcedures.sql +++ b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/DiskBased_StoredProcedures.sql @@ -62,7 +62,7 @@ BEGIN @o_id bigint, @o_total decimal(9,2), @o_dts datetime - + SELECT @c_f_name = C_F_NAME, @c_l_name = C_L_NAME, @@ -83,7 +83,7 @@ BEGIN OL_PRICE FROM dbo.OrderLines WHERE OL_O_ID = @o_id - + SELECT @c_f_name, @c_l_name, @c_email @@ -108,7 +108,7 @@ BEGIN FROM dbo.Products WHERE PR_TYPE = @REQ_TYPE ORDER BY PR_PRICE ASC - + END GO @@ -172,7 +172,7 @@ BEGIN --insert an Order record to claim the O_ID INSERT INTO dbo.Orders (O_C_ID, O_TOTAL, O_DTS, O_FM_DTS) VALUES (@C_ID, 0, GETDATE(), @NullDate) - + -- get the inserted order id SELECT @order_id = SCOPE_IDENTITY() @@ -188,7 +188,7 @@ BEGIN @PR_Qty = @OL_PR_QTY_1, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_1 + WHERE PR_ID = @OL_PR_ID_1 IF @@ROWCOUNT > 0 BEGIN @@ -204,7 +204,7 @@ BEGIN @PR_Qty = @OL_PR_QTY_2, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_2 + WHERE PR_ID = @OL_PR_ID_2 IF @@ROWCOUNT > 0 BEGIN @@ -220,7 +220,7 @@ BEGIN @PR_Qty = @OL_PR_QTY_3, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_3 + WHERE PR_ID = @OL_PR_ID_3 IF @@ROWCOUNT > 0 BEGIN @@ -236,7 +236,7 @@ BEGIN @PR_Qty = @OL_PR_QTY_4, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_4 + WHERE PR_ID = @OL_PR_ID_4 IF @@ROWCOUNT > 0 BEGIN @@ -252,7 +252,7 @@ BEGIN @PR_Qty = @OL_PR_QTY_5, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_5 + WHERE PR_ID = @OL_PR_ID_5 IF @@ROWCOUNT > 0 BEGIN diff --git a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/InMem_StoredProcedures.sql b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/InMem_StoredProcedures.sql index fedd8383..4eafaace 100644 --- a/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/InMem_StoredProcedures.sql +++ b/samples/features/in-memory-database/in-memory-oltp/benchmark-order-processing/stored-procedures/InMem_StoredProcedures.sql @@ -45,7 +45,7 @@ AS BEGIN ATOMIC WITH -- insert the data into the FulFillment table INSERT INTO dbo.Fulfillment (FM_O_ID, FM_C_ID, FM_DTS) VALUES (@OrderID, @OrderCID, @FulfillmentDate) - + SELECT @OrderID AS 'OrderID Fulfilled' END @@ -72,7 +72,7 @@ AS BEGIN ATOMIC WITH @o_id bigint, @o_total decimal(9,2), @o_dts datetime - + SELECT @c_f_name = C_F_NAME, @c_l_name = C_L_NAME, @@ -93,7 +93,7 @@ AS BEGIN ATOMIC WITH OL_PRICE FROM dbo.OrderLines WHERE OL_O_ID = @o_id - + SELECT @c_f_name, @c_l_name, @c_email @@ -123,7 +123,7 @@ AS BEGIN ATOMIC WITH FROM dbo.Products WHERE PR_TYPE = @REQ_TYPE ORDER BY PR_PRICE ASC - + END GO @@ -195,7 +195,7 @@ AS BEGIN ATOMIC WITH --insert an Order record to claim the O_ID INSERT INTO dbo.Orders (O_C_ID, O_TOTAL, O_DTS, O_FM_DTS) VALUES (@C_ID, 0, GETDATE(), @NullDate) - + -- get the inserted order id SELECT @order_id = SCOPE_IDENTITY() @@ -211,7 +211,7 @@ AS BEGIN ATOMIC WITH @PR_Qty = @OL_PR_QTY_1, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_1 + WHERE PR_ID = @OL_PR_ID_1 IF @@ROWCOUNT > 0 BEGIN @@ -227,7 +227,7 @@ AS BEGIN ATOMIC WITH @PR_Qty = @OL_PR_QTY_2, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_2 + WHERE PR_ID = @OL_PR_ID_2 IF @@ROWCOUNT > 0 BEGIN @@ -243,7 +243,7 @@ AS BEGIN ATOMIC WITH @PR_Qty = @OL_PR_QTY_3, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_3 + WHERE PR_ID = @OL_PR_ID_3 IF @@ROWCOUNT > 0 BEGIN @@ -259,7 +259,7 @@ AS BEGIN ATOMIC WITH @PR_Qty = @OL_PR_QTY_4, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_4 + WHERE PR_ID = @OL_PR_ID_4 IF @@ROWCOUNT > 0 BEGIN @@ -275,7 +275,7 @@ AS BEGIN ATOMIC WITH @PR_Qty = @OL_PR_QTY_5, @PR_Price = PR_PRICE FROM dbo.Products - WHERE PR_ID = @OL_PR_ID_5 + WHERE PR_ID = @OL_PR_ID_5 IF @@ROWCOUNT > 0 BEGIN diff --git a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/README.md b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/README.md index a677dfb1..5c259427 100644 --- a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/README.md +++ b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/README.md @@ -47,7 +47,7 @@ Script to add In-Memory Analytics (Columnstore) to the AdventureWorksLT sample d **[clustered_columnstore_sample_queries.sql](clustered_columnstore_sample_queries.sql)** -T-SQL queries accompanying the In-Memory Analytics (Columnstore) sample in the AdventureWorksLT sample database for Azure SQL Database. +T-SQL queries accompanying the In-Memory Analytics (Columnstore) sample in the AdventureWorksLT sample database for Azure SQL Database. diff --git a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/clustered_columnstore_sample_queries.sql b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/clustered_columnstore_sample_queries.sql index 55c8e8cf..26c0647d 100644 --- a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/clustered_columnstore_sample_queries.sql +++ b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/clustered_columnstore_sample_queries.sql @@ -1,15 +1,15 @@ /************************************************************************* - This sample targets DataWarehouse workload. We recommend using clustered + This sample targets DataWarehouse workload. We recommend using clustered columnstore index for large tables (million+) rows and traditional rowstore for tables of size < 1 million rows. The examples here are based on star schema - consisting of FACT and DIMENSION tables.The examples hi-light the both the + consisting of FACT and DIMENSION tables.The examples hi-light the both the storage savings and performance enhancements available in Azure SQL DB We have two fact tables FactResellerSalesXL_CCI and FactResellerSalesXL_PageCompressed. They are identical except one table is based on clustered columnstore index and other table is regular rowstore table with PAGE compression - Note: A Pre-requisite is following the instructions in the document: + Note: A Pre-requisite is following the instructions in the document: https://docs.microsoft.com/en-us/azure/sql-database/sql-database-in-memory#2-install-the-in-memory-analytics-sample ************************************************************************* */ @@ -18,7 +18,7 @@ /************************************************************************************* STEP 1 - Space comparison between CCI and PAGE compressed table **********************************************************************************/ --- How about space? Data space is much smaller. One key point to note is that PAGE compression can +-- How about space? Data space is much smaller. One key point to note is that PAGE compression can -- compress 2-4x. The difference is less as we have a Primary Key on the table that creates a Unique Non-clustered index -- The actual data compression savings will depend upon the data and the schema sp_spaceused 'FactResellerSalesXL_CCI' @@ -78,7 +78,7 @@ SET STATISTICS TIME OFF GO --- This is the same Prior query on a table with a Clustered Columnstore index CCI +-- This is the same Prior query on a table with a Clustered Columnstore index CCI -- The comparison numbers are even more dramatic the larger the table is, this is a 11 million row table only. SET STATISTICS IO ON SET STATISTICS TIME ON @@ -112,7 +112,7 @@ GO STEP 3 - Constraints ********************************************************************************* */ --- SQL 2014 did not support foreign Key constraints.. +-- SQL 2014 did not support foreign Key constraints.. -- Validate there are constraints on this table SELECT * FROM sys.indexes WHERE object_id = object_id('FactResellerSalesXL_CCI') SELECT * FROM sys.foreign_keys WHERE parent_object_id = object_id('FactResellerSalesXL_CCI') @@ -317,7 +317,7 @@ GO /************************************************************************************* -STEP 8 - Non-Clustered Indexes ( btree) on top of Clustered columnstore index +STEP 8 - Non-Clustered Indexes ( btree) on top of Clustered columnstore index **********************************************************************************/ -- What abount narrow lookups -- See missing index for this Plan @@ -342,7 +342,7 @@ GO /* Now create the missing index */ -CREATE NONCLUSTERED INDEX IndFactResellerSalesXL_CCI_NCI +CREATE NONCLUSTERED INDEX IndFactResellerSalesXL_CCI_NCI ON [dbo].[FactResellerSalesXL_CCI] ([ProductKey]) INCLUDE ([SalesAmount],[OrderDate]) GO @@ -370,7 +370,7 @@ GO DROP INDEX IF EXISTS [FactResellerSales_CCI].IndFactResellerSales_CCI_NCI; /************************************************************************************* -STEP 9 - Read Committed Snapshot Isolation +STEP 9 - Read Committed Snapshot Isolation **********************************************************************************/ -- RCSI now supported now, which means you can have CCI on AlwaysOn secondaries -- Note this may be blocked if you have other connections opened @@ -440,7 +440,7 @@ SELECT TOP 400000 * FROM FactResellerSalesXL_CCI -- check the rowgroups created. --- you will notice each thread creates its own delta rowgroup. The compressed rowgproup will only be created +-- you will notice each thread creates its own delta rowgroup. The compressed rowgproup will only be created -- if number of rows inserted by a thread is > 100k SELECT * FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id = object_id('FactResellerSalesXL_CCI_temp') @@ -459,7 +459,7 @@ SELECT * FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id = object_id('FactResellerSalesXL_CCI_temp') --- Now delete a subset of rows +-- Now delete a subset of rows DELETE FactResellerSalesXL_CCI_temp WHERE productkey % 2 = 0 -- run the following DMV to note the deleted rows @@ -469,10 +469,10 @@ WHERE object_id = object_id('FactResellerSalesXL_CCI_temp') -- we will now run REORG command to defragement the columnstore index by removing deleted rows -- This will MERGE smaller rowgroups into larger rowgroups and also reclaim space from the deleted rows --- http://blogs.msdn.com/b/sqlcat/archive/2015/08/17/sql-2016-columnstore-row-group-merge-policy-and-index-maintenance-improvements.aspx +-- http://blogs.msdn.com/b/sqlcat/archive/2015/08/17/sql-2016-columnstore-row-group-merge-policy-and-index-maintenance-improvements.aspx ALTER INDEX cci_temp on FactResellerSalesXL_CCI_temp REORGANIZE --- Validate the new rowgroups that were merged +-- Validate the new rowgroups that were merged -- Note only look at the COMPRESSED rowgroup. SELECT * FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id = object_id('FactResellerSalesXL_CCI_temp') diff --git a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/enable-in-memory-oltp.sql b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/enable-in-memory-oltp.sql index ab527b1e..f0fdc36e 100644 --- a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/enable-in-memory-oltp.sql +++ b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/enable-in-memory-oltp.sql @@ -1,12 +1,12 @@ --- The below scipt enables the use of In-Memory OLTP in the current database, +-- The below scipt enables the use of In-Memory OLTP in the current database, -- provided it is supported in the edition / pricing tier of the database. -- It does the following: --- 1. Validate that In-Memory OLTP is supported. +-- 1. Validate that In-Memory OLTP is supported. -- 2. In SQL Server, it will add a MEMORY_OPTIMIZED_DATA filegroup to the database -- and create a container within the filegroup in the default data folder. -- 3. Change the database compatibility level to 130 (needed for parallel queries -- and auto-update of statistics). --- 4. Enables the database option MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT to avoid the +-- 4. Enables the database option MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT to avoid the -- need to use the WITH (SNAPSHOT) hint for ad hoc queries accessing memory-optimized -- tables. -- @@ -18,19 +18,19 @@ SET NOCOUNT ON; SET XACT_ABORT ON; -- 1. validate that In-Memory OLTP is supported -IF SERVERPROPERTY(N'IsXTPSupported') = 0 -BEGIN +IF SERVERPROPERTY(N'IsXTPSupported') = 0 +BEGIN PRINT N'Error: In-Memory OLTP is not supported for this server edition or database pricing tier.'; -END +END IF DB_ID() < 5 -BEGIN +BEGIN PRINT N'Error: In-Memory OLTP is not supported in system databases. Connect to a user database.'; -END -ELSE -BEGIN +END +ELSE +BEGIN BEGIN TRY; -- 2. add MEMORY_OPTIMIZED_DATA filegroup when not using Azure SQL DB - IF SERVERPROPERTY('EngineEdition') != 5 + IF SERVERPROPERTY('EngineEdition') != 5 BEGIN DECLARE @SQLDataFolder nvarchar(max) = cast(SERVERPROPERTY('InstanceDefaultDataPath') as nvarchar(max)) DECLARE @MODName nvarchar(max) = DB_NAME() + N'_mod'; @@ -42,7 +42,7 @@ BEGIN IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE type = N'FX') BEGIN SET @SQL = N' -ALTER DATABASE CURRENT +ALTER DATABASE CURRENT ADD FILEGROUP ' + QUOTENAME(@MODName) + N' CONTAINS MEMORY_OPTIMIZED_DATA;'; EXECUTE (@SQL); @@ -54,7 +54,7 @@ ADD FILEGROUP ' + QUOTENAME(@MODName) + N' CONTAINS MEMORY_OPTIMIZED_DATA;'; SET @SQL = N' ALTER DATABASE CURRENT ADD FILE (name = N''' + @MODName + ''', filename = ''' - + @MemoryOptimizedFilegroupFolder + N''') + + @MemoryOptimizedFilegroupFolder + N''') TO FILEGROUP ' + QUOTENAME(@MODName); EXECUTE (@SQL); END @@ -62,7 +62,7 @@ TO FILEGROUP ' + QUOTENAME(@MODName); -- 3. set compat level to 130 if it is lower IF (SELECT compatibility_level FROM sys.databases WHERE database_id=DB_ID()) < 130 - ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130 + ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130 -- 4. enable MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT for the database ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON; diff --git a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_analytics_sample.sql b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_analytics_sample.sql index 55fec1f1..172296fd 100644 --- a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_analytics_sample.sql +++ b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_analytics_sample.sql @@ -20,7 +20,7 @@ CREATE TABLE [dbo].[DimGeography]( [StateProvinceName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [CountryRegionName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [PostalCode] [nvarchar](15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, - CONSTRAINT [PK_DimGeography_GeographyKey] PRIMARY KEY CLUSTERED + CONSTRAINT [PK_DimGeography_GeographyKey] PRIMARY KEY CLUSTERED ( [GeographyKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -28,7 +28,7 @@ CREATE TABLE [dbo].[DimGeography]( GO -- Populate Data insert into DimGeography -select distinct AddressID,City,StateProvince,CountryRegion,PostalCode +select distinct AddressID,City,StateProvince,CountryRegion,PostalCode from SalesLT.Address -- select * from DimGeography @@ -50,7 +50,7 @@ CREATE TABLE [dbo].[DimCustomer]( [LastName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [Suffix] [nvarchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [EmailAddress] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL - CONSTRAINT [PK_DimCustomer_CustomerKey] PRIMARY KEY CLUSTERED + CONSTRAINT [PK_DimCustomer_CustomerKey] PRIMARY KEY CLUSTERED ( [CustomerKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -90,7 +90,7 @@ CREATE TABLE [dbo].[DimDate]( [MonthNumberOfYear] [tinyint] NOT NULL, [EnglishMonthName] [nvarchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [Year] [smallint] NOT NULL - CONSTRAINT [PK_DimDate_DateKey] PRIMARY KEY CLUSTERED + CONSTRAINT [PK_DimDate_DateKey] PRIMARY KEY CLUSTERED ( [DateKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -109,11 +109,11 @@ AS SELECT @StartDate AS [DateKey] UNION ALL SELECT DATEADD(DAY,1,[DateKey]) - FROM DateList + FROM DateList WHERE DATEADD(DAY,1,[DateKey]) <= @EndDate ) Insert into DimDate -select +select [DateKey]= Cast(CONVERT(VARCHAR,[DateKey],112) as int) --YYYYMMDD ,[FullDateAlternateKey] = [DateKey] -- week @@ -127,7 +127,7 @@ select -- Year , [MonthNumberOfYear] = DATEPART(MONTH, [DateKey]) , [EnglishMonthName] = DATENAME(MONTH, [DateKey]) - + ,[Year] = YEAR([DateKey]) --into tbltest @@ -160,11 +160,11 @@ CREATE TABLE [dbo].[DimProductCategory]( [ProductCategoryKey] [int] IDENTITY(1,1) NOT NULL, [ProductCategoryAlternateKey] [int] NULL, [EnglishProductCategoryName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, - CONSTRAINT [PK_DimProductCategory_ProductCategoryKey] PRIMARY KEY CLUSTERED + CONSTRAINT [PK_DimProductCategory_ProductCategoryKey] PRIMARY KEY CLUSTERED ( [ProductCategoryKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON), - CONSTRAINT [AK_DimProductCategory_ProductCategoryAlternateKey] UNIQUE NONCLUSTERED + CONSTRAINT [AK_DimProductCategory_ProductCategoryAlternateKey] UNIQUE NONCLUSTERED ( [ProductCategoryAlternateKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -190,11 +190,11 @@ CREATE TABLE [dbo].[DimProductSubcategory]( [ProductSubcategoryAlternateKey] [int] NULL, [EnglishProductSubcategoryName] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [ProductCategoryKey] [int] NULL, - CONSTRAINT [PK_DimProductSubcategory_ProductSubcategoryKey] PRIMARY KEY CLUSTERED + CONSTRAINT [PK_DimProductSubcategory_ProductSubcategoryKey] PRIMARY KEY CLUSTERED ( [ProductSubcategoryKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON), - CONSTRAINT [AK_DimProductSubcategory_ProductSubcategoryAlternateKey] UNIQUE NONCLUSTERED + CONSTRAINT [AK_DimProductSubcategory_ProductSubcategoryAlternateKey] UNIQUE NONCLUSTERED ( [ProductSubcategoryAlternateKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) @@ -234,11 +234,11 @@ CREATE TABLE [dbo].[DimProduct]( [ProductModel] [nvarchar](400) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [StartDate] [datetime] NULL, [EndDate] [datetime] NULL - CONSTRAINT [PK_DimProduct_ProductKey] PRIMARY KEY CLUSTERED + CONSTRAINT [PK_DimProduct_ProductKey] PRIMARY KEY CLUSTERED ( [ProductKey] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON), - CONSTRAINT [AK_DimProduct_ProductAlternateKey_StartDate] UNIQUE NONCLUSTERED + CONSTRAINT [AK_DimProduct_ProductAlternateKey_StartDate] UNIQUE NONCLUSTERED ( [ProductAlternateKey] ASC, [StartDate] ASC @@ -325,7 +325,7 @@ CREATE TABLE [dbo].[FactResellerSalesXL_PageCompressed]( [ShipDate] [smalldatetime] NULL ) GO -ALTER TABLE [dbo].[FactResellerSalesXL_PageCompressed] WITH CHECK ADD +ALTER TABLE [dbo].[FactResellerSalesXL_PageCompressed] WITH CHECK ADD CONSTRAINT [PK_FactResellerSalesXL_PageCompressed_SalesOrderNumber_SalesOrderLineNumber] PRIMARY KEY CLUSTERED ( [SalesOrderNumber] ASC, @@ -365,14 +365,14 @@ Declare @OrderDateKey int, @NumOrdersPerDateKey int, @NumSalesLineItems int -Declare @CustomerPONumber nvarchar(25),@CarrierTrackingNumber nvarchar(25) +Declare @CustomerPONumber nvarchar(25),@CarrierTrackingNumber nvarchar(25) -- Loop through each Date Key to insert that many rows. DECLARE mycursor CURSOR -FOR SELECT NumOrdersPerDay,DateKey,FullDateAlternateKey from #temp +FOR SELECT NumOrdersPerDay,DateKey,FullDateAlternateKey from #temp OPEN mycursor -FETCH NEXT FROM mycursor +FETCH NEXT FROM mycursor INTO @NumOrdersPerDateKey, @OrderDateKey,@OrderDate WHILE @@FETCH_STATUS = 0 @@ -427,7 +427,7 @@ BEGIN TRAN END COMMIT -FETCH NEXT FROM mycursor +FETCH NEXT FROM mycursor INTO @NumOrdersPerDateKey, @OrderDateKey,@OrderDate END @@ -444,8 +444,8 @@ CREATE CLUSTERED COLUMNSTORE INDEX [IndFactResellerSales_CCI] ON [dbo].[FactRese GO -- Create Constraints -ALTER TABLE [dbo].[FactResellerSalesXL_CCI] WITH CHECK ADD - CONSTRAINT [PK_FactResellerSalesXL_CCI_SalesOrderNumber_SalesOrderLineNumber] PRIMARY KEY +ALTER TABLE [dbo].[FactResellerSalesXL_CCI] WITH CHECK ADD + CONSTRAINT [PK_FactResellerSalesXL_CCI_SalesOrderNumber_SalesOrderLineNumber] PRIMARY KEY ( [SalesOrderNumber] ASC, [SalesOrderLineNumber] ASC diff --git a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_oltp_sample.sql b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_oltp_sample.sql index 873c5bb5..d87a2e2b 100644 --- a/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_oltp_sample.sql +++ b/samples/features/in-memory-database/in-memory-oltp/t-sql-scripts/sql_in-memory_oltp_sample.sql @@ -3,14 +3,14 @@ -- -- Last updated: 2016-07-29 -- --- +-- -- Copyright (C) Microsoft Corporation. All rights reserved. --- +-- -- This source code is intended only as a supplement to Microsoft --- Development Tools and/or on-line documentation. --- --- THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF --- ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +-- Development Tools and/or on-line documentation. +-- +-- THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF +-- ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO -- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A -- PARTICULAR PURPOSE. @@ -28,16 +28,16 @@ GO ALTER DATABASE CURRENT SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON GO -ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130 +ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL = 130 GO /*************************** Create Tables **********************************/ -- first drop all objects that have a schema-bound dependency on the table -DROP PROCEDURE IF EXISTS [SalesLT].usp_InsertSalesOrder_inmem +DROP PROCEDURE IF EXISTS [SalesLT].usp_InsertSalesOrder_inmem GO -DROP TABLE IF EXISTS [SalesLT].[SalesOrderHeader_inmem] +DROP TABLE IF EXISTS [SalesLT].[SalesOrderHeader_inmem] GO CREATE TABLE [SalesLT].[SalesOrderHeader_inmem]( [SalesOrderID] int IDENTITY NOT NULL PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=100000), @@ -46,7 +46,7 @@ CREATE TABLE [SalesLT].[SalesOrderHeader_inmem]( [DueDate] [datetime2] NOT NULL, [ShipDate] [datetime2] NULL, [Status] [tinyint] NOT NULL CONSTRAINT [IMDF_SalesOrderHeader_Status] DEFAULT ((1)), - [OnlineOrderFlag] bit NOT NULL CONSTRAINT [IMDF_SalesOrderHeader_OnlineOrderFlag] DEFAULT ((1)), + [OnlineOrderFlag] bit NOT NULL CONSTRAINT [IMDF_SalesOrderHeader_OnlineOrderFlag] DEFAULT ((1)), [PurchaseOrderNumber] nvarchar(25) NULL, [AccountNumber] nvarchar(15) NULL, [CustomerID] [int] NOT NULL , @@ -63,7 +63,7 @@ CREATE TABLE [SalesLT].[SalesOrderHeader_inmem]( ) WITH (MEMORY_OPTIMIZED=ON) GO -DROP TABLE IF EXISTS [SalesLT].[SalesOrderDetail_inmem] +DROP TABLE IF EXISTS [SalesLT].[SalesOrderDetail_inmem] GO CREATE TABLE [SalesLT].[SalesOrderDetail_inmem]( [SalesOrderID] int NOT NULL INDEX IX_SalesOrderID HASH WITH (BUCKET_COUNT=100000), @@ -74,7 +74,7 @@ CREATE TABLE [SalesLT].[SalesOrderDetail_inmem]( [UnitPriceDiscount] [money] NOT NULL CONSTRAINT [IMDF_SalesOrderDetail_UnitPriceDiscount] DEFAULT ((0.0)), [ModifiedDate] [datetime2] NOT NULL , - CONSTRAINT [imPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY NONCLUSTERED HASH + CONSTRAINT [imPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY NONCLUSTERED HASH ( [SalesOrderID], [SalesOrderDetailID] )WITH (BUCKET_COUNT=1000000) @@ -83,7 +83,7 @@ GO -- type used for TVPs when creating new sales orders -DROP TYPE IF EXISTS [SalesLT].[SalesOrderDetailType_inmem] +DROP TYPE IF EXISTS [SalesLT].[SalesOrderDetailType_inmem] GO CREATE TYPE [SalesLT].[SalesOrderDetailType_inmem] AS TABLE( [OrderQty] [smallint] NOT NULL, @@ -93,7 +93,7 @@ GO -DROP TABLE IF EXISTS [SalesLT].[Product_inmem] +DROP TABLE IF EXISTS [SalesLT].[Product_inmem] GO CREATE TABLE [SalesLT].[Product_inmem]( [ProductID] [int] IDENTITY NOT NULL, @@ -111,11 +111,11 @@ CREATE TABLE [SalesLT].[Product_inmem]( [ModifiedDate] [datetime2] NOT NULL CONSTRAINT [IMDF_Product_ModifiedDate] DEFAULT (SYSDATETIME()), CONSTRAINT [IMPK_Product_ProductID] PRIMARY KEY NONCLUSTERED - ( [ProductID] ) + ( [ProductID] ) ) WITH (MEMORY_OPTIMIZED=ON) GO -DROP TABLE IF EXISTS [SalesLT].[SalesOrderHeader_ondisk] +DROP TABLE IF EXISTS [SalesLT].[SalesOrderHeader_ondisk] GO CREATE TABLE [SalesLT].[SalesOrderHeader_ondisk]( [SalesOrderID] int IDENTITY NOT NULL PRIMARY KEY, @@ -124,9 +124,9 @@ CREATE TABLE [SalesLT].[SalesOrderHeader_ondisk]( [DueDate] [datetime2] NOT NULL, [ShipDate] [datetime2] NULL, [Status] [tinyint] NOT NULL CONSTRAINT [ODDF_SalesOrderHeader_Status] DEFAULT ((1)), - [OnlineOrderFlag] bit NOT NULL CONSTRAINT [ODDF_SalesOrderHeader_OnlineOrderFlag] DEFAULT ((1)), - [PurchaseOrderNumber] nvarchar(25) NULL, - [AccountNumber] nvarchar(15) NULL, + [OnlineOrderFlag] bit NOT NULL CONSTRAINT [ODDF_SalesOrderHeader_OnlineOrderFlag] DEFAULT ((1)), + [PurchaseOrderNumber] nvarchar(25) NULL, + [AccountNumber] nvarchar(15) NULL, [CustomerID] [int] NOT NULL , [BillToAddressID] [int] NOT NULL, [ShipToAddressID] [int] NOT NULL, @@ -139,10 +139,10 @@ CREATE TABLE [SalesLT].[SalesOrderHeader_ondisk]( INDEX IX_CustomerID (CustomerID) , INDEX IX_OrderDate (OrderDate ASC) -) +) GO -DROP TABLE IF EXISTS [SalesLT].[SalesOrderDetail_ondisk] +DROP TABLE IF EXISTS [SalesLT].[SalesOrderDetail_ondisk] GO CREATE TABLE [SalesLT].[SalesOrderDetail_ondisk]( [SalesOrderID] int NOT NULL, @@ -153,15 +153,15 @@ CREATE TABLE [SalesLT].[SalesOrderDetail_ondisk]( [UnitPriceDiscount] [money] NOT NULL CONSTRAINT [ODDF_SalesOrderDetail_UnitPriceDiscount] DEFAULT ((0.0)), [ModifiedDate] [datetime2] NOT NULL , - CONSTRAINT [ODPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY + CONSTRAINT [ODPK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY ( [SalesOrderID], [SalesOrderDetailID]) -) +) GO -DROP PROCEDURE IF EXISTS SalesLT.usp_InsertSalesOrder_ondisk +DROP PROCEDURE IF EXISTS SalesLT.usp_InsertSalesOrder_ondisk GO -DROP TYPE IF EXISTS [SalesLT].[SalesOrderDetailType_ondisk] +DROP TYPE IF EXISTS [SalesLT].[SalesOrderDetailType_ondisk] GO CREATE TYPE [SalesLT].[SalesOrderDetailType_ondisk] AS TABLE( [OrderQty] [smallint] NOT NULL, @@ -172,7 +172,7 @@ GO -DROP TABLE IF EXISTS SalesLT.[Product_ondisk] +DROP TABLE IF EXISTS SalesLT.[Product_ondisk] GO CREATE TABLE [SalesLT].[Product_ondisk]( [ProductID] [int] IDENTITY NOT NULL, @@ -188,7 +188,7 @@ CREATE TABLE [SalesLT].[Product_ondisk]( [SellEndDate] [datetime2] NULL, [DiscontinuedDate] [datetime2] NULL, [ModifiedDate] [datetime2] NOT NULL CONSTRAINT [ODDF_Product_ModifiedDate] DEFAULT (SYSDATETIME()), - CONSTRAINT [ODPK_Product_ProductID] PRIMARY KEY CLUSTERED ([ProductID]) + CONSTRAINT [ODPK_Product_ProductID] PRIMARY KEY CLUSTERED ([ProductID]) ) GO @@ -371,7 +371,7 @@ GO /*************************** Create stored procedures **********************************/ -DROP PROCEDURE IF EXISTS SalesLT.usp_InsertSalesOrder_inmem +DROP PROCEDURE IF EXISTS SalesLT.usp_InsertSalesOrder_inmem GO CREATE PROCEDURE SalesLT.usp_InsertSalesOrder_inmem @SalesOrderID int OUTPUT, @@ -397,7 +397,7 @@ BEGIN ATOMIC WITH DECLARE @SubTotal money NOT NULL = 0 SELECT @SubTotal = ISNULL(SUM(p.ListPrice),0) - FROM @SalesOrderDetails od + FROM @SalesOrderDetails od JOIN SalesLT.Product_inmem p on od.ProductID=p.ProductID INSERT INTO SalesLT.SalesOrderHeader_inmem @@ -442,7 +442,7 @@ BEGIN ATOMIC WITH UnitPriceDiscount, ModifiedDate ) - SELECT + SELECT @SalesOrderID, od.OrderQty, od.ProductID, @@ -457,7 +457,7 @@ GO -DROP PROCEDURE IF EXISTS SalesLT.usp_InsertSalesOrder_ondisk +DROP PROCEDURE IF EXISTS SalesLT.usp_InsertSalesOrder_ondisk GO CREATE PROCEDURE SalesLT.usp_InsertSalesOrder_ondisk @SalesOrderID int OUTPUT, @@ -473,7 +473,7 @@ CREATE PROCEDURE SalesLT.usp_InsertSalesOrder_ondisk @CreditCardApprovalCode [varchar](15) = NULL, @Comment nvarchar(128) = NULL AS -BEGIN +BEGIN BEGIN TRAN DECLARE @OrderDate datetime2 = sysdatetime() @@ -481,7 +481,7 @@ BEGIN DECLARE @SubTotal money = 0 SELECT @SubTotal = ISNULL(SUM(p.ListPrice),0) - FROM @SalesOrderDetails od + FROM @SalesOrderDetails od JOIN SalesLT.Product_ondisk p on od.ProductID=p.ProductID INSERT INTO SalesLT.SalesOrderHeader_ondisk @@ -526,7 +526,7 @@ BEGIN UnitPriceDiscount, ModifiedDate ) - SELECT + SELECT @SalesOrderID, od.OrderQty, od.ProductID, @@ -544,22 +544,22 @@ GO /*************************** Demo harness **********************************/ -DROP PROCEDURE IF EXISTS Demo.usp_DemoInsertSalesOrders +DROP PROCEDURE IF EXISTS Demo.usp_DemoInsertSalesOrders go -DROP PROCEDURE IF EXISTS Demo.usp_DemoInitSeed +DROP PROCEDURE IF EXISTS Demo.usp_DemoInitSeed GO -DROP TABLE IF EXISTS Demo.DemoSalesOrderDetailSeed +DROP TABLE IF EXISTS Demo.DemoSalesOrderDetailSeed GO -DROP TABLE IF EXISTS Demo.DemoSalesOrderHeaderSeed +DROP TABLE IF EXISTS Demo.DemoSalesOrderHeaderSeed GO -DROP PROCEDURE IF EXISTS Demo.usp_DemoReset +DROP PROCEDURE IF EXISTS Demo.usp_DemoReset GO DROP SCHEMA IF EXISTS Demo GO CREATE SCHEMA Demo GO -DROP TABLE IF EXISTS Demo.DemoSalesOrderDetailSeed +DROP TABLE IF EXISTS Demo.DemoSalesOrderDetailSeed GO CREATE TABLE Demo.DemoSalesOrderDetailSeed ( @@ -570,7 +570,7 @@ CREATE TABLE Demo.DemoSalesOrderDetailSeed ) WITH (MEMORY_OPTIMIZED=ON) GO -DROP TABLE IF EXISTS Demo.DemoSalesOrderHeaderSeed +DROP TABLE IF EXISTS Demo.DemoSalesOrderHeaderSeed GO CREATE TABLE Demo.DemoSalesOrderHeaderSeed ( @@ -582,23 +582,23 @@ CREATE TABLE Demo.DemoSalesOrderHeaderSeed ) WITH (MEMORY_OPTIMIZED=ON) GO -DROP PROCEDURE IF EXISTS Demo.usp_DemoInitSeed +DROP PROCEDURE IF EXISTS Demo.usp_DemoInitSeed GO CREATE PROCEDURE Demo.usp_DemoInitSeed @items_per_order int = 5 AS BEGIN - DECLARE @ProductID int, + DECLARE @ProductID int, @i int = 1 DECLARE @seed_order_count int = (SELECT COUNT(*)/@items_per_order FROM SalesLT.Product_inmem) - DECLARE seed_cursor CURSOR FOR - SELECT + DECLARE seed_cursor CURSOR FOR + SELECT ProductID FROM SalesLT.Product_inmem WITH (SNAPSHOT) OPEN seed_cursor - FETCH NEXT FROM seed_cursor + FETCH NEXT FROM seed_cursor INTO @ProductID BEGIN TRAN @@ -623,14 +623,14 @@ BEGIN WHILE @@FETCH_STATUS = 0 BEGIN INSERT Demo.DemoSalesOrderDetailSeed - SELECT + SELECT @i % 6 + 1, @ProductID, @i % (@seed_order_count+1) SET @i += 1 - FETCH NEXT FROM seed_cursor + FETCH NEXT FROM seed_cursor INTO @ProductID END @@ -646,7 +646,7 @@ END GO -DROP PROCEDURE IF EXISTS Demo.usp_DemoReset +DROP PROCEDURE IF EXISTS Demo.usp_DemoReset GO CREATE PROCEDURE Demo.usp_DemoReset AS diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/DemoWorkload.csproj b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/DemoWorkload.csproj index 81c12707..9874e8e8 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/DemoWorkload.csproj +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/DemoWorkload.csproj @@ -197,7 +197,7 @@ - diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.Designer.cs b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.Designer.cs index 43b0740f..a60a67cf 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.Designer.cs +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.Designer.cs @@ -72,9 +72,9 @@ ((System.ComponentModel.ISupportInitialize)(this.chtLatches)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.chtCPU)).BeginInit(); this.SuspendLayout(); - // + // // btnRun - // + // this.btnRun.BackColor = System.Drawing.Color.White; this.btnRun.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnRun.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -86,9 +86,9 @@ this.btnRun.Text = "Start"; this.btnRun.UseVisualStyleBackColor = false; this.btnRun.Click += new System.EventHandler(this.OnRunClick); - // + // // btnStop - // + // this.btnStop.BackColor = System.Drawing.Color.White; this.btnStop.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnStop.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -101,9 +101,9 @@ this.btnStop.Text = "Stop"; this.btnStop.UseVisualStyleBackColor = false; this.btnStop.Click += new System.EventHandler(this.btnStop_Click); - // + // // lbResults - // + // this.lbResults.BackColor = System.Drawing.Color.Transparent; this.lbResults.Font = new System.Drawing.Font("Microsoft Sans Serif", 24F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lbResults.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(166))))); @@ -113,9 +113,9 @@ this.lbResults.TabIndex = 31; this.lbResults.Text = "Baseline"; this.lbResults.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - // + // // menuStrip1 - // + // this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.optionsToolStripMenuItem}); @@ -125,32 +125,32 @@ this.menuStrip1.Size = new System.Drawing.Size(815, 24); this.menuStrip1.TabIndex = 32; this.menuStrip1.Text = "menuStrip1"; - // + // // optionsToolStripMenuItem - // + // this.optionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.configurationToolStripMenuItem, this.exitToolStripMenuItem}); this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; this.optionsToolStripMenuItem.Size = new System.Drawing.Size(61, 22); this.optionsToolStripMenuItem.Text = "Options"; - // + // // configurationToolStripMenuItem - // + // this.configurationToolStripMenuItem.Name = "configurationToolStripMenuItem"; this.configurationToolStripMenuItem.Size = new System.Drawing.Size(148, 22); this.configurationToolStripMenuItem.Text = "Configuration"; this.configurationToolStripMenuItem.Click += new System.EventHandler(this.configurationToolStripMenuItem_Click); - // + // // exitToolStripMenuItem - // + // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.Size = new System.Drawing.Size(148, 22); this.exitToolStripMenuItem.Text = "Exit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); - // + // // ErrorMessages - // + // this.ErrorMessages.Location = new System.Drawing.Point(846, 79); this.ErrorMessages.Multiline = true; this.ErrorMessages.Name = "ErrorMessages"; @@ -159,9 +159,9 @@ this.ErrorMessages.Size = new System.Drawing.Size(360, 272); this.ErrorMessages.TabIndex = 5; this.ErrorMessages.TabStop = false; - // + // // chtTPS - // + // this.chtTPS.BackColor = System.Drawing.Color.Transparent; chartArea1.AxisX.IntervalType = System.Windows.Forms.DataVisualization.Charting.DateTimeIntervalType.Seconds; chartArea1.AxisX.MajorGrid.Enabled = false; @@ -194,9 +194,9 @@ this.chtTPS.Size = new System.Drawing.Size(348, 268); this.chtTPS.TabIndex = 33; this.chtTPS.Text = "chart1"; - // + // // statusStrip1 - // + // this.statusStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripStatusLabel1, @@ -208,40 +208,40 @@ this.statusStrip1.Size = new System.Drawing.Size(815, 22); this.statusStrip1.TabIndex = 35; this.statusStrip1.Text = "statusStrip1"; - // + // // toolStripStatusLabel1 - // + // this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; this.toolStripStatusLabel1.Size = new System.Drawing.Size(80, 17); this.toolStripStatusLabel1.Text = "Elapsed Time:"; - // + // // lblTime - // + // this.lblTime.Name = "lblTime"; this.lblTime.Size = new System.Drawing.Size(13, 17); this.lblTime.Text = "0"; - // + // // toolStripStatusLabel3 - // + // this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; this.toolStripStatusLabel3.Size = new System.Drawing.Size(100, 17); this.toolStripStatusLabel3.Text = "Running Threads:"; - // + // // lblThreads - // + // this.lblThreads.Name = "lblThreads"; this.lblThreads.Size = new System.Drawing.Size(13, 17); this.lblThreads.Text = "0"; - // + // // splitContainer1 - // + // this.splitContainer1.BackColor = System.Drawing.Color.Transparent; this.splitContainer1.Location = new System.Drawing.Point(0, 25); this.splitContainer1.Name = "splitContainer1"; this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; - // + // // splitContainer1.Panel1 - // + // this.splitContainer1.Panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.splitContainer1.Panel1.Controls.Add(this.label4); this.splitContainer1.Panel1.Controls.Add(this.speedDialPanel); @@ -252,17 +252,17 @@ this.splitContainer1.Panel1.Controls.Add(this.btnRun); this.splitContainer1.Panel1.Controls.Add(this.btnStop); this.splitContainer1.Panel1.Controls.Add(this.lbResults); - // + // // splitContainer1.Panel2 - // + // this.splitContainer1.Panel2.Controls.Add(this.chtLatches); this.splitContainer1.Panel2.Controls.Add(this.chtCPU); this.splitContainer1.Size = new System.Drawing.Size(786, 655); this.splitContainer1.SplitterDistance = 398; this.splitContainer1.TabIndex = 39; - // + // // label4 - // + // this.label4.AutoSize = true; this.label4.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -272,17 +272,17 @@ this.label4.Size = new System.Drawing.Size(122, 13); this.label4.TabIndex = 45; this.label4.Text = "Transactions/sec x1000"; - // + // // speedDialPanel - // + // this.speedDialPanel.Location = new System.Drawing.Point(21, 86); this.speedDialPanel.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.speedDialPanel.Name = "speedDialPanel"; this.speedDialPanel.Size = new System.Drawing.Size(319, 260); this.speedDialPanel.TabIndex = 43; - // + // // label2 - // + // this.label2.AutoSize = true; this.label2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -292,9 +292,9 @@ this.label2.Size = new System.Drawing.Size(124, 17); this.label2.TabIndex = 42; this.label2.Text = "Transactions / sec"; - // + // // label1 - // + // this.label1.AutoSize = true; this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label1.ForeColor = System.Drawing.SystemColors.ControlDarkDark; @@ -303,9 +303,9 @@ this.label1.Size = new System.Drawing.Size(260, 17); this.label1.TabIndex = 41; this.label1.Text = "Increase in performance since last reset"; - // + // // btnToggle - // + // this.btnToggle.BackColor = System.Drawing.Color.White; this.btnToggle.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.btnToggle.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -317,9 +317,9 @@ this.btnToggle.Text = "Show diagnostics "; this.btnToggle.UseVisualStyleBackColor = false; this.btnToggle.Click += new System.EventHandler(this.btnToggle_Click); - // + // // chtLatches - // + // chartArea2.AxisX.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.False; chartArea2.AxisX.LabelStyle.Enabled = false; chartArea2.AxisX.LineColor = System.Drawing.Color.White; @@ -349,9 +349,9 @@ this.chtLatches.Size = new System.Drawing.Size(685, 84); this.chtLatches.TabIndex = 42; this.chtLatches.Text = "chart1"; - // + // // chtCPU - // + // this.chtCPU.BackColor = System.Drawing.Color.Transparent; chartArea3.AxisX.LabelStyle.Enabled = false; chartArea3.AxisX.LineColor = System.Drawing.Color.White; @@ -386,9 +386,9 @@ this.chtCPU.Series.Add(series3); this.chtCPU.Size = new System.Drawing.Size(786, 253); this.chtCPU.TabIndex = 41; - // + // // label3 - // + // this.label3.AutoSize = true; this.label3.BackColor = System.Drawing.Color.Transparent; this.label3.Location = new System.Drawing.Point(843, 40); @@ -396,9 +396,9 @@ this.label3.Size = new System.Drawing.Size(83, 13); this.label3.TabIndex = 11; this.label3.Text = "Error Messages:"; - // + // // FrmMain - // + // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.BackColor = System.Drawing.Color.White; diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.cs b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.cs index 41663bd4..d95d7177 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.cs +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.cs @@ -1,15 +1,15 @@ -//---------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, -// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES -// OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. -//---------------------------------------------------------------------------------- -// The example companies, organizations, products, domain names, -// e-mail addresses, logos, people, places, and events depicted -// herein are fictitious. No association with any real company, -// organization, product, domain name, email address, logo, person, -// places, or events is intended or should be inferred. +//---------------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +//---------------------------------------------------------------------------------- +// The example companies, organizations, products, domain names, +// e-mail addresses, logos, people, places, and events depicted +// herein are fictitious. No association with any real company, +// organization, product, domain name, email address, logo, person, +// places, or events is intended or should be inferred. using System; using System.Collections.Generic; @@ -22,13 +22,13 @@ using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; using System.Windows.Forms.Integration; -/// -/// -/// Documentation References: +/// +/// +/// Documentation References: /// In-Memory OLTP (In-Memory Optimization): https://msdn.microsoft.com/en-us/library/dn133186.aspx /// OLTP and database management: https://www.microsoft.com/en-us/server-cloud/solutions/oltp-database-management.aspx -/// -/// +/// +/// namespace DemoWorkload { @@ -37,7 +37,7 @@ namespace DemoWorkload delegate void SetTextCallback(string text); public Object ErrorLock = new Object(); - public Object StopLock = new Object(); + public Object StopLock = new Object(); List RunningThreads = new List(); Thread MonitorThread; @@ -55,13 +55,13 @@ namespace DemoWorkload InitializeComponent(); uiControls.speedDial.MaxValue = Program.MAX_TPS; } - + delegate void SetInt64Callback(Int64 value); delegate void SetIntCallback(int value); - /// + /// /// Adds a line of text into the message box - /// + /// private void AddText(string text) { // InvokeRequired required compares the thread ID of the @@ -78,31 +78,31 @@ namespace DemoWorkload } } - /// + /// /// Updates the thread count display - /// + /// private void UpdateCount(string TC) { try { this.lblThreads.Text = TC.ToString(); } catch (Exception ex) { ShowThreadExceptionDialog("UpdateCount", ex); } } - /// + /// /// Updates the elapsed time display - /// + /// private void UpdateElapsed(string Elapsed) { - this.lblTime.Text = Elapsed.ToString(); + this.lblTime.Text = Elapsed.ToString(); } - /// - /// Updates the CPU% bar in the chart + /// + /// Updates the CPU% bar in the chart /// Note that this proc does NOT cause the chart to refresh. /// that is done in UpdateTPS(), which should be called after this proc. - /// + /// private void UpdateCPUChart(int CPU) { - try { + try { if (this.statusStrip1.InvokeRequired) { SetIntCallback d = new SetIntCallback(UpdateCPUChart); @@ -119,12 +119,12 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdateCPUChart", ex); } } - /// + /// /// Updates Latches in the Chart - /// + /// private void UpdateLatchChart(Int64 Latches) { - try { + try { if (this.statusStrip1.InvokeRequired) { SetInt64Callback d = new SetInt64Callback(UpdateLatchChart); @@ -141,12 +141,12 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdateLatchChart", ex); } } - /// + /// /// Updates the TPS bar in the chart, and causes the whole chart to be re-drawn with the new data. - /// + /// private void UpdateTPSChart(Int64 TPS) { - try { + try { if (this.statusStrip1.InvokeRequired) { SetInt64Callback d = new SetInt64Callback(UpdateTPSChart); @@ -157,9 +157,9 @@ namespace DemoWorkload // Updating Speedometer if (TPS >= 0) { - double normalizedTPS = (double)TPS / 1000; + double normalizedTPS = (double)TPS / 1000; uiControls.speedDial.CurrentValue = normalizedTPS; - uiControls.speedDial.DialText = normalizedTPS.ToString("#.##"); + uiControls.speedDial.DialText = normalizedTPS.ToString("#.##"); // Updating TPS chart TPSChartTime++; @@ -183,9 +183,9 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdateTPSChart", ex); } } - /// + /// /// Updates Results - /// + /// private void UpdateResults(string Results) { try @@ -211,9 +211,9 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("UpdateResults", ex); } } - /// + /// /// Executes Write/Read Commands - /// + /// void OnRunClick(object sender, EventArgs e) { try @@ -246,7 +246,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("OnRunClick", ex); } } - /// + /// /// Executes Transactions on the target server /// void ThreadWorker(object tp) @@ -307,7 +307,7 @@ namespace DemoWorkload } } - /// + /// /// Thread Monitor /// void ThreadMonitor() @@ -455,7 +455,7 @@ namespace DemoWorkload UpdateTPSChart(TPS); } - /// + /// /// Stop Button /// private void btnStop_Click(object sender, EventArgs e) @@ -465,7 +465,7 @@ namespace DemoWorkload Stopped = true; } } - /// + /// /// Application Exit /// private void exitToolStripMenuItem_Click(object sender, EventArgs e) @@ -473,7 +473,7 @@ namespace DemoWorkload Application.Exit(); } - /// + /// /// Configuratino Settings /// private void configurationToolStripMenuItem_Click(object sender, EventArgs e) @@ -487,7 +487,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("configurationToolStripMenuItem_Click", ex); } } - /// + /// /// Show Diagnostics /// private void btnToggle_Click(object sender, EventArgs e) @@ -509,7 +509,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("btnToggle_Click", ex); } } - /// + /// /// Frm Main Load /// private void FrmMain_Load(object sender, EventArgs e) @@ -529,7 +529,7 @@ namespace DemoWorkload catch (Exception ex) { ShowThreadExceptionDialog("FrmMain_Load", ex);} } - /// + /// /// Frm Main Closing /// private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) @@ -545,7 +545,7 @@ namespace DemoWorkload } } - /// + /// /// Creates an error message and displays it. /// private static DialogResult ShowThreadExceptionDialog(string title, Exception e) @@ -558,7 +558,7 @@ namespace DemoWorkload } - /// + /// /// ThreadParams Class /// class ThreadParams diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.resx b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.resx index 8176630a..32dc6cfe 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.resx +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/FrmMain.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/AssemblyInfo.cs b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/AssemblyInfo.cs index b7f7dbf0..6f634b8e 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/AssemblyInfo.cs +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/AssemblyInfo.cs @@ -3,7 +3,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("DemoWorkload")] @@ -15,8 +15,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -26,11 +26,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.Designer.cs b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.Designer.cs index 25ec838b..232e8479 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.Designer.cs +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace DemoWorkload.Properties { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -23,15 +23,15 @@ namespace DemoWorkload.Properties { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// @@ -45,7 +45,7 @@ namespace DemoWorkload.Properties { return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. @@ -59,7 +59,7 @@ namespace DemoWorkload.Properties { resourceCulture = value; } } - + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -69,7 +69,7 @@ namespace DemoWorkload.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -79,7 +79,7 @@ namespace DemoWorkload.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.resx b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.resx index 3e218d5d..54fb5c4b 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.resx +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Settings.Designer.cs b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Settings.Designer.cs index 413e5601..66d78315 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Settings.Designer.cs +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/Properties/Settings.Designer.cs @@ -9,14 +9,14 @@ //------------------------------------------------------------------------------ namespace DemoWorkload.Properties { - - + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - + public static Settings Default { get { return defaultInstance; diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/UIControls.cs b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/UIControls.cs index 40da584b..4cf3ee79 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/UIControls.cs +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/DemoWorkload/UIControls.cs @@ -1,15 +1,15 @@ -//---------------------------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, -// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES -// OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. -//---------------------------------------------------------------------------------- -// The example companies, organizations, products, domain names, -// e-mail addresses, logos, people, places, and events depicted -// herein are fictitious. No association with any real company, -// organization, product, domain name, email address, logo, person, -// places, or events is intended or should be inferred. +//---------------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +//---------------------------------------------------------------------------------- +// The example companies, organizations, products, domain names, +// e-mail addresses, logos, people, places, and events depicted +// herein are fictitious. No association with any real company, +// organization, product, domain name, email address, logo, person, +// places, or events is intended or should be inferred. using Gauge = CircularGauge.CircularGaugeControl; using MediaColor = System.Windows.Media.Color; @@ -39,7 +39,7 @@ namespace DemoWorkload _speedDial.PointerCapRadius = 0; _speedDial.MinValue = 0; _speedDial.MaxValue = 60; - _speedDial.DialText = "0"; + _speedDial.DialText = "0"; _speedDial.MajorDivisionsCount = 10; _speedDial.MinorDivisionsCount = 5; _speedDial.RangeIndicatorThickness = 0; diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql index d4f64dc2..e9062ece 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/BatchInsertReservations.sql @@ -1,4 +1,4 @@ --- helper stored procedure to batch reservations +-- helper stored procedure to batch reservations CREATE PROCEDURE BatchInsertReservations(@ServerTransactions int, @RowsPerTransaction int, @ThreadID int) AS diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/InsertReservationDetails.sql b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/InsertReservationDetails.sql index dc48cf92..fc9bea09 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/InsertReservationDetails.sql +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/InsertReservationDetails.sql @@ -6,7 +6,7 @@ BEGIN DECLARE @loop int = 0; WHILE (@loop < @LineCount) BEGIN - INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) + INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) VALUES(@TicketReservationID, @loop % 8 + 1, @FlightID, @Comment); SET @loop += 1; END @@ -24,7 +24,7 @@ BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT, LANGUAGE=N'English') DECLARE @loop int = 0; while (@loop < @LineCount) BEGIN - INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) + INSERT INTO dbo.TicketReservationDetail (TicketReservationID, Quantity, FlightID, Comment) VALUES(@TicketReservationID, @loop % 8 + 1, @FlightID, @Comment); SET @loop += 1; END diff --git a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/ReadMultipleReservations.sql b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/ReadMultipleReservations.sql index c98ebeed..bdba3f3e 100644 --- a/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/ReadMultipleReservations.sql +++ b/samples/features/in-memory-database/in-memory-oltp/ticket-reservations/TicketReservations/dbo/Stored Procedures/ReadMultipleReservations.sql @@ -1,6 +1,6 @@ CREATE PROCEDURE ReadMultipleReservations(@ServerTransactions int, @RowsPerTransaction int, @ThreadID int) AS -BEGIN +BEGIN DECLARE @tranCount int = 0; DECLARE @CurrentSeq int = 0; DECLARE @Sum int = 0; diff --git a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/App.config b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/App.config index c7994603..8658ff45 100644 --- a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/App.config +++ b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/App.config @@ -9,8 +9,8 @@ - - + + diff --git a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/DataGenerator/DataGenerator.csproj b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/DataGenerator/DataGenerator.csproj index 41e9659e..bfc4ec11 100644 --- a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/DataGenerator/DataGenerator.csproj +++ b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/DataGenerator/DataGenerator.csproj @@ -47,7 +47,7 @@ - diff --git a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/AssemblyInfo.cs b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/AssemblyInfo.cs index ed0ca63d..0775d690 100644 --- a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/AssemblyInfo.cs +++ b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Client")] @@ -14,8 +14,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -25,11 +25,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.Designer.cs b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.Designer.cs index fe34baac..6d43c482 100644 --- a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.Designer.cs +++ b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.Designer.cs @@ -10,8 +10,8 @@ namespace Client.Properties { using System; - - + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -23,15 +23,15 @@ namespace Client.Properties { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { - + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// @@ -45,7 +45,7 @@ namespace Client.Properties { return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. diff --git a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.resx b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.resx index af7dbebb..9c90483a 100644 --- a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.resx +++ b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/Properties/Resources.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/WinFormsClient.csproj b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/WinFormsClient.csproj index 3e14f864..fd16b4cc 100644 --- a/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/WinFormsClient.csproj +++ b/samples/features/in-memory-database/in-memory-oltp/wwi-sales-orders/WinFormsClient/WinFormsClient.csproj @@ -90,7 +90,7 @@ -
    - + - +
    diff --git a/samples/features/json/Dapper-Orm/wwwroot/media/js/jquery.view-engine.js b/samples/features/json/Dapper-Orm/wwwroot/media/js/jquery.view-engine.js index 9f49d28b..fefdeb84 100644 --- a/samples/features/json/Dapper-Orm/wwwroot/media/js/jquery.view-engine.js +++ b/samples/features/json/Dapper-Orm/wwwroot/media/js/jquery.view-engine.js @@ -1,16 +1,16 @@ /* * File: jquery.view-engine.js * Version: 1.0.1 -* Author: Jovan Popovic -* +* Author: Jovan Popovic +* * Copyright 2017 Jovan Popovic, all rights reserved. * * This source file is free software, under either the GPL v2 license or a * BSD style license, as supplied with this software. -* -* This source file is distributed in the hope that it will be useful, but -* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -* or FITNESS FOR A PARTICULAR PURPOSE. +* +* This source file is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +* or FITNESS FOR A PARTICULAR PURPOSE. * * This file contains implementation of the JQuery templating engine that load JSON * objects into the HTML code. It is based on Alexandre Caprais notemplate plugin @@ -35,7 +35,7 @@ $(") var template = $(domNode).clone(true); for (var i = data.length - 1; i > 0 ; i--){ @@ -259,7 +259,7 @@ properties.onLoading(); bind(obj, this); properties.onLoaded(); - + }); }; })(jQuery); \ No newline at end of file diff --git a/samples/features/json/Dapper-Orm/wwwroot/media/js/products.js b/samples/features/json/Dapper-Orm/wwwroot/media/js/products.js index 809190f0..cb822d53 100644 --- a/samples/features/json/Dapper-Orm/wwwroot/media/js/products.js +++ b/samples/features/json/Dapper-Orm/wwwroot/media/js/products.js @@ -15,7 +15,7 @@ var ProductController = .fail(function () { toastr.error('An error occured while trying to get the product.'); }); - + }, saveProduct: function (productID, product) { @@ -79,10 +79,10 @@ $(document).ready(function () { } ] });// end DataTable setup - + // Bootstrap modal setup $modal = $('#myModal'); - + $modal.on('hide.bs.modal', function () { $(this).find("input[type!=checkbox],textarea,select").val('').end(); $(this).find("input:checkbox").prop('checked', false); diff --git a/samples/features/json/Dapper-Orm/wwwroot/report.html b/samples/features/json/Dapper-Orm/wwwroot/report.html index 7c47131b..8871e03d 100644 --- a/samples/features/json/Dapper-Orm/wwwroot/report.html +++ b/samples/features/json/Dapper-Orm/wwwroot/report.html @@ -5,7 +5,7 @@ - '; - + docElem.insertBefore(fakeBody, refNode); - bool = div.offsetWidth == 42; + bool = div.offsetWidth == 42; docElem.removeChild(fakeBody); - + return { matches: bool, media: q }; }; - + })(document); @@ -149,11 +149,11 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ for( ; j < eql; j++ ){ thisq = eachq[ j ]; - mediastyles.push( { + mediastyles.push( { media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all", rules : rules.length - 1, hasquery: thisq.indexOf("(") > -1, - minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), + minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), maxw : thisq.match( /\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ) } ); } @@ -199,7 +199,7 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ return ret; }, - //cached container for 1em value, populated the first time it's needed + //cached container for 1em value, populated the first time it's needed eminpx, //enable/disable styles @@ -264,13 +264,13 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one! head.insertBefore( ss, lastLink.nextSibling ); - if ( ss.styleSheet ){ + if ( ss.styleSheet ){ ss.styleSheet.cssText = css; - } + } else { ss.appendChild( doc.createTextNode( css ) ); } - + //push to appendedEls to track for later removal appendedEls.push( ss ); } @@ -293,7 +293,7 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ } req.send( null ); }, - //define ajax obj + //define ajax obj xmlHttp = (function() { var xmlhttpmethod = false; try { diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Manage/Index.cshtml b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Manage/Index.cshtml index 62f022de..d2eddd17 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Manage/Index.cshtml +++ b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Manage/Index.cshtml @@ -30,13 +30,13 @@ @* Phone Numbers can used as a second factor of verification in a two-factor authentication system. - + See this article for details on setting up this ASP.NET application to support two-factor authentication using SMS. - + Uncomment the following block after you have set up two-factor authentication *@ - @* + @*
    Phone Number:
    @(Model.PhoneNumber ?? "None") [ diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Create.cshtml b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Create.cshtml index 6e470001..4bd1aba7 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Create.cshtml +++ b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Create.cshtml @@ -7,10 +7,10 @@

    Create

    -@using (Html.BeginForm()) +@using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Patient


    diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Edit.cshtml b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Edit.cshtml index ac062559..ede6c535 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Edit.cshtml +++ b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Patients/Edit.cshtml @@ -10,7 +10,7 @@ @using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Patient


    diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Create.cshtml b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Create.cshtml index 5b08d8b2..d06974e3 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Create.cshtml +++ b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Create.cshtml @@ -7,10 +7,10 @@

    Create

    -@using (Html.BeginForm()) +@using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Visit


    diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Edit.cshtml b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Edit.cshtml index 68b695dc..f5d34ffc 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Edit.cshtml +++ b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Views/Visits/Edit.cshtml @@ -10,7 +10,7 @@ @using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Visit


    diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Web.config b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Web.config index 4d20d305..630ec96b 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Web.config +++ b/samples/features/security/always-encrypted-with-secure-enclaves/src/ContosoClinic/Web.config @@ -5,7 +5,7 @@ --> - +
    diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/CreateXESession.sql b/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/CreateXESession.sql index 20193c5f..941c7305 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/CreateXESession.sql +++ b/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/CreateXESession.sql @@ -1,10 +1,10 @@ -CREATE EVENT SESSION [ClinicDemo] ON SERVER +CREATE EVENT SESSION [ClinicDemo] ON SERVER ADD EVENT sqlserver.rpc_completed(SET collect_data_stream=(1),collect_statement=(1) WHERE ([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'Clinic') AND [package0].[not_equal_unicode_string]([statement],N'exec sp_reset_connection'))) ADD TARGET package0.ring_buffer WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=2 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) GO -ALTER EVENT SESSION [ClinicDemo] -ON SERVER -STATE = start; +ALTER EVENT SESSION [ClinicDemo] +ON SERVER +STATE = start; GO \ No newline at end of file diff --git a/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/QueryColumns.sql b/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/QueryColumns.sql index 501c5e54..e8e77f2f 100644 --- a/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/QueryColumns.sql +++ b/samples/features/security/always-encrypted-with-secure-enclaves/tsql-scripts/QueryColumns.sql @@ -5,7 +5,7 @@ DECLARE @SSNSuffix [CHAR](11) = '%38' DECLARE @LastNamePettern [NVARCHAR](50) = 'A%' DECLARE @MinBirthDate [DATETIME2](7) = '19900101' DECLARE @MaxBirthDate [DATETIME2](7) = '20150101' -SELECT * FROM [dbo].[Patients] +SELECT * FROM [dbo].[Patients] WHERE [SSN] LIKE @SSNSuffix AND [LastName] LIKE @LastNamePettern AND [BirthDate] >= @MinBirthDate AND [BirthDate] < @MaxBirthDate diff --git a/samples/features/security/azure-active-directory-auth/integrated/App.config b/samples/features/security/azure-active-directory-auth/integrated/App.config index 2d2a12d8..c3faffbe 100644 --- a/samples/features/security/azure-active-directory-auth/integrated/App.config +++ b/samples/features/security/azure-active-directory-auth/integrated/App.config @@ -1,6 +1,6 @@ - + diff --git a/samples/features/security/azure-active-directory-auth/integrated/Integrated.csproj b/samples/features/security/azure-active-directory-auth/integrated/Integrated.csproj index ee7268ff..8c62c137 100644 --- a/samples/features/security/azure-active-directory-auth/integrated/Integrated.csproj +++ b/samples/features/security/azure-active-directory-auth/integrated/Integrated.csproj @@ -49,7 +49,7 @@ - -- **Applies to:** Azure SQL Database, Azure SQL Data Warehouse -- **Key features:** Azure Active Directory Authentication +- **Applies to:** Azure SQL Database, Azure SQL Data Warehouse +- **Key features:** Azure Active Directory Authentication - **Programming Language:** C# - **Authors:** Mirek Sztajno [mireks-msft] @@ -33,24 +33,24 @@ To run this sample, you need the following prerequisites: + To install .Net Framework 4.6, see https://msdn.microsoft.com/library/5a4x27ek.aspx 2. Active Directory Authentication Library for SQL Server (ADALSQL.DLL) + ADALSQL.DLL enables applications to authenticate to Microsoft Azure SQL Database using Azure Active Directory. The ADALSQL.DLL is not installed with Visual Studio so download the DLL at http://www.microsoft.com/en-us/download/details.aspx?id=48742 - + ADALSQL.DLL is automatically downloaded with Visual Studio 2015 Update 2, SQL Server Management Studio, and the newest version of SQL Server Data tools + + ADALSQL.DLL is automatically downloaded with Visual Studio 2015 Update 2, SQL Server Management Studio, and the newest version of SQL Server Data tools 1. Create Azure Active Directory (AD), or federate your domain with existing Azure AD This allows either to use managed or federated accounts associated with a specific Azure AD -2. Create Azure AD administrator for Azure SQL DB using Azure portal, PowerShell command or Rest API -3. With help from T-SQL query interface (i.e. SSMS query editor), using Azure AD admin credentials for SQL DB & SQL DW, create an Azure AD user in a designated database. The database user represents your Azure AD principal (or one of the groups you belong to) and must exist in the database having CONNECT permission prior to executing a connection attempt +2. Create Azure AD administrator for Azure SQL DB using Azure portal, PowerShell command or Rest API +3. With help from T-SQL query interface (i.e. SSMS query editor), using Azure AD admin credentials for SQL DB & SQL DW, create an Azure AD user in a designated database. The database user represents your Azure AD principal (or one of the groups you belong to) and must exist in the database having CONNECT permission prior to executing a connection attempt - -**Other Prerequisites** + +**Other Prerequisites** 1. For Azure AD integrated authentication a computer joined to a domain that is federated with Azure Active Directory is required -2. An existing database created before a connection attempt is required. The database can be created using credentials for SQL administrator, or Azure AD SQL administrator +2. An existing database created before a connection attempt is required. The database can be created using credentials for SQL administrator, or Azure AD SQL administrator ## Run this sample - + [Integrated Demo](integrated) @@ -65,17 +65,17 @@ To run this sample, you need the following prerequisites: This demo provides a simple tool for exploring Azure Active Directory authentication to Azure SQL DB or Azure SQL DW. Azure Active Directory authentication with Azure SQL Database V12 supports the following authentication methods: -- User/password authentication -- Integrated authentication +- User/password authentication +- Integrated authentication - Application token authentication ## Disclaimers -The code included in this sample is only intended to provide a method to demonstrate sucessful authentication to Azure SQL Database or Azure SQL Data Warehouse via Azure Active Directory authentication methods. +The code included in this sample is only intended to provide a method to demonstrate sucessful authentication to Azure SQL Database or Azure SQL Data Warehouse via Azure Active Directory authentication methods. ## Related Links - + diff --git a/samples/features/security/azure-active-directory-auth/token/Properties/AssemblyInfo.cs b/samples/features/security/azure-active-directory-auth/token/Properties/AssemblyInfo.cs index bab8f890..67523091 100644 --- a/samples/features/security/azure-active-directory-auth/token/Properties/AssemblyInfo.cs +++ b/samples/features/security/azure-active-directory-auth/token/Properties/AssemblyInfo.cs @@ -2,7 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// General Information about an assembly is controlled through the following +// General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Token")] @@ -14,8 +14,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] @@ -25,11 +25,11 @@ using System.Runtime.InteropServices; // Version information for an assembly consists of the following four values: // // Major Version -// Minor Version +// Minor Version // Build Number // Revision // -// You can specify all the values or you can default the Build and Revision Numbers +// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] diff --git a/samples/features/security/azure-active-directory-auth/token/README.md b/samples/features/security/azure-active-directory-auth/token/README.md index 0902442b..2e44d471 100644 --- a/samples/features/security/azure-active-directory-auth/token/README.md +++ b/samples/features/security/azure-active-directory-auth/token/README.md @@ -8,17 +8,17 @@ ## About this sample -The Token project contains a simple console application that connects to Azure SQL database using a self-signed certificate. +The Token project contains a simple console application that connects to Azure SQL database using a self-signed certificate. **Software prerequisites:** -1. The `makecert.exe` utility, which is included in the Windows SDK - + It is sometimes included in Visual Studio installations (depending on the selections made during installation). A search of your machine for `makecert.exe` would provide verification that the Windows SDK was installed. +1. The `makecert.exe` utility, which is included in the Windows SDK + + It is sometimes included in Visual Studio installations (depending on the selections made during installation). A search of your machine for `makecert.exe` would provide verification that the Windows SDK was installed. + If the Windows SDK was not installed, you may [download it here](http://msdn.microsoft.com/en-US/windows/desktop/aa904949) + You can learn more about the `makecert.exe` [utility here](https://msdn.microsoft.com/library/windows/desktop/aa386968.aspx) 2. PowerShell with Azure Active Directory Module - + To download the latest PowerShell version [see this page](https://azure.microsoft.com/en-us/documentation/articles/powershell-install-configure/#Install) - + [Install the Azure AD PowerShell Module](https://msdn.microsoft.com/en-us/library/azure/jj151815.aspx), if it is not already installed in your client machine. + + To download the latest PowerShell version [see this page](https://azure.microsoft.com/en-us/documentation/articles/powershell-install-configure/#Install) + + [Install the Azure AD PowerShell Module](https://msdn.microsoft.com/en-us/library/azure/jj151815.aspx), if it is not already installed in your client machine. ## Run this sample @@ -42,22 +42,22 @@ The Token project contains a simple console application that connects to Azure S ``` - [See this link](https://azure.microsoft.com/en-us/documentation/articles/sql-database-aad-authentication/) for more details on how to create an Azure Ad admin and a contained database user. -3. On the machine you are going to run the project on, generate and install a self-signed certificate. - - To complete this step, you will need to use `Makecert.exe` +3. On the machine you are going to run the project on, generate and install a self-signed certificate. + - To complete this step, you will need to use `Makecert.exe` - Open a command prompt window - - Navigate to a folder where you want to generate a certificate file ( such as the folder where the demo files are) and change the following command for your environment + - Navigate to a folder where you want to generate a certificate file ( such as the folder where the demo files are) and change the following command for your environment ``` \makecert.exe -r -pe -n "CN=Cert_name" -ss My -len 2048 Cert_name.cer ``` - for example, like so: + for example, like so: ``` c:/"Program Files (x86)/Windows Kits/8.1/bin/x64"/makecert -r -pe -n "CN=mytokentestCert" -ss My -len 2048 mytokentestCert.cer ``` -4. Add the certificate as a key for the application you created in Azure AD. - - Click the Microsoft Azure Active Directory Module for Windows PowerShell shortcut on desktop to open a Windows PowerShell workspace that has the Azure AD cmdlets. - - Copy the following code snippet to a text editor. - - `connect-msolservice` will ask for you Azure AD credentials. Please be sure to use credentials that are part of Azure AD global admin to connect and to proceed with the scripts below. - ``` +4. Add the certificate as a key for the application you created in Azure AD. + - Click the Microsoft Azure Active Directory Module for Windows PowerShell shortcut on desktop to open a Windows PowerShell workspace that has the Azure AD cmdlets. + - Copy the following code snippet to a text editor. + - `connect-msolservice` will ask for you Azure AD credentials. Please be sure to use credentials that are part of Azure AD global admin to connect and to proceed with the scripts below. + ``` connect-msolservice $cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate @@ -66,19 +66,19 @@ The Token project contains a simple console application that connects to Azure S $credValue = [System.Convert]::ToBase64String($binCert); New-MsolServicePrincipalCredential -AppPrincipalId "" -Type asymmetric -Value $credValue -Usage verify ``` - + Replace with the path to your certificate and Cert_name with your Certificate name that you used in step 3 above. - + Replace with the client ID you copied in step 1. - + Copy and paste your snippet into the powershell window and run it. + + Replace with the path to your certificate and Cert_name with your Certificate name that you used in step 3 above. + + Replace with the client ID you copied in step 1. + + Copy and paste your snippet into the powershell window and run it. - The following command will verify that you added the certificate to your application's Active Directory Registration - ``` Get-MsolServicePrincipalCredential –ServicePrincipalName "URL"-ReturnKeyValues 0 ``` + ``` Get-MsolServicePrincipalCredential –ServicePrincipalName "URL"-ReturnKeyValues 0 ``` -5. Configure the certificate and your application account in the *app.config* file in the project. +5. Configure the certificate and your application account in the *app.config* file in the project. + In Visual Studio, open *app.config* in the Solution Explorer ![App.config file highlights](/samples/features/security/azure-active-directory-auth/img/app-config-key-value-example.png) - Find the app key `ida:Tenant` and replace the value with your AAD tenant name (your AAD domain) - - Find the app key `ida:ClientID` and replace the value with the Client ID for the application registration from the Azure Portal (the value from step 1). + - Find the app key `ida:ClientID` and replace the value with the Client ID for the application registration from the Azure Portal (the value from step 1). - Find the app key `ida:Cert_Name` and replace the value with the subject name (CN) of the self-signed certificate you created - - For example: + - For example: ```csharp //this is the AAD domain //this is the Client ID @@ -86,11 +86,11 @@ The Token project contains a simple console application that connects to Azure S ``` + In Visual Studio, open *Program.cs* in the Solution Explorer ![Program.cs field highlights](/samples/features/security/azure-active-directory-auth/img/program-cs-builder-highlight.png) - - Make the following changes: + - Make the following changes: ```csharp builder["Data Source"] = "aad-managed-demo.database.windows.net"; // replace with your server name builder["Initial Catalog"] = "demo"; // replace with your database name ``` 6. Run the demo. (Click *Run* or press *F5*) - + A successful authorization should result in a message that states "Connected to the database" similar to the following: + + A successful authorization should result in a message that states "Connected to the database" similar to the following: ![succesful auth](/samples/features/security/azure-active-directory-auth/img/token-press-any-key-to-stop.png) diff --git a/samples/features/security/azure-active-directory-auth/token/Token.csproj b/samples/features/security/azure-active-directory-auth/token/Token.csproj index 86072916..98cc55fb 100644 --- a/samples/features/security/azure-active-directory-auth/token/Token.csproj +++ b/samples/features/security/azure-active-directory-auth/token/Token.csproj @@ -63,7 +63,7 @@ - ``` - + Update the value of the *Data Source* key word in the database connection string to denote your server + + Update the value of the *Data Source* key word in the database connection string to denote your server + Make sure the *password* for your application users is correct (matches the password that you configured earlier) + Make sure the *Initial Catalog* value is set to *Clinic* + Save the file -3. Make sure the .NET Framework 4.6.1 or higher is configured as the target .NET Framework for your project. +3. Make sure the .NET Framework 4.6.1 or higher is configured as the target .NET Framework for your project. + Right click on your project in Solution Explorer and select *Properties* - + Verify the value of the Target framework property is correct (change it, if necessary) + + Verify the value of the Target framework property is correct (change it, if necessary) ![Contoso Clinic Application Properties .Net Framework Version Setting](img/dot-net-framework-4-6.png) 4. Test the Demo Setup - + Run the ContosoClinic application from Visual Studio (by hitting *F5* OR select *Debug* > *Start Debugging*). This will compile the solution and open the application in your default web browser. - + Click on the *Patients* tab. You should see a list of patients. + + Run the ContosoClinic application from Visual Studio (by hitting *F5* OR select *Debug* > *Start Debugging*). This will compile the solution and open the application in your default web browser. + + Click on the *Patients* tab. You should see a list of patients. ![List of Patients on web app patients tab](img/list-of-patients.png) - + Click *Edit* for one of the patients, change patient's SSN and click *Save*. The updated SSN should show up in the list of patients. - + You are now ready to demo the security features described below. + + Click *Edit* for one of the patients, change patient's SSN and click *Save*. The updated SSN should show up in the list of patients. + + You are now ready to demo the security features described below. ## SQL 2016 Security Features in this Demo -### Always Encrypted +### Always Encrypted #### Enable Always Encrypted -+ Connect to your database using SSMS: ++ Connect to your database using SSMS: - For more information on using SSMS to connect to a Database, [click here](https://azure.microsoft.com/en-us/documentation/articles/sql-database-connect-query-ssms/) -+ Encrypt Sensitive Data Columns using the Column Encryption Wizard ++ Encrypt Sensitive Data Columns using the Column Encryption Wizard - Right click on the **Patients** table in the **Clinic** database and select **Encrypt Columns...** - ![Right Click patients table encrypt columns dropdown](img/right-click-patients-table-encrypt-columns.png) + ![Right Click patients table encrypt columns dropdown](img/right-click-patients-table-encrypt-columns.png) - The Column Encryption wizard will open. Click **Next**. ![Always Encrypted Wizard introduction page](img/always-encrypted-wizard-introduction-page.png) - - Select the **SSN** and **BirthDate** columns. - * Select **Deterministic Encryption** for **SSN** as the application needs to be able to search patients by SSN; Deterministic Encryption preserves that functionality for our app without leaving data exposed. - * Select **Randomized Encryption** for **BirthDate** + - Select the **SSN** and **BirthDate** columns. + * Select **Deterministic Encryption** for **SSN** as the application needs to be able to search patients by SSN; Deterministic Encryption preserves that functionality for our app without leaving data exposed. + * Select **Randomized Encryption** for **BirthDate** ![Always Encrypted Column Selection Page](img/column-selection-ssn-birthdate.png) - Leave **CEK_Auto1 (New)** as the Key for both columns. Click **Next**. - On the **Master Key Configuration** page, the Master Key Source should default to to **Windows Certificate Store**, with the **Master Key Source** defaulted to **Current User**. (This will store the key on your local machine.) @@ -98,62 +98,62 @@ This project has adopted the [Microsoft Open Source Code of Conduct](http://micr ![Always Encrypted Summary Page](img/always-encrypted-summary.png) - Monitor the progress of the wizard; once finished, click **Close**. ![Always Encrypted Results Success](img/always-encrypted-results.png) -+ View the data in SSMS (in SSMS use: `SELECT SSN, BirthDate FROM dbo.Patients` or `SELECT * FROM dbo.Patients` ) - - Note that the data is now encrypted on the server for both the **SSN** and **BirthDate** columns. ++ View the data in SSMS (in SSMS use: `SELECT SSN, BirthDate FROM dbo.Patients` or `SELECT * FROM dbo.Patients` ) + - Note that the data is now encrypted on the server for both the **SSN** and **BirthDate** columns. + Navigate to or refresh the /patients page - - Notice that the application now throws an exception. + - Notice that the application now throws an exception. - This was expected as the application driver does not know how to handle the encrypted data. - - We designed this web app to have a type mismatch, but more flexible webpage design would expose the encrypted value. -+ Configure the web app to use Always Encrypted - - Stop the web app (close the window/ or click *Stop Debugging*) - - Using the Solution Explorer of Visual Studio, locate and open the web.config file under the ContosoClinic project. + - We designed this web app to have a type mismatch, but more flexible webpage design would expose the encrypted value. ++ Configure the web app to use Always Encrypted + - Stop the web app (close the window/ or click *Stop Debugging*) + - Using the Solution Explorer of Visual Studio, locate and open the web.config file under the ContosoClinic project. - Look for the connection string, and add `Column Encryption Setting=Enabled` to the end of the connection string so that it reads like this: - ```csharp + ```csharp ``` - Run the ContosoClinic application from Visual Studio (by hitting *F5* OR select *Debug* > *Start Debugging*) - - Click on the *Patients* tab. You should see a list of patients again. + - Click on the *Patients* tab. You should see a list of patients again. -#### How did that work? +#### How did that work? ##### Connection String -Our connection string for our application now contains `Column Encryption Setting=Enabled` which instructs the driver to automatically encrypt parameters targeting encrypted columns and decrypt any results retrieved from encrypted columns, without code changes. Don't forget this for your app if you intend to use Always Encrypted functonality. For more information this feature, [see our blog](https://blogs.msdn.microsoft.com/sqlsecurity/2016/07/11/always-encrypted-in-azure-sql-database-is-generally-available/). +Our connection string for our application now contains `Column Encryption Setting=Enabled` which instructs the driver to automatically encrypt parameters targeting encrypted columns and decrypt any results retrieved from encrypted columns, without code changes. Don't forget this for your app if you intend to use Always Encrypted functonality. For more information this feature, [see our blog](https://blogs.msdn.microsoft.com/sqlsecurity/2016/07/11/always-encrypted-in-azure-sql-database-is-generally-available/). -### Row Level Security (RLS) +### Row Level Security (RLS) -#### Login to the application +#### Login to the application Sign in using (Rachel@contoso.com/Password!1) or (alice@contoso.com/Password!1) -#### Enable Row Level Security (RLS) -+ Connect to your database using SSMS: +#### Enable Row Level Security (RLS) ++ Connect to your database using SSMS: [Instructions](https://azure.microsoft.com/en-us/documentation/articles/sql-database-connect-query-ssms/) + Open Enable-RLS.sql ( [Find it here](tsql-scripts/Enable-RLS.sql)) -+ Execute the commands ++ Execute the commands + Observe the changes to the results returned on the /visits or /patients page -#### How did that work? +#### How did that work? -##### The application leverages an Entity Framework feature called **interceptors** -Specifically, we used a `DbConnectionInterceptor`. The `Opened()` function is called whenever Entity Framework opens a connection and we set SESSION_CONTEXT with the current application `UserId` there. +##### The application leverages an Entity Framework feature called **interceptors** +Specifically, we used a `DbConnectionInterceptor`. The `Opened()` function is called whenever Entity Framework opens a connection and we set SESSION_CONTEXT with the current application `UserId` there. ##### Predicate functions -The predicate functions we created in Enable-RLS.sql identify users by the `UserId` which was set by our interceptor whenever a connection is established from the application. The two types of predicates we created were **Filter** and **Block**. -+ **Filter** predicates silently filter `SELECT`, `UPDATE`, and `DELETE` operations to exclude rows that do not satisfy the predicate. -+ **Block** predicates explicitly block (throw errors) on `INSERT`, `UPDATE`, and `DELETE` operations that do not satisfy the predicate. +The predicate functions we created in Enable-RLS.sql identify users by the `UserId` which was set by our interceptor whenever a connection is established from the application. The two types of predicates we created were **Filter** and **Block**. ++ **Filter** predicates silently filter `SELECT`, `UPDATE`, and `DELETE` operations to exclude rows that do not satisfy the predicate. ++ **Block** predicates explicitly block (throw errors) on `INSERT`, `UPDATE`, and `DELETE` operations that do not satisfy the predicate. ### Dynamic Data Masking #### Enable Dynamic Data Masking + Navigate to the /patients page + Connect to your deployed database using SSMS: [Instructions](https://azure.microsoft.com/en-us/documentation/articles/sql-database-connect-query-ssms/) -+ Open Enable-DDM.sql ([Find it here](tsql-scripts/Enable-DDM.sql)) ++ Open Enable-DDM.sql ([Find it here](tsql-scripts/Enable-DDM.sql)) + Execute the commands + Observe the changes in results returned on the /visits page -#### How did that work? -Dynamic data masking limits sensitive data exposure by masking the data according to policies defined on the database level while the data in the database remains unchanged; this is based on the database user's permissions. Those with the `UNMASK` permission will -have the ability to see the data without masks. In our case, the application's database login did not have the `UNMASK` permission and saw the data as masked. For your administrator login, the data was visible, as the user had the `UNMASK` permission. For more information on Dynamic Data Masking, [see the documentation](https://msdn.microsoft.com/en-us/library/mt130841.aspx). +#### How did that work? +Dynamic data masking limits sensitive data exposure by masking the data according to policies defined on the database level while the data in the database remains unchanged; this is based on the database user's permissions. Those with the `UNMASK` permission will +have the ability to see the data without masks. In our case, the application's database login did not have the `UNMASK` permission and saw the data as masked. For your administrator login, the data was visible, as the user had the `UNMASK` permission. For more information on Dynamic Data Masking, [see the documentation](https://msdn.microsoft.com/en-us/library/mt130841.aspx). ## Application Notes -The code included in this sample is only intended to provide a simple demo platform for users to enable and gain experience with SQL Server 2016 security features; the demo web app is not intended to hold sensitive data and should not be used as a reference for applications that use or store sensitive data. Please take adequate steps to securely develop your application and store your data. +The code included in this sample is only intended to provide a simple demo platform for users to enable and gain experience with SQL Server 2016 security features; the demo web app is not intended to hold sensitive data and should not be used as a reference for applications that use or store sensitive data. Please take adequate steps to securely develop your application and store your data. diff --git a/samples/features/security/contoso-clinic/setup/Create-Application-Login.sql b/samples/features/security/contoso-clinic/setup/Create-Application-Login.sql index 39b701fc..935aeb97 100644 --- a/samples/features/security/contoso-clinic/setup/Create-Application-Login.sql +++ b/samples/features/security/contoso-clinic/setup/Create-Application-Login.sql @@ -4,9 +4,9 @@ go CREATE LOGIN [ContosoClinicApplication] WITH PASSWORD = CREATE USER [ContosoClinicApplication] FOR LOGIN [ContosoClinicApplication] -EXEC sp_addrolemember N'db_datareader', N'ContosoClinicApplication' -EXEC sp_addrolemember N'db_datawriter', N'ContosoClinicApplication' -GRANT VIEW ANY COLUMN MASTER KEY DEFINITION TO [ContosoClinicApplication] -GRANT VIEW ANY COLUMN ENCRYPTION KEY DEFINITION TO [ContosoClinicApplication] +EXEC sp_addrolemember N'db_datareader', N'ContosoClinicApplication' +EXEC sp_addrolemember N'db_datawriter', N'ContosoClinicApplication' +GRANT VIEW ANY COLUMN MASTER KEY DEFINITION TO [ContosoClinicApplication] +GRANT VIEW ANY COLUMN ENCRYPTION KEY DEFINITION TO [ContosoClinicApplication] diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/IdentityConfig.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/IdentityConfig.cs index bf0b2dea..ebac5d21 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/IdentityConfig.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/IdentityConfig.cs @@ -40,7 +40,7 @@ namespace ContosoClinic { } - public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) + public static ApplicationUserManager Create(IdentityFactoryOptions options, IOwinContext context) { var manager = new ApplicationUserManager(new UserStore(context.Get())); // Configure validation logic for usernames @@ -81,7 +81,7 @@ namespace ContosoClinic var dataProtectionProvider = options.DataProtectionProvider; if (dataProtectionProvider != null) { - manager.UserTokenProvider = + manager.UserTokenProvider = new DataProtectorTokenProvider(dataProtectionProvider.Create("ASP.NET Identity")); } return manager; diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/Startup.Auth.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/Startup.Auth.cs index 70c2512a..b4b42a8c 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/Startup.Auth.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/App_Start/Startup.Auth.cs @@ -29,12 +29,12 @@ namespace ContosoClinic Provider = new CookieAuthenticationProvider { // Enables the application to validate the security stamp when the user logs in. - // This is a security feature which is used when you change a password or add an external login to your account. + // This is a security feature which is used when you change a password or add an external login to your account. OnValidateIdentity = SecurityStampValidator.OnValidateIdentity( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } - }); + }); app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process. diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Content/Site.css b/samples/features/security/contoso-clinic/src/ContosoClinic/Content/Site.css index 6ea5d8f6..5e35f97d 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Content/Site.css +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Content/Site.css @@ -9,8 +9,8 @@ padding-right: 15px; } -/* Override the default bootstrap behavior where horizontal description lists - will truncate terms that are too long to fit in the left column +/* Override the default bootstrap behavior where horizontal description lists + will truncate terms that are too long to fit in the left column */ .dl-horizontal dt { white-space: normal; diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/AccountController.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/AccountController.cs index 34e8b0b8..714fd886 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/AccountController.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/AccountController.cs @@ -34,9 +34,9 @@ namespace ContosoClinic.Controllers { return _signInManager ?? HttpContext.GetOwinContext().Get(); } - private set - { - _signInManager = value; + private set + { + _signInManager = value; } } @@ -116,9 +116,9 @@ namespace ContosoClinic.Controllers return View(model); } - // The following code protects for brute force attacks against the two factor codes. - // If a user enters incorrect codes for a specified amount of time then the user account - // will be locked out for a specified amount of time. + // The following code protects for brute force attacks against the two factor codes. + // If a user enters incorrect codes for a specified amount of time then the user account + // will be locked out for a specified amount of time. // You can configure the account lockout settings in IdentityConfig var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, isPersistent: model.RememberMe, rememberBrowser: model.RememberBrowser); switch (result) @@ -156,7 +156,7 @@ namespace ContosoClinic.Controllers if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); - + // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/ManageController.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/ManageController.cs index 7a21a1c4..34c9c265 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/ManageController.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/ManageController.cs @@ -32,9 +32,9 @@ namespace ContosoClinic.Controllers { return _signInManager ?? HttpContext.GetOwinContext().Get(); } - private set - { - _signInManager = value; + private set + { + _signInManager = value; } } diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/PatientsController.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/PatientsController.cs index 6bd26119..8e1378ef 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/PatientsController.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/PatientsController.cs @@ -42,7 +42,7 @@ namespace ContosoClinic.Controllers } // POST: Patients/Create - // To protect from overposting attacks, please enable the specific properties you want to bind to, for + // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] @@ -74,7 +74,7 @@ namespace ContosoClinic.Controllers } // POST: Patients/Edit/5 - // To protect from overposting attacks, please enable the specific properties you want to bind to, for + // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/VisitsController.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/VisitsController.cs index e9b04627..15f89ca3 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/VisitsController.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Controllers/VisitsController.cs @@ -44,7 +44,7 @@ namespace ContosoClinic.Controllers } // POST: Visits/Create - // To protect from overposting attacks, please enable the specific properties you want to bind to, for + // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] @@ -78,7 +78,7 @@ namespace ContosoClinic.Controllers } // POST: Visits/Edit/5 - // To protect from overposting attacks, please enable the specific properties you want to bind to, for + // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.Designer.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.Designer.cs index 489a2ba3..562a1334 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.Designer.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.Designer.cs @@ -5,22 +5,22 @@ namespace ContosoClinic.Migrations using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Infrastructure; using System.Resources; - + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] public sealed partial class Initial : IMigrationMetadata { private readonly ResourceManager Resources = new ResourceManager(typeof(Initial)); - + string IMigrationMetadata.Id { get { return "201602170540262_Initial"; } } - + string IMigrationMetadata.Source { get { return null; } } - + string IMigrationMetadata.Target { get { return Resources.GetString("Target"); } diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.cs index cafbf8c9..24b0304e 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.cs @@ -2,7 +2,7 @@ namespace ContosoClinic.Migrations { using System; using System.Data.Entity.Migrations; - + public partial class Initial : DbMigration { public override void Up() @@ -23,7 +23,7 @@ namespace ContosoClinic.Migrations BirthDate = c.DateTime(nullable: false, storeType: "date"), }) .PrimaryKey(t => t.PatientID); - + CreateTable( "dbo.AspNetRoles", c => new @@ -33,7 +33,7 @@ namespace ContosoClinic.Migrations }) .PrimaryKey(t => t.Id) .Index(t => t.Name, unique: true, name: "RoleNameIndex"); - + CreateTable( "dbo.AspNetUserRoles", c => new @@ -46,7 +46,7 @@ namespace ContosoClinic.Migrations .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true) .Index(t => t.UserId) .Index(t => t.RoleId); - + CreateTable( "dbo.AspNetUsers", c => new @@ -66,7 +66,7 @@ namespace ContosoClinic.Migrations }) .PrimaryKey(t => t.Id) .Index(t => t.UserName, unique: true, name: "UserNameIndex"); - + CreateTable( "dbo.AspNetUserClaims", c => new @@ -79,7 +79,7 @@ namespace ContosoClinic.Migrations .PrimaryKey(t => t.Id) .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true) .Index(t => t.UserId); - + CreateTable( "dbo.AspNetUserLogins", c => new @@ -91,9 +91,9 @@ namespace ContosoClinic.Migrations .PrimaryKey(t => new { t.LoginProvider, t.ProviderKey, t.UserId }) .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true) .Index(t => t.UserId); - + } - + public override void Down() { DropForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers"); diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.resx b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.resx index 0b2b98c6..eac13769 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.resx +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170540262_Initial.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.Designer.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.Designer.cs index 8ff06909..0e5d07e9 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.Designer.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.Designer.cs @@ -5,22 +5,22 @@ namespace ContosoClinic.Migrations using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Infrastructure; using System.Resources; - + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] public sealed partial class Visits : IMigrationMetadata { private readonly ResourceManager Resources = new ResourceManager(typeof(Visits)); - + string IMigrationMetadata.Id { get { return "201602170605457_Visits"; } } - + string IMigrationMetadata.Source { get { return null; } } - + string IMigrationMetadata.Target { get { return Resources.GetString("Target"); } diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.cs index a69241c7..9cb4d448 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.cs @@ -2,7 +2,7 @@ namespace ContosoClinic.Migrations { using System; using System.Data.Entity.Migrations; - + public partial class Visits : DbMigration { public override void Up() @@ -21,9 +21,9 @@ namespace ContosoClinic.Migrations .PrimaryKey(t => t.VisitID) .ForeignKey("dbo.Patients", t => t.PatientID, cascadeDelete: true) .Index(t => t.PatientID); - + } - + public override void Down() { DropForeignKey("dbo.Visits", "PatientID", "dbo.Patients"); diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.resx b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.resx index 17be947c..b51c578c 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.resx +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170605457_Visits.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.Designer.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.Designer.cs index 862f1f57..4c8626ef 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.Designer.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.Designer.cs @@ -5,22 +5,22 @@ namespace ContosoClinic.Migrations using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Infrastructure; using System.Resources; - + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] public sealed partial class Nullability : IMigrationMetadata { private readonly ResourceManager Resources = new ResourceManager(typeof(Nullability)); - + string IMigrationMetadata.Id { get { return "201602170720063_Nullability"; } } - + string IMigrationMetadata.Source { get { return null; } } - + string IMigrationMetadata.Target { get { return Resources.GetString("Target"); } diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.cs index 2d37a209..cc5cd8f6 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.cs @@ -2,7 +2,7 @@ namespace ContosoClinic.Migrations { using System; using System.Data.Entity.Migrations; - + public partial class Nullability : DbMigration { public override void Up() @@ -16,7 +16,7 @@ namespace ContosoClinic.Migrations AlterColumn("dbo.Visits", "Reason", c => c.String(nullable: false, maxLength: 4000)); AlterColumn("dbo.Visits", "Treatment", c => c.String(nullable: false, maxLength: 4000)); } - + public override void Down() { AlterColumn("dbo.Visits", "Treatment", c => c.String(maxLength: 4000)); diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.resx b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.resx index f8f4ec0e..301765d7 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.resx +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170720063_Nullability.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.Designer.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.Designer.cs index d34fbf68..fe43b48a 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.Designer.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.Designer.cs @@ -5,22 +5,22 @@ namespace ContosoClinic.Migrations using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Infrastructure; using System.Resources; - + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] public sealed partial class Assignments : IMigrationMetadata { private readonly ResourceManager Resources = new ResourceManager(typeof(Assignments)); - + string IMigrationMetadata.Id { get { return "201602170857179_Assignments"; } } - + string IMigrationMetadata.Source { get { return null; } } - + string IMigrationMetadata.Target { get { return Resources.GetString("Target"); } diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.cs index 8b566fd9..847b16e3 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.cs @@ -2,7 +2,7 @@ namespace ContosoClinic.Migrations { using System; using System.Data.Entity.Migrations; - + public partial class Assignments : DbMigration { public override void Up() @@ -19,9 +19,9 @@ namespace ContosoClinic.Migrations .ForeignKey("dbo.Patients", t => t.Patient_PatientID, cascadeDelete: true) .Index(t => t.ApplicationUser_Id) .Index(t => t.Patient_PatientID); - + } - + public override void Down() { DropForeignKey("dbo.ApplicationUserPatients", "Patient_PatientID", "dbo.Patients"); diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.resx b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.resx index 35dffa85..89891bf5 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.resx +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/201602170857179_Assignments.resx @@ -1,17 +1,17 @@  - diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/Configuration.cs b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/Configuration.cs index 0be01477..6790b9dd 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/Configuration.cs +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Migrations/Configuration.cs @@ -151,7 +151,7 @@ namespace ContosoClinic.Migrations new Patient { SSN = "658-41-8532", FirstName = "Twanna", LastName = "Evans", MiddleName = "R.", StreetAddress = "Lewis County Mall", City = "Chehalis", ZipCode = "98532", State = "WA", BirthDate = new System.DateTime(1968, 11, 4) }, new Patient { SSN = "943-41-6011", FirstName = "Carolyn", LastName = "Farino", MiddleName = "", StreetAddress = "3250 South Meridian", City = "Puyallup", ZipCode = "98371", State = "WA", BirthDate = new System.DateTime(1950, 2, 12) }, new Patient { SSN = "691-30-8623", FirstName = "Geri", LastName = "Farrell", MiddleName = "P.", StreetAddress = "49925 Crestview Drive N.E.", City = "Rio Rancho", ZipCode = "87124", State = "NM", BirthDate = new System.DateTime(1962, 8, 11) }, - new Patient { SSN = "361-08-3217", FirstName = "François", LastName = "Ferrier", MiddleName = "", StreetAddress = "Eastridge Mall", City = "Casper", ZipCode = "82601", State = "WY", BirthDate = new System.DateTime(1957, 6, 14) }, + new Patient { SSN = "361-08-3217", FirstName = "Fran�ois", LastName = "Ferrier", MiddleName = "", StreetAddress = "Eastridge Mall", City = "Casper", ZipCode = "82601", State = "WY", BirthDate = new System.DateTime(1957, 6, 14) }, new Patient { SSN = "827-51-1487", FirstName = "Kathie", LastName = "Flood", MiddleName = "", StreetAddress = "705 SE Mall Parkway", City = "Everett", ZipCode = "98201", State = "WA", BirthDate = new System.DateTime(1978, 2, 8) }, new Patient { SSN = "483-93-0057", FirstName = "John", LastName = "Ford", MiddleName = "", StreetAddress = "23025 S.W. Military Rd.", City = "San Antonio", ZipCode = "78204", State = "TX", BirthDate = new System.DateTime(1987, 9, 16) }, new Patient { SSN = "738-37-1607", FirstName = "Garth", LastName = "Fort", MiddleName = "", StreetAddress = "3250 Baldwin Park Blvd", City = "Baldwin Park", ZipCode = "91706", State = "CA", BirthDate = new System.DateTime(1964, 11, 25) }, @@ -255,7 +255,7 @@ namespace ContosoClinic.Migrations new Patient { SSN = "321-14-1319", FirstName = "Scott", LastName = "MacDonald", MiddleName = "", StreetAddress = "St. Louis Marketplace", City = "Saint Louis", ZipCode = "63103", State = "MS", BirthDate = new System.DateTime(1984, 11, 12) }, new Patient { SSN = "340-75-5874", FirstName = "Kathy", LastName = "Marcovecchio", MiddleName = "R.", StreetAddress = "9905 Three Rivers Drive", City = "Kelso", ZipCode = "98626", State = "WA", BirthDate = new System.DateTime(1994, 4, 3) }, new Patient { SSN = "043-85-0648", FirstName = "Melissa", LastName = "Marple", MiddleName = "R.", StreetAddress = "603 Gellert Blvd", City = "Daly City", ZipCode = "94015", State = "CA", BirthDate = new System.DateTime(1956, 9, 26) }, - new Patient { SSN = "253-33-7509", FirstName = "Frank", LastName = "Mart¡nez", MiddleName = "", StreetAddress = "870 N. 54th Ave.", City = "Chandler", ZipCode = "85225", State = "AZ", BirthDate = new System.DateTime(2003, 9, 2) }, + new Patient { SSN = "253-33-7509", FirstName = "Frank", LastName = "Mart�nez", MiddleName = "", StreetAddress = "870 N. 54th Ave.", City = "Chandler", ZipCode = "85225", State = "AZ", BirthDate = new System.DateTime(2003, 9, 2) }, new Patient { SSN = "335-68-4629", FirstName = "Chris", LastName = "Maxwell", MiddleName = "", StreetAddress = "3025 E Waterway Blvd", City = "Shelton", ZipCode = "98584", State = "WA", BirthDate = new System.DateTime(2013, 3, 16) }, new Patient { SSN = "535-30-6577", FirstName = "Sandra", LastName = "Maynard", MiddleName = "B.", StreetAddress = "9952 E. Lohman Ave.", City = "Las Cruces", ZipCode = "88001", State = "NM", BirthDate = new System.DateTime(1971, 6, 20) }, new Patient { SSN = "613-34-9127", FirstName = "Walter", LastName = "Mays", MiddleName = "J.", StreetAddress = "Po Box 252525", City = "Santa Ana", ZipCode = "92701", State = "CA", BirthDate = new System.DateTime(1974, 2, 5) }, @@ -318,8 +318,8 @@ namespace ContosoClinic.Migrations new Visit { PatientID = 1, Date = new System.DateTime(2016, 1, 10), Reason = "Headache", Treatment = "A nap" }, new Visit { PatientID = 1, Date = new System.DateTime(2016, 1, 10), Reason = "Worse headache", Treatment = "A longer nap" } ); - - + + // Create test userts var manager = new UserManager( new UserStore( diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/jquery.validate-vsdoc.js b/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/jquery.validate-vsdoc.js index fd912570..855a2855 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/jquery.validate-vsdoc.js +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/jquery.validate-vsdoc.js @@ -63,7 +63,7 @@ $.extend($.fn, { } validator = new $.validator( options, this[0] ); - $.data(this[0], 'validator', validator); + $.data(this[0], 'validator', validator); if ( validator.settings.onsubmit ) { @@ -247,7 +247,7 @@ $.validator.format = function(source, params) { /// /// - if ( arguments.length == 1 ) + if ( arguments.length == 1 ) return function() { var args = $.makeArray(arguments); args.unshift(source); @@ -409,7 +409,7 @@ $.extend($.validator, { for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { this.check( elements[i] ); } - return this.valid(); + return this.valid(); }, // http://docs.jquery.com/Plugins/Validation/Validator/element @@ -1011,7 +1011,7 @@ $.extend($.validator, { // http://docs.jquery.com/Plugins/Validation/Validator/addMethod addMethod: function(name, method, message) { /// - /// Add a custom validation method. It must consist of a name (must be a legal javascript + /// Add a custom validation method. It must consist of a name (must be a legal javascript /// identifier), a javascript based function and a default string message. /// /// @@ -1022,8 +1022,8 @@ $.extend($.validator, { /// The actual method implementation, returning true if an element is valid /// /// - /// (Optional) The default message to display for this method. Can be a function created by - /// jQuery.validator.format(value). When undefined, an already existing message is used + /// (Optional) The default message to display for this method. Can be a function created by + /// jQuery.validator.format(value). When undefined, an already existing message is used /// (handy for localization), otherwise the field-specific messages have to be defined. /// @@ -1065,7 +1065,7 @@ $.extend($.validator, { previous.originalMessage = this.settings.messages[element.name].remote; this.settings.messages[element.name].remote = previous.message; - param = typeof param == "string" && {url:param} || param; + param = typeof param == "string" && {url:param} || param; if ( this.pending[element.name] ) { return "pending"; @@ -1149,7 +1149,7 @@ $.extend($.validator, { // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); }, - + // http://docs.jquery.com/Plugins/Validation/Methods/date date: function(value, element) { return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); @@ -1201,7 +1201,7 @@ $.extend($.validator, { // http://docs.jquery.com/Plugins/Validation/Methods/accept accept: function(value, element, param) { param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; - return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); + return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); }, // http://docs.jquery.com/Plugins/Validation/Methods/equalTo @@ -1225,7 +1225,7 @@ $.format = $.validator.format; // ajax mode: abort // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); -// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() +// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() ;(function($) { var pendingRequests = {}; // Use a prefilter if available (1.5+) @@ -1260,7 +1260,7 @@ $.format = $.validator.format; // IE has native support, in other browsers, use event caputuring (neither bubbles) // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation -// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target +// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target ;(function($) { // only implement if not provided by jQuery core (since 1.4) // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/respond.js b/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/respond.js index 378d773d..73b9f971 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/respond.js +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Scripts/respond.js @@ -15,30 +15,30 @@ /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */ /*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */ window.matchMedia = window.matchMedia || (function(doc, undefined){ - + var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, // fakeBody required for fakeBody = doc.createElement('body'), div = doc.createElement('div'); - + div.id = 'mq-test-1'; div.style.cssText = "position:absolute;top:-100em"; fakeBody.style.background = "none"; fakeBody.appendChild(div); - + return function(q){ - + div.innerHTML = '­'; - + docElem.insertBefore(fakeBody, refNode); - bool = div.offsetWidth == 42; + bool = div.offsetWidth == 42; docElem.removeChild(fakeBody); - + return { matches: bool, media: q }; }; - + })(document); @@ -163,11 +163,11 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ for( ; j < eql; j++ ){ thisq = eachq[ j ]; - mediastyles.push( { + mediastyles.push( { media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all", rules : rules.length - 1, hasquery: thisq.indexOf("(") > -1, - minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), + minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), maxw : thisq.match( /\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ) } ); } @@ -213,7 +213,7 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ return ret; }, - //cached container for 1em value, populated the first time it's needed + //cached container for 1em value, populated the first time it's needed eminpx, //enable/disable styles @@ -278,13 +278,13 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one! head.insertBefore( ss, lastLink.nextSibling ); - if ( ss.styleSheet ){ + if ( ss.styleSheet ){ ss.styleSheet.cssText = css; - } + } else { ss.appendChild( doc.createTextNode( css ) ); } - + //push to appendedEls to track for later removal appendedEls.push( ss ); } @@ -307,7 +307,7 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ } req.send( null ); }, - //define ajax obj + //define ajax obj xmlHttp = (function() { var xmlhttpmethod = false; try { diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Manage/Index.cshtml b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Manage/Index.cshtml index 62f022de..d2eddd17 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Manage/Index.cshtml +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Manage/Index.cshtml @@ -30,13 +30,13 @@
    @* Phone Numbers can used as a second factor of verification in a two-factor authentication system. - + See this article for details on setting up this ASP.NET application to support two-factor authentication using SMS. - + Uncomment the following block after you have set up two-factor authentication *@ - @* + @*
    Phone Number:
    @(Model.PhoneNumber ?? "None") [ diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Create.cshtml b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Create.cshtml index 6e470001..4bd1aba7 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Create.cshtml +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Create.cshtml @@ -7,10 +7,10 @@

    Create

    -@using (Html.BeginForm()) +@using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Patient


    diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Edit.cshtml b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Edit.cshtml index ac062559..ede6c535 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Edit.cshtml +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Patients/Edit.cshtml @@ -10,7 +10,7 @@ @using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Patient


    diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Create.cshtml b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Create.cshtml index 5b08d8b2..d06974e3 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Create.cshtml +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Create.cshtml @@ -7,10 +7,10 @@

    Create

    -@using (Html.BeginForm()) +@using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Visit


    diff --git a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Edit.cshtml b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Edit.cshtml index 68b695dc..f5d34ffc 100644 --- a/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Edit.cshtml +++ b/samples/features/security/contoso-clinic/src/ContosoClinic/Views/Visits/Edit.cshtml @@ -10,7 +10,7 @@ @using (Html.BeginForm()) { @Html.AntiForgeryToken() - +

    Visit


    diff --git a/samples/features/security/contoso-clinic/tsql-scripts/Enable-RLS.sql b/samples/features/security/contoso-clinic/tsql-scripts/Enable-RLS.sql index d327af63..c5bcd487 100644 --- a/samples/features/security/contoso-clinic/tsql-scripts/Enable-RLS.sql +++ b/samples/features/security/contoso-clinic/tsql-scripts/Enable-RLS.sql @@ -26,13 +26,13 @@ CREATE FUNCTION Security.patientAccessPredicate(@PatientID int) AS RETURN SELECT 1 AS isAccessible FROM dbo.ApplicationUserPatients - WHERE + WHERE ( -- application users can access only patients assigned to them Patient_PatientID = @PatientID - AND ApplicationUser_Id = CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(128)) + AND ApplicationUser_Id = CAST(SESSION_CONTEXT(N'UserId') AS nvarchar(128)) ) - OR + OR ( -- DBAs can access all patients IS_MEMBER('db_owner') = 1 diff --git a/samples/features/security/ledger/azure-sql-database/README.md b/samples/features/security/ledger/azure-sql-database/README.md index b7ce1e89..efa95dfa 100644 --- a/samples/features/security/ledger/azure-sql-database/README.md +++ b/samples/features/security/ledger/azure-sql-database/README.md @@ -87,7 +87,7 @@ In this demo you will use 3 different types of users: - Rachel, who works at the HR department. - Alice, who is an auditor. -- Jay, the DBA of the company. He thinks he should earn more money for the type of work he's doing :) +- Jay, the DBA of the company. He thinks he should earn more money for the type of work he's doing :) Jay wants to maliciously increase his salary. Because he's the DBA of the Contoso database, he thinks he can perform updates in the Employees table without anyone noticing. Unfortunately for Jay, the Employees table is an updatable ledger table, which means his change, along with his identity and the timestamp, have been persisted in a tamper-evident ledger data structures. @@ -99,7 +99,7 @@ Perform the below steps before you show the demo. 1. Start the SQL Server Management Studio. 1. In the **Connect to Server** dialog: 1. Enter your database server name. Set **Authentication** to **SQL Server Authentication**. Enter the admin username and the admin password. - 1. Click the **Options >>** button, select the **Connection Properties** tab and enter the database name (**ContosoHR**). + 1. Click the **Options >>** button, select the **Connection Properties** tab and enter the database name (**ContosoHR**). ![Connection Properties](../../../../../media/features/ledger/ssms-connect-to-server-connection-properties-page.png) @@ -129,7 +129,7 @@ Perform the below steps before you show the demo. 1. *Optional* - If you've showed this demo before, reseed the database to ensure it contains the original employee data. 1. In Object Explorer, find and select the **ContosoHR** database. 1. With the **ContosoHR** database selected, click Ctrl + O. In the **Open File** dialog, navigate to the **setup** folder and select **PopulateDatabase.sql**. - 1. Execute the query. + 1. Execute the query. **Note:** for best demo results, wait 10 minutes after reseeding the database. This will ensure the **Employee Ledger Entries** and **Audit Events** tabs in the app (Auditor's browser) do not show reseeding queries. 1. You can close the **PopulateDatabase.sql** tab. @@ -138,7 +138,7 @@ Perform the below steps before you show the demo. 1. Show the app and the database. 1. Show the Contoso HR web app in the HR user's browser. Click on the **Employees tab**. This application displays employee records, and allows HR staff members to manage employee records. ![Employees tab](../../../../../media/features/ledger/Employees-tab.png) - 1. Switch to SSMS, select the **ListAllEmployees.sql** tab and execute the query, which shows the content of the **Employees** table. The web application uses this table as a data store. + 1. Switch to SSMS, select the **ListAllEmployees.sql** tab and execute the query, which shows the content of the **Employees** table. The web application uses this table as a data store. 1. Show how ledger helps investigate tampering by DBAs. 1. Point to Jay’s record in the table (row #4). Let's assume Jay is both the DBA of the ContosoHR database as well as an employee of Contoso. Jay wants to maliciously increase his salary. diff --git a/samples/features/security/ledger/azure-sql-database/setup/CreateDatabaseSchema.sql b/samples/features/security/ledger/azure-sql-database/setup/CreateDatabaseSchema.sql index 40a64349..d85fc2f3 100644 --- a/samples/features/security/ledger/azure-sql-database/setup/CreateDatabaseSchema.sql +++ b/samples/features/security/ledger/azure-sql-database/setup/CreateDatabaseSchema.sql @@ -11,11 +11,11 @@ CREATE TABLE [dbo].[Employees]( [LastName] [nvarchar](50) NOT NULL, [Salary] [money] NOT NULL ) -WITH +WITH ( SYSTEM_VERSIONING = ON, LEDGER = ON -); +); GO @@ -36,11 +36,11 @@ WITH (LEDGER = ON (APPEND_ONLY = ON)); GO CREATE PROCEDURE [dbo].[GetEmployeeLedgerEntries] -AS +AS BEGIN - SET NOCOUNT ON + SET NOCOUNT ON SELECT - t.[commit_time] AS [CommitTime] + t.[commit_time] AS [CommitTime] , t.[principal_name] AS [UserName] , l.EmployeeId , l.[SSN] @@ -57,9 +57,9 @@ END; GO CREATE PROCEDURE [dbo].[VerifyLedger] -AS +AS BEGIN - SET NOCOUNT ON + SET NOCOUNT ON DECLARE @digest_locations NVARCHAR(MAX) = (SELECT path, last_digest_block_id, is_current FROM sys.database_ledger_digest_locations FOR JSON AUTO, INCLUDE_NULL_VALUES); BEGIN TRY EXEC sys.sp_verify_database_ledger_from_digest_storage @digest_locations; @@ -72,10 +72,10 @@ END; GO CREATE PROCEDURE [dbo].[GetLedgerVerifications] -AS -SET NOCOUNT ON +AS +SET NOCOUNT ON BEGIN - SELECT * + SELECT * FROM [dbo].[LedgerVerifications] WHERE [Timestamp] > DATEADD(MINUTE, -60, SYSDATETIMEOFFSET()) ORDER BY [Timestamp] DESC; @@ -83,10 +83,10 @@ END; GO CREATE PROCEDURE [dbo].[GetAuditEvents] -AS -SET NOCOUNT ON +AS +SET NOCOUNT ON BEGIN - SELECT * + SELECT * FROM [dbo].[AuditEvents] WHERE [Timestamp] > DATEADD(MINUTE, -10, SYSDATETIMEOFFSET()) ORDER BY [Timestamp] DESC; diff --git a/samples/features/security/ledger/azure-sql-database/setup/PopulateDatabase.sql b/samples/features/security/ledger/azure-sql-database/setup/PopulateDatabase.sql index e7df86c6..1b7bd8a8 100644 --- a/samples/features/security/ledger/azure-sql-database/setup/PopulateDatabase.sql +++ b/samples/features/security/ledger/azure-sql-database/setup/PopulateDatabase.sql @@ -3,7 +3,7 @@ DELETE FROM [dbo].[AspNetRoles]; DELETE FROM [dbo].[AspNetUsers]; DELETE FROM [dbo].[AspNetUserRoles]; GO - + DECLARE @SSN1 char(11) = '795-73-9833'; DECLARE @Salary1 Money = 61692.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN1, 'Catherine', 'Abel', @Salary1); DECLARE @SSN2 char(11) = '990-00-6818'; DECLARE @Salary2 Money = 990.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN2, 'Kim', 'Abercrombie', @Salary2); DECLARE @SSN3 char(11) = '009-37-3952'; DECLARE @Salary3 Money = 5684.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN3, 'Frances', 'Adams', @Salary3); @@ -114,7 +114,7 @@ DECLARE @SSN108 char(11) = '763-33-5650'; DECLARE @Salary108 Money = 59254.00; I DECLARE @SSN109 char(11) = '658-41-8532'; DECLARE @Salary109 Money = 35364.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN109, 'Twanna', 'Evans', @Salary109); DECLARE @SSN110 char(11) = '943-41-6011'; DECLARE @Salary110 Money = 76201.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN110, 'Carolyn', 'Farino', @Salary110); DECLARE @SSN111 char(11) = '691-30-8623'; DECLARE @Salary111 Money = 39600.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN111, 'Geri', 'Farrell', @Salary111); -DECLARE @SSN112 char(11) = '361-08-3217'; DECLARE @Salary112 Money = 3704.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN112, 'François', 'Ferrier', @Salary112); +DECLARE @SSN112 char(11) = '361-08-3217'; DECLARE @Salary112 Money = 3704.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN112, 'Fran�ois', 'Ferrier', @Salary112); DECLARE @SSN113 char(11) = '827-51-1487'; DECLARE @Salary113 Money = 78467.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN113, 'Kathie', 'Flood', @Salary113); DECLARE @SSN114 char(11) = '483-93-0057'; DECLARE @Salary114 Money = 77552.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN114, 'John', 'Ford', @Salary114); DECLARE @SSN115 char(11) = '738-37-1607'; DECLARE @Salary115 Money = 34381.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN115, 'Garth', 'Fort', @Salary115); @@ -218,7 +218,7 @@ DECLARE @SSN212 char(11) = '710-73-5330'; DECLARE @Salary212 Money = 2258.00; IN DECLARE @SSN213 char(11) = '321-14-1319'; DECLARE @Salary213 Money = 30158.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN213, 'Scott', 'MacDonald', @Salary213); DECLARE @SSN214 char(11) = '340-75-5874'; DECLARE @Salary214 Money = 10228.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN214, 'Kathy', 'Marcovecchio', @Salary214); DECLARE @SSN215 char(11) = '043-85-0648'; DECLARE @Salary215 Money = 46100.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN215, 'Melissa', 'Marple', @Salary215); -DECLARE @SSN216 char(11) = '253-33-7509'; DECLARE @Salary216 Money = 46267.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN216, 'Frank', 'Mart¡nez', @Salary216); +DECLARE @SSN216 char(11) = '253-33-7509'; DECLARE @Salary216 Money = 46267.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN216, 'Frank', 'Mart�nez', @Salary216); DECLARE @SSN217 char(11) = '335-68-4629'; DECLARE @Salary217 Money = 92921.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN217, 'Chris', 'Maxwell', @Salary217); DECLARE @SSN218 char(11) = '535-30-6577'; DECLARE @Salary218 Money = 60264.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN218, 'Sandra', 'Maynard', @Salary218); DECLARE @SSN219 char(11) = '613-34-9127'; DECLARE @Salary219 Money = 70620.00; INSERT INTO [dbo].[Employees] ([SSN], [FirstName], [LastName], [Salary]) VALUES (@SSN219, 'Walter', 'Mays', @Salary219); diff --git a/samples/features/security/ledger/azure-sql-database/setup/azuredeploy.bicep b/samples/features/security/ledger/azure-sql-database/setup/azuredeploy.bicep index 6287a1d4..2bc10b84 100644 --- a/samples/features/security/ledger/azure-sql-database/setup/azuredeploy.bicep +++ b/samples/features/security/ledger/azure-sql-database/setup/azuredeploy.bicep @@ -9,7 +9,7 @@ param projectName string param userObjectId string @description('The username of the user running the deployment.') -param userName string +param userName string @description('The username of the Azure SQL database server administrator for SQL authentication.') param sqlAdminUserName string @@ -18,7 +18,7 @@ param sqlAdminUserName string param sqlAdminPassword string @description('The IP address the user will connect from to the logical server in Azure SQL Database.') -param clientIP string +param clientIP string @description('The location (the Azure region) for all resources.') param location string = resourceGroup().location @@ -89,7 +89,7 @@ resource Database_Resource 'Microsoft.Sql/servers/databases@2021-02-01-preview' location: location sku: { name: 'GP_S_Gen5_1' - tier: 'GeneralPurpose' + tier: 'GeneralPurpose' } } @@ -102,7 +102,7 @@ var StorageAccount_var = '${projectName}stg' #disable-next-line BCP081 resource StorageAccount_Resource 'Microsoft.Storage/storageAccounts@2021-08-01' = { name: StorageAccount_var - location: location + location: location kind: 'StorageV2' sku: { name: 'Standard_RAGRS' @@ -139,7 +139,7 @@ resource LedgerDigestUploads_Resource 'Microsoft.Sql/servers/databases/ledgerDig // Configure the web application // /////////////////////////////////// -// Create an App Service plan +// Create an App Service plan resource WebAppServicePlan_Resource 'Microsoft.Web/serverfarms@2021-02-01' = { name: '${projectName}plan' location: location @@ -157,11 +157,11 @@ resource WebApp_Resource 'Microsoft.Web/sites@2021-02-01' = { type: 'SystemAssigned' } properties: { - serverFarmId: WebAppServicePlan_Resource.id + serverFarmId: WebAppServicePlan_Resource.id } - + //Set the database connection string for the application - + resource WebAppConnectionString_Resource 'config' = { name: 'connectionstrings' properties: { @@ -170,7 +170,7 @@ resource WebApp_Resource 'Microsoft.Web/sites@2021-02-01' = { type: 'SQLAzure' } } - } + } //Define AppSetting to fetch the correct project from the GitHub Repository resource AppSetting 'config' = { name: 'appsettings' @@ -191,7 +191,7 @@ resource sourceControl 'Microsoft.Web/sites/sourcecontrols@2021-02-01' = { dependsOn: [ Server_Name_resource ] -} +} output Servername string = Server_Name_resource.properties.fullyQualifiedDomainName output DatabaseName string = 'ContosoHR' diff --git a/samples/features/security/ledger/azure-sql-database/setup/setup.ps1 b/samples/features/security/ledger/azure-sql-database/setup/setup.ps1 index 637879dd..110b75a3 100644 --- a/samples/features/security/ledger/azure-sql-database/setup/setup.ps1 +++ b/samples/features/security/ledger/azure-sql-database/setup/setup.ps1 @@ -111,7 +111,7 @@ Invoke-Sqlcmd -ServerInstance "tcp:$fullServerName" -Database $databaseName -Acc # Print parameters for the demo ###################################################################### -$app = Get-AzWebApp -Name $appName -ResourceGroupName $resourceGroupName +$app = Get-AzWebApp -Name $appName -ResourceGroupName $resourceGroupName Write-Host -ForegroundColor "green" "Resource group name: $resourceGroupName" Write-Host -ForegroundColor "green" "Database server name: $fullServerName" Write-Host -ForegroundColor "green" "Database name: $databaseName" diff --git a/samples/features/security/ledger/azure-sql-database/tsql-scripts/GetEmployeeLedgerEntries.sql b/samples/features/security/ledger/azure-sql-database/tsql-scripts/GetEmployeeLedgerEntries.sql index 930e57a6..ce0441d1 100644 --- a/samples/features/security/ledger/azure-sql-database/tsql-scripts/GetEmployeeLedgerEntries.sql +++ b/samples/features/security/ledger/azure-sql-database/tsql-scripts/GetEmployeeLedgerEntries.sql @@ -1,5 +1,5 @@ SELECT -t.[commit_time] AS [CommitTime] +t.[commit_time] AS [CommitTime] , t.[principal_name] AS [UserName] , l.EmployeeId , l.[SSN] diff --git a/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Delete.cshtml b/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Delete.cshtml index 5045646b..ed989299 100644 --- a/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Delete.cshtml +++ b/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Delete.cshtml @@ -37,7 +37,7 @@ @Html.DisplayFor(model => model.Employee.Salary)
    - + | diff --git a/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Edit.cshtml.cs b/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Edit.cshtml.cs index de8a5ef4..42c2b559 100644 --- a/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Edit.cshtml.cs +++ b/samples/features/security/ledger/source/ContosoHR/Pages/Employees/Edit.cshtml.cs @@ -68,7 +68,7 @@ namespace ContosoHR.Pages.Employees salary.Value = Employee.Salary; System.FormattableString query = $"UPDATE [dbo].[Employees] SET [SSN] = {ssn}, [FirstName] = {Employee.FirstName}, [LastName] = {Employee.LastName}, [Salary] = {salary} WHERE [EmployeeID] = {Employee.EmployeeId}"; - string queryString = $"UPDATE [dbo].[Employees] SET [SSN] = '{Employee.Ssn}', [FirstName] = '{Employee.FirstName}', [LastName] = '{Employee.LastName}', [Salary] = '{Employee.Salary}' WHERE [EmployeeID] = '{Employee.EmployeeId}'"; + string queryString = $"UPDATE [dbo].[Employees] SET [SSN] = '{Employee.Ssn}', [FirstName] = '{Employee.FirstName}', [LastName] = '{Employee.LastName}', [Salary] = '{Employee.Salary}' WHERE [EmployeeID] = '{Employee.EmployeeId}'"; await _context.Database.ExecuteSqlInterpolatedAsync(query); await _context.Database.ExecuteSqlInterpolatedAsync($"INSERT INTO [dbo].[AuditEvents] ([UserName], [Query]) VALUES ({userName}, {queryString})"); } diff --git a/samples/features/security/ledger/source/ContosoHR/Pages/LedgerVerifications/Index.cshtml b/samples/features/security/ledger/source/ContosoHR/Pages/LedgerVerifications/Index.cshtml index 18983bc8..9728b144 100644 --- a/samples/features/security/ledger/source/ContosoHR/Pages/LedgerVerifications/Index.cshtml +++ b/samples/features/security/ledger/source/ContosoHR/Pages/LedgerVerifications/Index.cshtml @@ -14,7 +14,7 @@
    -
    + @Html.DisplayNameFor(model => model.LedgerVerifications[0].TimeStamp) diff --git a/samples/features/security/ledger/source/ContosoHR/Startup.cs b/samples/features/security/ledger/source/ContosoHR/Startup.cs index ed9af20d..e20b5ca4 100644 --- a/samples/features/security/ledger/source/ContosoHR/Startup.cs +++ b/samples/features/security/ledger/source/ContosoHR/Startup.cs @@ -33,7 +33,7 @@ namespace ContosoHR // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - services.AddDbContext(options => + services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("ContosoHRDatabase"))); services.AddDefaultIdentity( options => options.SignIn.RequireConfirmedAccount = true) @@ -68,7 +68,7 @@ namespace ContosoHR app.UseRouting(); - app.UseAuthentication(); + app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => diff --git a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap.js b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap.js index 51075ce1..1f970d1e 100644 --- a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap.js +++ b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap.js @@ -155,7 +155,7 @@ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, bu }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap4.js b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap4.js index 1db11399..69e87554 100644 --- a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap4.js +++ b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.bootstrap4.js @@ -157,7 +157,7 @@ DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, bu }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.material.js b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.material.js index ba734228..4c38ae34 100644 --- a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.material.js +++ b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.material.js @@ -166,7 +166,7 @@ DataTable.ext.renderer.pageButton.material = function ( settings, host, idx, but }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.semanticui.js b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.semanticui.js index 716af85b..856c1f00 100644 --- a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.semanticui.js +++ b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.semanticui.js @@ -166,7 +166,7 @@ DataTable.ext.renderer.pageButton.semanticUI = function ( settings, host, idx, b }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.uikit.js b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.uikit.js index 3fa2388f..22b2fb29 100644 --- a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.uikit.js +++ b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/dataTables.uikit.js @@ -149,7 +149,7 @@ DataTable.ext.renderer.pageButton.uikit = function ( settings, host, idx, button }; // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. + // inside an iframe or frame. var activeEl; try { diff --git a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/jquery.dataTables.js b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/jquery.dataTables.js index aeb7fb9b..9e15d5b1 100644 --- a/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/jquery.dataTables.js +++ b/samples/features/security/ledger/source/ContosoHR/wwwroot/lib/datatables/js/jquery.dataTables.js @@ -1587,7 +1587,7 @@ /** * DataTables utility methods - * + * * This namespace provides helper methods that DataTables uses internally to * create a DataTable, but which are not exclusively used only for DataTables. * These methods can be used by extension authors to save the duplication of @@ -2244,7 +2244,7 @@ var i, ien, j, jen, k, ken; var col, cell, detectedType, cache; - // For each column, spin over the + // For each column, spin over the for ( i=0, ien=columns.length ; iEmpty string - */ - "sSearch": "", - - /** - * Flag to indicate if the search term should be interpreted as a - * regular expression (true) or not (false) and therefore and special - * regex characters escaped. - * @type boolean - * @default false - */ - "bRegex": false, - - /** - * Flag to indicate if DataTables is to use its smart filtering or not. - * @type boolean - * @default true - */ - "bSmart": true - }; - - - - - /** - * Template object for the way in which DataTables holds information about - * each individual row. This is the object format used for the settings - * aoData array. - * @namespace - */ - DataTable.models.oRow = { - /** - * TR element for the row - * @type node - * @default null - */ - "nTr": null, - - /** - * Array of TD elements for each row. This is null until the row has been - * created. - * @type array nodes - * @default [] - */ - "anCells": null, - - /** - * Data object from the original data source for the row. This is either - * an array if using the traditional form of DataTables, or an object if - * using mData options. The exact type will depend on the passed in - * data from the data source, or will be an array if using DOM a data - * source. - * @type array|object - * @default [] - */ - "_aData": [], - - /** - * Sorting data cache - this array is ostensibly the same length as the - * number of columns (although each index is generated only as it is - * needed), and holds the data that is used for sorting each column in the - * row. We do this cache generation at the start of the sort in order that - * the formatting of the sort data need be done only once for each cell - * per sort. This array should not be read from or written to by anything - * other than the master sorting methods. - * @type array - * @default null - * @private - */ - "_aSortData": null, - - /** - * Per cell filtering data cache. As per the sort data cache, used to - * increase the performance of the filtering in DataTables - * @type array - * @default null - * @private - */ - "_aFilterData": null, - - /** - * Filtering data cache. This is the same as the cell filtering cache, but - * in this case a string rather than an array. This is easily computed with - * a join on `_aFilterData`, but is provided as a cache so the join isn't - * needed on every search (memory traded for performance) - * @type array - * @default null - * @private - */ - "_sFilterRow": null, - - /** - * Cache of the class name that DataTables has applied to the row, so we - * can quickly look at this variable rather than needing to do a DOM check - * on className for the nTr property. - * @type string - * @default Empty string - * @private - */ - "_sRowStripe": "", - - /** - * Denote if the original data source was from the DOM, or the data source - * object. This is used for invalidating data, so DataTables can - * automatically read data from the original source, unless uninstructed - * otherwise. - * @type string - * @default null - * @private - */ - "src": null, - - /** - * Index in the aoData array. This saves an indexOf lookup when we have the - * object, but want to know the index - * @type integer - * @default -1 - * @private - */ - "idx": -1 - }; - - - /** - * Template object for the column information object in DataTables. This object - * is held in the settings aoColumns array and contains all the information that - * DataTables needs about each individual column. - * - * Note that this object is related to {@link DataTable.defaults.column} - * but this one is the internal data store for DataTables's cache of columns. - * It should NOT be manipulated outside of DataTables. Any configuration should - * be done through the initialisation options. - * @namespace - */ - DataTable.models.oColumn = { - /** - * Column index. This could be worked out on-the-fly with $.inArray, but it - * is faster to just hold it as a variable - * @type integer - * @default null - */ - "idx": null, - - /** - * A list of the columns that sorting should occur on when this column - * is sorted. That this property is an array allows multi-column sorting - * to be defined for a column (for example first name / last name columns - * would benefit from this). The values are integers pointing to the - * columns to be sorted on (typically it will be a single integer pointing - * at itself, but that doesn't need to be the case). - * @type array - */ - "aDataSort": null, - - /** - * Define the sorting directions that are applied to the column, in sequence - * as the column is repeatedly sorted upon - i.e. the first value is used - * as the sorting direction when the column if first sorted (clicked on). - * Sort it again (click again) and it will move on to the next index. - * Repeat until loop. - * @type array - */ - "asSorting": null, - - /** - * Flag to indicate if the column is searchable, and thus should be included - * in the filtering or not. - * @type boolean - */ - "bSearchable": null, - - /** - * Flag to indicate if the column is sortable or not. - * @type boolean - */ - "bSortable": null, - - /** - * Flag to indicate if the column is currently visible in the table or not - * @type boolean - */ - "bVisible": null, - - /** - * Store for manual type assignment using the `column.type` option. This - * is held in store so we can manipulate the column's `sType` property. - * @type string - * @default null - * @private - */ - "_sManualType": null, - - /** - * Flag to indicate if HTML5 data attributes should be used as the data - * source for filtering or sorting. True is either are. - * @type boolean - * @default false - * @private - */ - "_bAttrSrc": false, - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} nTd The TD node that has been created - * @param {*} sData The Data for the cell - * @param {array|object} oData The data for the whole row - * @param {int} iRow The row index for the aoData data store - * @default null - */ - "fnCreatedCell": null, - - /** - * Function to get data from a cell in a column. You should never - * access data directly through _aData internally in DataTables - always use - * the method attached to this property. It allows mData to function as - * required. This function is automatically assigned by the column - * initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {string} sSpecific The specific data type you want to get - - * 'display', 'type' 'filter' 'sort' - * @returns {*} The data for the cell from the given row's data - * @default null - */ - "fnGetData": null, - - /** - * Function to set data for a cell in the column. You should never - * set the data directly to _aData internally in DataTables - always use - * this method. It allows mData to function as required. This function - * is automatically assigned by the column initialisation method - * @type function - * @param {array|object} oData The data array/object for the array - * (i.e. aoData[]._aData) - * @param {*} sValue Value to set - * @default null - */ - "fnSetData": null, - - /** - * Property to read the value for the cells in the column from the data - * source array / object. If null, then the default content is used, if a - * function is given then the return from the function is used. - * @type function|int|string|null - * @default null - */ - "mData": null, - - /** - * Partner property to mData which is used (only when defined) to get - * the data - i.e. it is basically the same as mData, but without the - * 'set' option, and also the data fed to it is the result from mData. - * This is the rendering method to match the data method of mData. - * @type function|int|string|null - * @default null - */ - "mRender": null, - - /** - * Unique header TH/TD element for this column - this is what the sorting - * listener is attached to (if sorting is enabled.) - * @type node - * @default null - */ - "nTh": null, - - /** - * Unique footer TH/TD element for this column (if there is one). Not used - * in DataTables as such, but can be used for plug-ins to reference the - * footer for each column. - * @type node - * @default null - */ - "nTf": null, - - /** - * The class to apply to all TD elements in the table's TBODY for the column - * @type string - * @default null - */ - "sClass": null, - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * @type string - */ - "sContentPadding": null, - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because mData - * is set to null, or because the data source itself is null). - * @type string - * @default null - */ - "sDefaultContent": null, - - /** - * Name for the column, allowing reference to the column by name as well as - * by index (needs a lookup to work by name). - * @type string - */ - "sName": null, - - /** - * Custom sorting data type - defines which of the available plug-ins in - * afnSortData the custom sorting will use - if any is defined. - * @type string - * @default std - */ - "sSortDataType": 'std', - - /** - * Class to be applied to the header element when sorting on this column - * @type string - * @default null - */ - "sSortingClass": null, - - /** - * Class to be applied to the header element when sorting on this column - - * when jQuery UI theming is used. - * @type string - * @default null - */ - "sSortingClassJUI": null, - - /** - * Title of the column - what is seen in the TH element (nTh). - * @type string - */ - "sTitle": null, - - /** - * Column sorting and filtering type - * @type string - * @default null - */ - "sType": null, - - /** - * Width of the column - * @type string - * @default null - */ - "sWidth": null, - - /** - * Width of the column when it was first "encountered" - * @type string - * @default null - */ - "sWidthOrig": null - }; - - - /* - * Developer note: The properties of the object below are given in Hungarian - * notation, that was used as the interface for DataTables prior to v1.10, however - * from v1.10 onwards the primary interface is camel case. In order to avoid - * breaking backwards compatibility utterly with this change, the Hungarian - * version is still, internally the primary interface, but is is not documented - * - hence the @name tags in each doc comment. This allows a Javascript function - * to create a map from Hungarian notation to camel case (going the other direction - * would require each property to be listed, which would at around 3K to the size - * of DataTables, while this method is about a 0.5K hit. - * - * Ultimately this does pave the way for Hungarian notation to be dropped - * completely, but that is a massive amount of work and will break current - * installs (therefore is on-hold until v2). - */ - - /** - * Initialisation options that can be given to DataTables at initialisation - * time. - * @namespace - */ - DataTable.defaults = { - /** - * An array of data to use for the table, passed in at initialisation which - * will be used in preference to any data which is already in the DOM. This is - * particularly useful for constructing tables purely in Javascript, for - * example with a custom Ajax call. - * @type array - * @default null - * - * @dtopt Option - * @name DataTable.defaults.data - * - * @example - * // Using a 2D array data source - * $(document).ready( function () { - * $('#example').dataTable( { - * "data": [ - * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], - * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], - * ], - * "columns": [ - * { "title": "Engine" }, - * { "title": "Browser" }, - * { "title": "Platform" }, - * { "title": "Version" }, - * { "title": "Grade" } - * ] - * } ); - * } ); - * - * @example - * // Using an array of objects as a data source (`data`) - * $(document).ready( function () { - * $('#example').dataTable( { - * "data": [ - * { - * "engine": "Trident", - * "browser": "Internet Explorer 4.0", - * "platform": "Win 95+", - * "version": 4, - * "grade": "X" - * }, - * { - * "engine": "Trident", - * "browser": "Internet Explorer 5.0", - * "platform": "Win 95+", - * "version": 5, - * "grade": "C" - * } - * ], - * "columns": [ - * { "title": "Engine", "data": "engine" }, - * { "title": "Browser", "data": "browser" }, - * { "title": "Platform", "data": "platform" }, - * { "title": "Version", "data": "version" }, - * { "title": "Grade", "data": "grade" } - * ] - * } ); - * } ); - */ - "aaData": null, - - - /** - * If ordering is enabled, then DataTables will perform a first pass sort on - * initialisation. You can define which column(s) the sort is performed - * upon, and the sorting direction, with this variable. The `sorting` array - * should contain an array for each column to be sorted initially containing - * the column's index and a direction string ('asc' or 'desc'). - * @type array - * @default [[0,'asc']] - * - * @dtopt Option - * @name DataTable.defaults.order - * - * @example - * // Sort by 3rd column first, and then 4th column - * $(document).ready( function() { - * $('#example').dataTable( { - * "order": [[2,'asc'], [3,'desc']] - * } ); - * } ); - * - * // No initial sorting - * $(document).ready( function() { - * $('#example').dataTable( { - * "order": [] - * } ); - * } ); - */ - "aaSorting": [[0,'asc']], - - - /** - * This parameter is basically identical to the `sorting` parameter, but - * cannot be overridden by user interaction with the table. What this means - * is that you could have a column (visible or hidden) which the sorting - * will always be forced on first - any sorting after that (from the user) - * will then be performed as required. This can be useful for grouping rows - * together. - * @type array - * @default null - * - * @dtopt Option - * @name DataTable.defaults.orderFixed - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "orderFixed": [[0,'asc']] - * } ); - * } ) - */ - "aaSortingFixed": [], - - - /** - * DataTables can be instructed to load data to display in the table from a - * Ajax source. This option defines how that Ajax call is made and where to. - * - * The `ajax` property has three different modes of operation, depending on - * how it is defined. These are: - * - * * `string` - Set the URL from where the data should be loaded from. - * * `object` - Define properties for `jQuery.ajax`. - * * `function` - Custom data get function - * - * `string` - * -------- - * - * As a string, the `ajax` property simply defines the URL from which - * DataTables will load data. - * - * `object` - * -------- - * - * As an object, the parameters in the object are passed to - * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control - * of the Ajax request. DataTables has a number of default parameters which - * you can override using this option. Please refer to the jQuery - * documentation for a full description of the options available, although - * the following parameters provide additional options in DataTables or - * require special consideration: - * - * * `data` - As with jQuery, `data` can be provided as an object, but it - * can also be used as a function to manipulate the data DataTables sends - * to the server. The function takes a single parameter, an object of - * parameters with the values that DataTables has readied for sending. An - * object may be returned which will be merged into the DataTables - * defaults, or you can add the items to the object that was passed in and - * not return anything from the function. This supersedes `fnServerParams` - * from DataTables 1.9-. - * - * * `dataSrc` - By default DataTables will look for the property `data` (or - * `aaData` for compatibility with DataTables 1.9-) when obtaining data - * from an Ajax source or for server-side processing - this parameter - * allows that property to be changed. You can use Javascript dotted - * object notation to get a data source for multiple levels of nesting, or - * it my be used as a function. As a function it takes a single parameter, - * the JSON returned from the server, which can be manipulated as - * required, with the returned value being that used by DataTables as the - * data source for the table. This supersedes `sAjaxDataProp` from - * DataTables 1.9-. - * - * * `success` - Should not be overridden it is used internally in - * DataTables. To manipulate / transform the data returned by the server - * use `ajax.dataSrc`, or use `ajax` as a function (see below). - * - * `function` - * ---------- - * - * As a function, making the Ajax call is left up to yourself allowing - * complete control of the Ajax request. Indeed, if desired, a method other - * than Ajax could be used to obtain the required data, such as Web storage - * or an AIR database. - * - * The function is given four parameters and no return is required. The - * parameters are: - * - * 1. _object_ - Data to send to the server - * 2. _function_ - Callback function that must be executed when the required - * data has been obtained. That data should be passed into the callback - * as the only parameter - * 3. _object_ - DataTables settings object for the table - * - * Note that this supersedes `fnServerData` from DataTables 1.9-. - * - * @type string|object|function - * @default null - * - * @dtopt Option - * @name DataTable.defaults.ajax - * @since 1.10.0 - * - * @example - * // Get JSON data from a file via Ajax. - * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default). - * $('#example').dataTable( { - * "ajax": "data.json" - * } ); - * - * @example - * // Get JSON data from a file via Ajax, using `dataSrc` to change - * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`) - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": "tableData" - * } - * } ); - * - * @example - * // Get JSON data from a file via Ajax, using `dataSrc` to read data - * // from a plain array rather than an array in an object - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": "" - * } - * } ); - * - * @example - * // Manipulate the data returned from the server - add a link to data - * // (note this can, should, be done using `render` for the column - this - * // is just a simple example of how the data can be manipulated). - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "dataSrc": function ( json ) { - * for ( var i=0, ien=json.length ; iView message'; - * } - * return json; - * } - * } - * } ); - * - * @example - * // Add data to the request - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "data": function ( d ) { - * return { - * "extra_search": $('#extra').val() - * }; - * } - * } - * } ); - * - * @example - * // Send request as POST - * $('#example').dataTable( { - * "ajax": { - * "url": "data.json", - * "type": "POST" - * } - * } ); - * - * @example - * // Get the data from localStorage (could interface with a form for - * // adding, editing and removing rows). - * $('#example').dataTable( { - * "ajax": function (data, callback, settings) { - * callback( - * JSON.parse( localStorage.getItem('dataTablesData') ) - * ); - * } - * } ); - */ - "ajax": null, - - - /** - * This parameter allows you to readily specify the entries in the length drop - * down menu that DataTables shows when pagination is enabled. It can be - * either a 1D array of options which will be used for both the displayed - * option and the value, or a 2D array which will use the array in the first - * position as the value, and the array in the second position as the - * displayed options (useful for language strings such as 'All'). - * - * Note that the `pageLength` property will be automatically set to the - * first value given in this array, unless `pageLength` is also provided. - * @type array - * @default [ 10, 25, 50, 100 ] - * - * @dtopt Option - * @name DataTable.defaults.lengthMenu - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] - * } ); - * } ); - */ - "aLengthMenu": [ 10, 25, 50, 100 ], - - - /** - * The `columns` option in the initialisation parameter allows you to define - * details about the way individual columns behave. For a full list of - * column options that can be set, please see - * {@link DataTable.defaults.column}. Note that if you use `columns` to - * define your columns, you must have an entry in the array for every single - * column that you have in your table (these can be null if you don't which - * to specify any options). - * @member - * - * @name DataTable.defaults.column - */ - "aoColumns": null, - - /** - * Very similar to `columns`, `columnDefs` allows you to target a specific - * column, multiple columns, or all columns, using the `targets` property of - * each object in the array. This allows great flexibility when creating - * tables, as the `columnDefs` arrays can be of any length, targeting the - * columns you specifically want. `columnDefs` may use any of the column - * options available: {@link DataTable.defaults.column}, but it _must_ - * have `targets` defined in each object in the array. Values in the `targets` - * array may be: - *
      - *
    • a string - class name will be matched on the TH for the column
    • - *
    • 0 or a positive integer - column index counting from the left
    • - *
    • a negative integer - column index counting from the right
    • - *
    • the string "_all" - all columns (i.e. assign a default)
    • - *
    - * @member - * - * @name DataTable.defaults.columnDefs - */ - "aoColumnDefs": null, - - - /** - * Basically the same as `search`, this parameter defines the individual column - * filtering state at initialisation time. The array must be of the same size - * as the number of columns, and each element be an object with the parameters - * `search` and `escapeRegex` (the latter is optional). 'null' is also - * accepted and the default will be used. - * @type array - * @default [] - * - * @dtopt Option - * @name DataTable.defaults.searchCols - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "searchCols": [ - * null, - * { "search": "My filter" }, - * null, - * { "search": "^[0-9]", "escapeRegex": false } - * ] - * } ); - * } ) - */ - "aoSearchCols": [], - - - /** - * An array of CSS classes that should be applied to displayed rows. This - * array may be of any length, and DataTables will apply each class - * sequentially, looping when required. - * @type array - * @default null Will take the values determined by the `oClasses.stripe*` - * options - * - * @dtopt Option - * @name DataTable.defaults.stripeClasses - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ] - * } ); - * } ) - */ - "asStripeClasses": null, - - - /** - * Enable or disable automatic column width calculation. This can be disabled - * as an optimisation (it takes some time to calculate the widths) if the - * tables widths are passed in using `columns`. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.autoWidth - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "autoWidth": false - * } ); - * } ); - */ - "bAutoWidth": true, - - - /** - * Deferred rendering can provide DataTables with a huge speed boost when you - * are using an Ajax or JS data source for the table. This option, when set to - * true, will cause DataTables to defer the creation of the table elements for - * each row until they are needed for a draw - saving a significant amount of - * time. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.deferRender - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajax": "sources/arrays.txt", - * "deferRender": true - * } ); - * } ); - */ - "bDeferRender": false, - - - /** - * Replace a DataTable which matches the given selector and replace it with - * one which has the properties of the new initialisation object passed. If no - * table matches the selector, then the new DataTable will be constructed as - * per normal. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.destroy - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "srollY": "200px", - * "paginate": false - * } ); - * - * // Some time later.... - * $('#example').dataTable( { - * "filter": false, - * "destroy": true - * } ); - * } ); - */ - "bDestroy": false, - - - /** - * Enable or disable filtering of data. Filtering in DataTables is "smart" in - * that it allows the end user to input multiple words (space separated) and - * will match a row containing those words, even if not in the order that was - * specified (this allow matching across multiple columns). Note that if you - * wish to use filtering in DataTables this must remain 'true' - to remove the - * default filtering input box and retain filtering abilities, please use - * {@link DataTable.defaults.dom}. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.searching - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "searching": false - * } ); - * } ); - */ - "bFilter": true, - - - /** - * Enable or disable the table information display. This shows information - * about the data that is currently visible on the page, including information - * about filtered data if that action is being performed. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.info - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "info": false - * } ); - * } ); - */ - "bInfo": true, - - - /** - * Allows the end user to select the size of a formatted page from a select - * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`). - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.lengthChange - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "lengthChange": false - * } ); - * } ); - */ - "bLengthChange": true, - - - /** - * Enable or disable pagination. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.paging - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "paging": false - * } ); - * } ); - */ - "bPaginate": true, - - - /** - * Enable or disable the display of a 'processing' indicator when the table is - * being processed (e.g. a sort). This is particularly useful for tables with - * large amounts of data where it can take a noticeable amount of time to sort - * the entries. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.processing - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "processing": true - * } ); - * } ); - */ - "bProcessing": false, - - - /** - * Retrieve the DataTables object for the given selector. Note that if the - * table has already been initialised, this parameter will cause DataTables - * to simply return the object that has already been set up - it will not take - * account of any changes you might have made to the initialisation object - * passed to DataTables (setting this parameter to true is an acknowledgement - * that you understand this). `destroy` can be used to reinitialise a table if - * you need. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.retrieve - * - * @example - * $(document).ready( function() { - * initTable(); - * tableActions(); - * } ); - * - * function initTable () - * { - * return $('#example').dataTable( { - * "scrollY": "200px", - * "paginate": false, - * "retrieve": true - * } ); - * } - * - * function tableActions () - * { - * var table = initTable(); - * // perform API operations with oTable - * } - */ - "bRetrieve": false, - - - /** - * When vertical (y) scrolling is enabled, DataTables will force the height of - * the table's viewport to the given height at all times (useful for layout). - * However, this can look odd when filtering data down to a small data set, - * and the footer is left "floating" further down. This parameter (when - * enabled) will cause DataTables to collapse the table's viewport down when - * the result set will fit within the given Y height. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.scrollCollapse - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollY": "200", - * "scrollCollapse": true - * } ); - * } ); - */ - "bScrollCollapse": false, - - - /** - * Configure DataTables to use server-side processing. Note that the - * `ajax` parameter must also be given in order to give DataTables a - * source to obtain the required data for each draw. - * @type boolean - * @default false - * - * @dtopt Features - * @dtopt Server-side - * @name DataTable.defaults.serverSide - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "xhr.php" - * } ); - * } ); - */ - "bServerSide": false, - - - /** - * Enable or disable sorting of columns. Sorting of individual columns can be - * disabled by the `sortable` option for each column. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.ordering - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "ordering": false - * } ); - * } ); - */ - "bSort": true, - - - /** - * Enable or display DataTables' ability to sort multiple columns at the - * same time (activated by shift-click by the user). - * @type boolean - * @default true - * - * @dtopt Options - * @name DataTable.defaults.orderMulti - * - * @example - * // Disable multiple column sorting ability - * $(document).ready( function () { - * $('#example').dataTable( { - * "orderMulti": false - * } ); - * } ); - */ - "bSortMulti": true, - - - /** - * Allows control over whether DataTables should use the top (true) unique - * cell that is found for a single column, or the bottom (false - default). - * This is useful when using complex headers. - * @type boolean - * @default false - * - * @dtopt Options - * @name DataTable.defaults.orderCellsTop - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "orderCellsTop": true - * } ); - * } ); - */ - "bSortCellsTop": false, - - - /** - * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and - * `sorting\_3` to the columns which are currently being sorted on. This is - * presented as a feature switch as it can increase processing time (while - * classes are removed and added) so for large data sets you might want to - * turn this off. - * @type boolean - * @default true - * - * @dtopt Features - * @name DataTable.defaults.orderClasses - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "orderClasses": false - * } ); - * } ); - */ - "bSortClasses": true, - - - /** - * Enable or disable state saving. When enabled HTML5 `localStorage` will be - * used to save table display information such as pagination information, - * display length, filtering and sorting. As such when the end user reloads - * the page the display display will match what thy had previously set up. - * - * Due to the use of `localStorage` the default state saving is not supported - * in IE6 or 7. If state saving is required in those browsers, use - * `stateSaveCallback` to provide a storage solution such as cookies. - * @type boolean - * @default false - * - * @dtopt Features - * @name DataTable.defaults.stateSave - * - * @example - * $(document).ready( function () { - * $('#example').dataTable( { - * "stateSave": true - * } ); - * } ); - */ - "bStateSave": false, - - - /** - * This function is called when a TR element is created (and all TD child - * elements have been inserted), or registered if using a DOM source, allowing - * manipulation of the TR element (adding classes etc). - * @type function - * @param {node} row "TR" element for the current row - * @param {array} data Raw data array for this row - * @param {int} dataIndex The index of this row in the internal aoData array - * - * @dtopt Callbacks - * @name DataTable.defaults.createdRow - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "createdRow": function( row, data, dataIndex ) { - * // Bold the grade for all 'A' grade browsers - * if ( data[4] == "A" ) - * { - * $('td:eq(4)', row).html( 'A' ); - * } - * } - * } ); - * } ); - */ - "fnCreatedRow": null, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify any aspect you want about the created DOM. - * @type function - * @param {object} settings DataTables settings object - * - * @dtopt Callbacks - * @name DataTable.defaults.drawCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "drawCallback": function( settings ) { - * alert( 'DataTables has redrawn the table' ); - * } - * } ); - * } ); - */ - "fnDrawCallback": null, - - - /** - * Identical to fnHeaderCallback() but for the table footer this function - * allows you to modify the table footer on every 'draw' event. - * @type function - * @param {node} foot "TR" element for the footer - * @param {array} data Full table data (as derived from the original HTML) - * @param {int} start Index for the current display starting point in the - * display array - * @param {int} end Index for the current display ending point in the - * display array - * @param {array int} display Index array to translate the visual position - * to the full data array - * - * @dtopt Callbacks - * @name DataTable.defaults.footerCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "footerCallback": function( tfoot, data, start, end, display ) { - * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start; - * } - * } ); - * } ) - */ - "fnFooterCallback": null, - - - /** - * When rendering large numbers in the information element for the table - * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers - * to have a comma separator for the 'thousands' units (e.g. 1 million is - * rendered as "1,000,000") to help readability for the end user. This - * function will override the default method DataTables uses. - * @type function - * @member - * @param {int} toFormat number to be formatted - * @returns {string} formatted string for DataTables to show the number - * - * @dtopt Callbacks - * @name DataTable.defaults.formatNumber - * - * @example - * // Format a number using a single quote for the separator (note that - * // this can also be done with the language.thousands option) - * $(document).ready( function() { - * $('#example').dataTable( { - * "formatNumber": function ( toFormat ) { - * return toFormat.toString().replace( - * /\B(?=(\d{3})+(?!\d))/g, "'" - * ); - * }; - * } ); - * } ); - */ - "fnFormatNumber": function ( toFormat ) { - return toFormat.toString().replace( - /\B(?=(\d{3})+(?!\d))/g, - this.oLanguage.sThousands - ); - }, - - - /** - * This function is called on every 'draw' event, and allows you to - * dynamically modify the header row. This can be used to calculate and - * display useful information about the table. - * @type function - * @param {node} head "TR" element for the header - * @param {array} data Full table data (as derived from the original HTML) - * @param {int} start Index for the current display starting point in the - * display array - * @param {int} end Index for the current display ending point in the - * display array - * @param {array int} display Index array to translate the visual position - * to the full data array - * - * @dtopt Callbacks - * @name DataTable.defaults.headerCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "fheaderCallback": function( head, data, start, end, display ) { - * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records"; - * } - * } ); - * } ) - */ - "fnHeaderCallback": null, - - - /** - * The information element can be used to convey information about the current - * state of the table. Although the internationalisation options presented by - * DataTables are quite capable of dealing with most customisations, there may - * be times where you wish to customise the string further. This callback - * allows you to do exactly that. - * @type function - * @param {object} oSettings DataTables settings object - * @param {int} start Starting position in data for the draw - * @param {int} end End position in data for the draw - * @param {int} max Total number of rows in the table (regardless of - * filtering) - * @param {int} total Total number of rows in the data set, after filtering - * @param {string} pre The string that DataTables has formatted using it's - * own rules - * @returns {string} The string to be displayed in the information element. - * - * @dtopt Callbacks - * @name DataTable.defaults.infoCallback - * - * @example - * $('#example').dataTable( { - * "infoCallback": function( settings, start, end, max, total, pre ) { - * return start +" to "+ end; - * } - * } ); - */ - "fnInfoCallback": null, - - - /** - * Called when the table has been initialised. Normally DataTables will - * initialise sequentially and there will be no need for this function, - * however, this does not hold true when using external language information - * since that is obtained using an async XHR call. - * @type function - * @param {object} settings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - * - * @dtopt Callbacks - * @name DataTable.defaults.initComplete - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "initComplete": function(settings, json) { - * alert( 'DataTables has finished its initialisation.' ); - * } - * } ); - * } ) - */ - "fnInitComplete": null, - - - /** - * Called at the very start of each table draw and can be used to cancel the - * draw by returning false, any other return (including undefined) results in - * the full draw occurring). - * @type function - * @param {object} settings DataTables settings object - * @returns {boolean} False will cancel the draw, anything else (including no - * return) will allow it to complete. - * - * @dtopt Callbacks - * @name DataTable.defaults.preDrawCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "preDrawCallback": function( settings ) { - * if ( $('#test').val() == 1 ) { - * return false; - * } - * } - * } ); - * } ); - */ - "fnPreDrawCallback": null, - - - /** - * This function allows you to 'post process' each row after it have been - * generated for each table draw, but before it is rendered on screen. This - * function might be used for setting the row class name etc. - * @type function - * @param {node} row "TR" element for the current row - * @param {array} data Raw data array for this row - * @param {int} displayIndex The display index for the current table draw - * @param {int} displayIndexFull The index of the data in the full list of - * rows (after filtering) - * - * @dtopt Callbacks - * @name DataTable.defaults.rowCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "rowCallback": function( row, data, displayIndex, displayIndexFull ) { - * // Bold the grade for all 'A' grade browsers - * if ( data[4] == "A" ) { - * $('td:eq(4)', row).html( 'A' ); - * } - * } - * } ); - * } ); - */ - "fnRowCallback": null, - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * This parameter allows you to override the default function which obtains - * the data from the server so something more suitable for your application. - * For example you could use POST data, or pull information from a Gears or - * AIR database. - * @type function - * @member - * @param {string} source HTTP source to obtain the data from (`ajax`) - * @param {array} data A key/value pair object containing the data to send - * to the server - * @param {function} callback to be called on completion of the data get - * process that will draw the data on the page. - * @param {object} settings DataTables settings object - * - * @dtopt Callbacks - * @dtopt Server-side - * @name DataTable.defaults.serverData - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "fnServerData": null, - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * It is often useful to send extra data to the server when making an Ajax - * request - for example custom filtering information, and this callback - * function makes it trivial to send extra information to the server. The - * passed in parameter is the data set that has been constructed by - * DataTables, and you can add to this or modify it as you require. - * @type function - * @param {array} data Data array (array of objects which are name/value - * pairs) that has been constructed by DataTables and will be sent to the - * server. In the case of Ajax sourced data with server-side processing - * this will be an empty array, for server-side processing there will be a - * significant number of parameters! - * @returns {undefined} Ensure that you modify the data array passed in, - * as this is passed by reference. - * - * @dtopt Callbacks - * @dtopt Server-side - * @name DataTable.defaults.serverParams - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "fnServerParams": null, - - - /** - * Load the table state. With this function you can define from where, and how, the - * state of a table is loaded. By default DataTables will load from `localStorage` - * but you might wish to use a server-side database or cookies. - * @type function - * @member - * @param {object} settings DataTables settings object - * @param {object} callback Callback that can be executed when done. It - * should be passed the loaded state object. - * @return {object} The DataTables state object to be loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoadCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadCallback": function (settings, callback) { - * $.ajax( { - * "url": "/state_load", - * "dataType": "json", - * "success": function (json) { - * callback( json ); - * } - * } ); - * } - * } ); - * } ); - */ - "fnStateLoadCallback": function ( settings ) { - try { - return JSON.parse( - (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem( - 'DataTables_'+settings.sInstance+'_'+location.pathname - ) - ); - } catch (e) { - return {}; - } - }, - - - /** - * Callback which allows modification of the saved state prior to loading that state. - * This callback is called when the table is loading state from the stored data, but - * prior to the settings object being modified by the saved state. Note that for - * plug-in authors, you should use the `stateLoadParams` event to load parameters for - * a plug-in. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object that is to be loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoadParams - * - * @example - * // Remove a saved filter, so filtering is never loaded - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadParams": function (settings, data) { - * data.oSearch.sSearch = ""; - * } - * } ); - * } ); - * - * @example - * // Disallow state loading by returning false - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoadParams": function (settings, data) { - * return false; - * } - * } ); - * } ); - */ - "fnStateLoadParams": null, - - - /** - * Callback that is called when the state has been loaded from the state saving method - * and the DataTables settings object has been modified as a result of the loaded state. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object that was loaded - * - * @dtopt Callbacks - * @name DataTable.defaults.stateLoaded - * - * @example - * // Show an alert with the filtering value that was saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateLoaded": function (settings, data) { - * alert( 'Saved filter was: '+data.oSearch.sSearch ); - * } - * } ); - * } ); - */ - "fnStateLoaded": null, - - - /** - * Save the table state. This function allows you to define where and how the state - * information for the table is stored By default DataTables will use `localStorage` - * but you might wish to use a server-side database or cookies. - * @type function - * @member - * @param {object} settings DataTables settings object - * @param {object} data The state object to be saved - * - * @dtopt Callbacks - * @name DataTable.defaults.stateSaveCallback - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateSaveCallback": function (settings, data) { - * // Send an Ajax request to the server with the state object - * $.ajax( { - * "url": "/state_save", - * "data": data, - * "dataType": "json", - * "method": "POST" - * "success": function () {} - * } ); - * } - * } ); - * } ); - */ - "fnStateSaveCallback": function ( settings, data ) { - try { - (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem( - 'DataTables_'+settings.sInstance+'_'+location.pathname, - JSON.stringify( data ) - ); - } catch (e) {} - }, - - - /** - * Callback which allows modification of the state to be saved. Called when the table - * has changed state a new state save is required. This method allows modification of - * the state saving object prior to actually doing the save, including addition or - * other state properties or modification. Note that for plug-in authors, you should - * use the `stateSaveParams` event to save parameters for a plug-in. - * @type function - * @param {object} settings DataTables settings object - * @param {object} data The state object to be saved - * - * @dtopt Callbacks - * @name DataTable.defaults.stateSaveParams - * - * @example - * // Remove a saved filter, so filtering is never saved - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateSave": true, - * "stateSaveParams": function (settings, data) { - * data.oSearch.sSearch = ""; - * } - * } ); - * } ); - */ - "fnStateSaveParams": null, - - - /** - * Duration for which the saved state information is considered valid. After this period - * has elapsed the state will be returned to the default. - * Value is given in seconds. - * @type int - * @default 7200 (2 hours) - * - * @dtopt Options - * @name DataTable.defaults.stateDuration - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "stateDuration": 60*60*24; // 1 day - * } ); - * } ) - */ - "iStateDuration": 7200, - - - /** - * When enabled DataTables will not make a request to the server for the first - * page draw - rather it will use the data already on the page (no sorting etc - * will be applied to it), thus saving on an XHR at load time. `deferLoading` - * is used to indicate that deferred loading is required, but it is also used - * to tell DataTables how many records there are in the full table (allowing - * the information element and pagination to be displayed correctly). In the case - * where a filtering is applied to the table on initial load, this can be - * indicated by giving the parameter as an array, where the first element is - * the number of records available after filtering and the second element is the - * number of records without filtering (allowing the table information element - * to be shown correctly). - * @type int | array - * @default null - * - * @dtopt Options - * @name DataTable.defaults.deferLoading - * - * @example - * // 57 records available in the table, no filtering applied - * $(document).ready( function() { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "scripts/server_processing.php", - * "deferLoading": 57 - * } ); - * } ); - * - * @example - * // 57 records after filtering, 100 without filtering (an initial filter applied) - * $(document).ready( function() { - * $('#example').dataTable( { - * "serverSide": true, - * "ajax": "scripts/server_processing.php", - * "deferLoading": [ 57, 100 ], - * "search": { - * "search": "my_filter" - * } - * } ); - * } ); - */ - "iDeferLoading": null, - - - /** - * Number of rows to display on a single page when using pagination. If - * feature enabled (`lengthChange`) then the end user will be able to override - * this to a custom setting using a pop-up menu. - * @type int - * @default 10 - * - * @dtopt Options - * @name DataTable.defaults.pageLength - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "pageLength": 50 - * } ); - * } ) - */ - "iDisplayLength": 10, - - - /** - * Define the starting point for data display when using DataTables with - * pagination. Note that this parameter is the number of records, rather than - * the page number, so if you have 10 records per page and want to start on - * the third page, it should be "20". - * @type int - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.displayStart - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "displayStart": 20 - * } ); - * } ) - */ - "iDisplayStart": 0, - - - /** - * By default DataTables allows keyboard navigation of the table (sorting, paging, - * and filtering) by adding a `tabindex` attribute to the required elements. This - * allows you to tab through the controls and press the enter key to activate them. - * The tabindex is default 0, meaning that the tab follows the flow of the document. - * You can overrule this using this parameter if you wish. Use a value of -1 to - * disable built-in keyboard navigation. - * @type int - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.tabIndex - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "tabIndex": 1 - * } ); - * } ); - */ - "iTabIndex": 0, - - - /** - * Classes that DataTables assigns to the various components and features - * that it adds to the HTML table. This allows classes to be configured - * during initialisation in addition to through the static - * {@link DataTable.ext.oStdClasses} object). - * @namespace - * @name DataTable.defaults.classes - */ - "oClasses": {}, - - - /** - * All strings that DataTables uses in the user interface that it creates - * are defined in this object, allowing you to modified them individually or - * completely replace them all as required. - * @namespace - * @name DataTable.defaults.language - */ - "oLanguage": { - /** - * Strings that are used for WAI-ARIA labels and controls only (these are not - * actually visible on the page, but will be read by screenreaders, and thus - * must be internationalised as well). - * @namespace - * @name DataTable.defaults.language.aria - */ - "oAria": { - /** - * ARIA label that is added to the table headers when the column may be - * sorted ascending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * - * @dtopt Language - * @name DataTable.defaults.language.aria.sortAscending - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "aria": { - * "sortAscending": " - click/return to sort ascending" - * } - * } - * } ); - * } ); - */ - "sSortAscending": ": activate to sort column ascending", - - /** - * ARIA label that is added to the table headers when the column may be - * sorted descending by activing the column (click or return when focused). - * Note that the column header is prefixed to this string. - * @type string - * @default : activate to sort column ascending - * - * @dtopt Language - * @name DataTable.defaults.language.aria.sortDescending - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "aria": { - * "sortDescending": " - click/return to sort descending" - * } - * } - * } ); - * } ); - */ - "sSortDescending": ": activate to sort column descending" - }, - - /** - * Pagination string used by DataTables for the built-in pagination - * control types. - * @namespace - * @name DataTable.defaults.language.paginate - */ - "oPaginate": { - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the first page. - * @type string - * @default First - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.first - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "first": "First page" - * } - * } - * } ); - * } ); - */ - "sFirst": "First", - - - /** - * Text to use when using the 'full_numbers' type of pagination for the - * button to take the user to the last page. - * @type string - * @default Last - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.last - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "last": "Last page" - * } - * } - * } ); - * } ); - */ - "sLast": "Last", - - - /** - * Text to use for the 'next' pagination button (to take the user to the - * next page). - * @type string - * @default Next - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.next - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "next": "Next page" - * } - * } - * } ); - * } ); - */ - "sNext": "Next", - - - /** - * Text to use for the 'previous' pagination button (to take the user to - * the previous page). - * @type string - * @default Previous - * - * @dtopt Language - * @name DataTable.defaults.language.paginate.previous - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "paginate": { - * "previous": "Previous page" - * } - * } - * } ); - * } ); - */ - "sPrevious": "Previous" - }, - - /** - * This string is shown in preference to `zeroRecords` when the table is - * empty of data (regardless of filtering). Note that this is an optional - * parameter - if it is not given, the value of `zeroRecords` will be used - * instead (either the default or given value). - * @type string - * @default No data available in table - * - * @dtopt Language - * @name DataTable.defaults.language.emptyTable - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "emptyTable": "No data available in table" - * } - * } ); - * } ); - */ - "sEmptyTable": "No data available in table", - - - /** - * This string gives information to the end user about the information - * that is current on display on the page. The following tokens can be - * used in the string and will be dynamically replaced as the table - * display updates. This tokens can be placed anywhere in the string, or - * removed as needed by the language requires: - * - * * `\_START\_` - Display index of the first record on the current page - * * `\_END\_` - Display index of the last record on the current page - * * `\_TOTAL\_` - Number of records in the table after filtering - * * `\_MAX\_` - Number of records in the table without filtering - * * `\_PAGE\_` - Current page number - * * `\_PAGES\_` - Total number of pages of data in the table - * - * @type string - * @default Showing _START_ to _END_ of _TOTAL_ entries - * - * @dtopt Language - * @name DataTable.defaults.language.info - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "info": "Showing page _PAGE_ of _PAGES_" - * } - * } ); - * } ); - */ - "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", - - - /** - * Display information string for when the table is empty. Typically the - * format of this string should match `info`. - * @type string - * @default Showing 0 to 0 of 0 entries - * - * @dtopt Language - * @name DataTable.defaults.language.infoEmpty - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoEmpty": "No entries to show" - * } - * } ); - * } ); - */ - "sInfoEmpty": "Showing 0 to 0 of 0 entries", - - - /** - * When a user filters the information in a table, this string is appended - * to the information (`info`) to give an idea of how strong the filtering - * is. The variable _MAX_ is dynamically updated. - * @type string - * @default (filtered from _MAX_ total entries) - * - * @dtopt Language - * @name DataTable.defaults.language.infoFiltered - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoFiltered": " - filtering from _MAX_ records" - * } - * } ); - * } ); - */ - "sInfoFiltered": "(filtered from _MAX_ total entries)", - - - /** - * If can be useful to append extra information to the info string at times, - * and this variable does exactly that. This information will be appended to - * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are - * being used) at all times. - * @type string - * @default Empty string - * - * @dtopt Language - * @name DataTable.defaults.language.infoPostFix - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "infoPostFix": "All records shown are derived from real information." - * } - * } ); - * } ); - */ - "sInfoPostFix": "", - - - /** - * This decimal place operator is a little different from the other - * language options since DataTables doesn't output floating point - * numbers, so it won't ever use this for display of a number. Rather, - * what this parameter does is modify the sort methods of the table so - * that numbers which are in a format which has a character other than - * a period (`.`) as a decimal place will be sorted numerically. - * - * Note that numbers with different decimal places cannot be shown in - * the same table and still be sortable, the table must be consistent. - * However, multiple different tables on the page can use different - * decimal place characters. - * @type string - * @default - * - * @dtopt Language - * @name DataTable.defaults.language.decimal - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "decimal": "," - * "thousands": "." - * } - * } ); - * } ); - */ - "sDecimal": "", - - - /** - * DataTables has a build in number formatter (`formatNumber`) which is - * used to format large numbers that are used in the table information. - * By default a comma is used, but this can be trivially changed to any - * character you wish with this parameter. - * @type string - * @default , - * - * @dtopt Language - * @name DataTable.defaults.language.thousands - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "thousands": "'" - * } - * } ); - * } ); - */ - "sThousands": ",", - - - /** - * Detail the action that will be taken when the drop down menu for the - * pagination length option is changed. The '_MENU_' variable is replaced - * with a default select list of 10, 25, 50 and 100, and can be replaced - * with a custom select box if required. - * @type string - * @default Show _MENU_ entries - * - * @dtopt Language - * @name DataTable.defaults.language.lengthMenu - * - * @example - * // Language change only - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "lengthMenu": "Display _MENU_ records" - * } - * } ); - * } ); - * - * @example - * // Language and options change - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "lengthMenu": 'Display records' - * } - * } ); - * } ); - */ - "sLengthMenu": "Show _MENU_ entries", - - - /** - * When using Ajax sourced data and during the first draw when DataTables is - * gathering the data, this message is shown in an empty row in the table to - * indicate to the end user the the data is being loaded. Note that this - * parameter is not used when loading data by server-side processing, just - * Ajax sourced data with client-side processing. - * @type string - * @default Loading... - * - * @dtopt Language - * @name DataTable.defaults.language.loadingRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "loadingRecords": "Please wait - loading..." - * } - * } ); - * } ); - */ - "sLoadingRecords": "Loading...", - - - /** - * Text which is displayed when the table is processing a user action - * (usually a sort command or similar). - * @type string - * @default Processing... - * - * @dtopt Language - * @name DataTable.defaults.language.processing - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "processing": "DataTables is currently busy" - * } - * } ); - * } ); - */ - "sProcessing": "Processing...", - - - /** - * Details the actions that will be taken when the user types into the - * filtering input text box. The variable "_INPUT_", if used in the string, - * is replaced with the HTML text box for the filtering input allowing - * control over where it appears in the string. If "_INPUT_" is not given - * then the input box is appended to the string automatically. - * @type string - * @default Search: - * - * @dtopt Language - * @name DataTable.defaults.language.search - * - * @example - * // Input text box will be appended at the end automatically - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Filter records:" - * } - * } ); - * } ); - * - * @example - * // Specify where the filter should appear - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Apply filter _INPUT_ to table" - * } - * } ); - * } ); - */ - "sSearch": "Search:", - - - /** - * Assign a `placeholder` attribute to the search `input` element - * @type string - * @default - * - * @dtopt Language - * @name DataTable.defaults.language.searchPlaceholder - */ - "sSearchPlaceholder": "", - - - /** - * All of the language information can be stored in a file on the - * server-side, which DataTables will look up if this parameter is passed. - * It must store the URL of the language file, which is in a JSON format, - * and the object has the same properties as the oLanguage object in the - * initialiser object (i.e. the above parameters). Please refer to one of - * the example language files to see how this works in action. - * @type string - * @default Empty string - i.e. disabled - * - * @dtopt Language - * @name DataTable.defaults.language.url - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt" - * } - * } ); - * } ); - */ - "sUrl": "", - - - /** - * Text shown inside the table records when the is no information to be - * displayed after filtering. `emptyTable` is shown when there is simply no - * information in the table at all (regardless of filtering). - * @type string - * @default No matching records found - * - * @dtopt Language - * @name DataTable.defaults.language.zeroRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "zeroRecords": "No records to display" - * } - * } ); - * } ); - */ - "sZeroRecords": "No matching records found" - }, - - - /** - * This parameter allows you to have define the global filtering state at - * initialisation time. As an object the `search` parameter must be - * defined, but all other parameters are optional. When `regex` is true, - * the search string will be treated as a regular expression, when false - * (default) it will be treated as a straight string. When `smart` - * DataTables will use it's smart filtering methods (to word match at - * any point in the data), when false this will not be done. - * @namespace - * @extends DataTable.models.oSearch - * - * @dtopt Options - * @name DataTable.defaults.search - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "search": {"search": "Initial search"} - * } ); - * } ) - */ - "oSearch": $.extend( {}, DataTable.models.oSearch ), - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * By default DataTables will look for the property `data` (or `aaData` for - * compatibility with DataTables 1.9-) when obtaining data from an Ajax - * source or for server-side processing - this parameter allows that - * property to be changed. You can use Javascript dotted object notation to - * get a data source for multiple levels of nesting. - * @type string - * @default data - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxDataProp - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxDataProp": "data", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * You can instruct DataTables to load data from an external - * source using this parameter (use aData if you want to pass data in you - * already have). Simply provide a url a JSON object can be obtained from. - * @type string - * @default null - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxSource - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxSource": null, - - - /** - * This initialisation variable allows you to specify exactly where in the - * DOM you want DataTables to inject the various controls it adds to the page - * (for example you might want the pagination controls at the top of the - * table). DIV elements (with or without a custom class) can also be added to - * aid styling. The follow syntax is used: - *
      - *
    • The following options are allowed: - *
        - *
      • 'l' - Length changing
      • - *
      • 'f' - Filtering input
      • - *
      • 't' - The table!
      • - *
      • 'i' - Information
      • - *
      • 'p' - Pagination
      • - *
      • 'r' - pRocessing
      • - *
      - *
    • - *
    • The following constants are allowed: - *
        - *
      • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
      • - *
      • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
      • - *
      - *
    • - *
    • The following syntax is expected: - *
        - *
      • '<' and '>' - div elements
      • - *
      • '<"class" and '>' - div with a class
      • - *
      • '<"#id" and '>' - div with an ID
      • - *
      - *
    • - *
    • Examples: - *
        - *
      • '<"wrapper"flipt>'
      • - *
      • '<lf<t>ip>'
      • - *
      - *
    • - *
    - * @type string - * @default lfrtip (when `jQueryUI` is false) or - * <"H"lfr>t<"F"ip> (when `jQueryUI` is true) - * - * @dtopt Options - * @name DataTable.defaults.dom - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "dom": '<"top"i>rt<"bottom"flp><"clear">' - * } ); - * } ); - */ - "sDom": "lfrtip", - - - /** - * Search delay option. This will throttle full table searches that use the - * DataTables provided search input element (it does not effect calls to - * `dt-api search()`, providing a delay before the search is made. - * @type integer - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.searchDelay - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "searchDelay": 200 - * } ); - * } ) - */ - "searchDelay": null, - - - /** - * DataTables features six different built-in options for the buttons to - * display for pagination control: - * - * * `numbers` - Page number buttons only - * * `simple` - 'Previous' and 'Next' buttons only - * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers - * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons - * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers - * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers - * - * Further methods can be added using {@link DataTable.ext.oPagination}. - * @type string - * @default simple_numbers - * - * @dtopt Options - * @name DataTable.defaults.pagingType - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "pagingType": "full_numbers" - * } ); - * } ) - */ - "sPaginationType": "simple_numbers", - - - /** - * Enable horizontal scrolling. When a table is too wide to fit into a - * certain layout, or you have a large number of columns in the table, you - * can enable x-scrolling to show the table in a viewport, which can be - * scrolled. This property can be `true` which will allow the table to - * scroll horizontally when needed, or any CSS unit, or a number (in which - * case it will be treated as a pixel measurement). Setting as simply `true` - * is recommended. - * @type boolean|string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollX - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": true, - * "scrollCollapse": true - * } ); - * } ); - */ - "sScrollX": "", - - - /** - * This property can be used to force a DataTable to use more width than it - * might otherwise do when x-scrolling is enabled. For example if you have a - * table which requires to be well spaced, this parameter is useful for - * "over-sizing" the table, and thus forcing scrolling. This property can by - * any CSS unit, or a number (in which case it will be treated as a pixel - * measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Options - * @name DataTable.defaults.scrollXInner - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": "100%", - * "scrollXInner": "110%" - * } ); - * } ); - */ - "sScrollXInner": "", - - - /** - * Enable vertical scrolling. Vertical scrolling will constrain the DataTable - * to the given height, and enable scrolling for any data which overflows the - * current viewport. This can be used as an alternative to paging to display - * a lot of data in a small area (although paging and scrolling can both be - * enabled at the same time). This property can be any CSS unit, or a number - * (in which case it will be treated as a pixel measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollY - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollY": "200px", - * "paginate": false - * } ); - * } ); - */ - "sScrollY": "", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * Set the HTTP method that is used to make the Ajax call for server-side - * processing or Ajax sourced data. - * @type string - * @default GET - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.serverMethod - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sServerMethod": "GET", - - - /** - * DataTables makes use of renderers when displaying HTML elements for - * a table. These renderers can be added or modified by plug-ins to - * generate suitable mark-up for a site. For example the Bootstrap - * integration plug-in for DataTables uses a paging button renderer to - * display pagination buttons in the mark-up required by Bootstrap. - * - * For further information about the renderers available see - * DataTable.ext.renderer - * @type string|object - * @default null - * - * @name DataTable.defaults.renderer - * - */ - "renderer": null, - - - /** - * Set the data property name that DataTables should use to get a row's id - * to set as the `id` property in the node. - * @type string - * @default DT_RowId - * - * @name DataTable.defaults.rowId - */ - "rowId": "DT_RowId" - }; - - _fnHungarianMap( DataTable.defaults ); - - - - /* - * Developer note - See note in model.defaults.js about the use of Hungarian - * notation and camel case. - */ - - /** - * Column options that can be given to DataTables at initialisation time. - * @namespace - */ - DataTable.defaults.column = { - /** - * Define which column(s) an order will occur on for this column. This - * allows a column's ordering to take multiple columns into account when - * doing a sort or use the data from a different column. For example first - * name / last name columns make sense to do a multi-column sort over the - * two columns. - * @type array|int - * @default null Takes the value of the column index automatically - * - * @name DataTable.defaults.column.orderData - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderData": [ 0, 1 ], "targets": [ 0 ] }, - * { "orderData": [ 1, 0 ], "targets": [ 1 ] }, - * { "orderData": 2, "targets": [ 2 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderData": [ 0, 1 ] }, - * { "orderData": [ 1, 0 ] }, - * { "orderData": 2 }, - * null, - * null - * ] - * } ); - * } ); - */ - "aDataSort": null, - "iDataSort": -1, - - - /** - * You can control the default ordering direction, and even alter the - * behaviour of the sort handler (i.e. only allow ascending ordering etc) - * using this parameter. - * @type array - * @default [ 'asc', 'desc' ] - * - * @name DataTable.defaults.column.orderSequence - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderSequence": [ "asc" ], "targets": [ 1 ] }, - * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] }, - * { "orderSequence": [ "desc" ], "targets": [ 3 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * { "orderSequence": [ "asc" ] }, - * { "orderSequence": [ "desc", "asc", "asc" ] }, - * { "orderSequence": [ "desc" ] }, - * null - * ] - * } ); - * } ); - */ - "asSorting": [ 'asc', 'desc' ], - - - /** - * Enable or disable filtering on the data in this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.searchable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "searchable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "searchable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSearchable": true, - - - /** - * Enable or disable ordering on this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.orderable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSortable": true, - - - /** - * Enable or disable the display of this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.visible - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "visible": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "visible": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bVisible": true, - - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} td The TD node that has been created - * @param {*} cellData The Data for the cell - * @param {array|object} rowData The data for the whole row - * @param {int} row The row index for the aoData data store - * @param {int} col The column index for aoColumns - * - * @name DataTable.defaults.column.createdCell - * @dtopt Columns - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [3], - * "createdCell": function (td, cellData, rowData, row, col) { - * if ( cellData == "1.7" ) { - * $(td).css('color', 'blue') - * } - * } - * } ] - * }); - * } ); - */ - "fnCreatedCell": null, - - - /** - * This parameter has been replaced by `data` in DataTables to ensure naming - * consistency. `dataProp` can still be used, as there is backwards - * compatibility in DataTables for this option, but it is strongly - * recommended that you use `data` in preference to `dataProp`. - * @name DataTable.defaults.column.dataProp - */ - - - /** - * This property can be used to read data from any data source property, - * including deeply nested objects / properties. `data` can be given in a - * number of different ways which effect its behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. Note that - * function notation is recommended for use in `render` rather than - * `data` as it is much simpler to use as a renderer. - * * `null` - use the original data source for the row rather than plucking - * data directly from it. This action has effects on two other - * initialisation options: - * * `defaultContent` - When null is given as the `data` option and - * `defaultContent` is specified for the column, the value defined by - * `defaultContent` will be used for the cell. - * * `render` - When null is used for the `data` option and the `render` - * option is specified for the column, the whole data source for the - * row is used for the renderer. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * `{array|object}` The data source for the row - * * `{string}` The type call data requested - this will be 'set' when - * setting data or 'filter', 'display', 'type', 'sort' or undefined - * when gathering data. Note that when `undefined` is given for the - * type DataTables expects to get the raw data for the object back< - * * `{*}` Data to set when the second parameter is 'set'. - * * Return: - * * The return value from the function is not required when 'set' is - * the type of call, but otherwise the return is what will be used - * for the data requested. - * - * Note that `data` is a getter and setter option. If you just require - * formatting of data for output, you will likely want to use `render` which - * is simply a getter and thus simpler to use. - * - * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The - * name change reflects the flexibility of this property and is consistent - * with the naming of mRender. If 'mDataProp' is given, then it will still - * be used by DataTables, as it automatically maps the old name to the new - * if required. - * - * @type string|int|function|null - * @default null Use automatically calculated column index - * - * @name DataTable.defaults.column.data - * @dtopt Columns - * - * @example - * // Read table data from objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": {value}, - * // "version": {value}, - * // "grade": {value} - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/objects.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform" }, - * { "data": "version" }, - * { "data": "grade" } - * ] - * } ); - * } ); - * - * @example - * // Read information from deeply nested objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": { - * // "inner": {value} - * // }, - * // "details": [ - * // {value}, {value} - * // ] - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform.inner" }, - * { "data": "details.0" }, - * { "data": "details.1" } - * ] - * } ); - * } ); - * - * @example - * // Using `data` as a function to provide different information for - * // sorting, filtering and display. In this case, currency (price) - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": function ( source, type, val ) { - * if (type === 'set') { - * source.price = val; - * // Store the computed dislay and filter values for efficiency - * source.price_display = val=="" ? "" : "$"+numberFormat(val); - * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; - * return; - * } - * else if (type === 'display') { - * return source.price_display; - * } - * else if (type === 'filter') { - * return source.price_filter; - * } - * // 'sort', 'type' and undefined all just use the integer - * return source.price; - * } - * } ] - * } ); - * } ); - * - * @example - * // Using default content - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, - * "defaultContent": "Click to edit" - * } ] - * } ); - * } ); - * - * @example - * // Using array notation - outputting a list from an array - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "name[, ]" - * } ] - * } ); - * } ); - * - */ - "mData": null, - - - /** - * This property is the rendering partner to `data` and it is suggested that - * when you want to manipulate data for display (including filtering, - * sorting etc) without altering the underlying data for the table, use this - * property. `render` can be considered to be the the read only companion to - * `data` which is read / write (then as such more complex). Like `data` - * this option can be given in a number of different ways to effect its - * behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. - * * `object` - use different data for the different data types requested by - * DataTables ('filter', 'display', 'type' or 'sort'). The property names - * of the object is the data type the property refers to and the value can - * defined using an integer, string or function using the same rules as - * `render` normally does. Note that an `_` option _must_ be specified. - * This is the default value to use if you haven't specified a value for - * the data type requested by DataTables. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * {array|object} The data source for the row (based on `data`) - * * {string} The type call data requested - this will be 'filter', - * 'display', 'type' or 'sort'. - * * {array|object} The full data source for the row (not based on - * `data`) - * * Return: - * * The return value from the function is what will be used for the - * data requested. - * - * @type string|int|function|object|null - * @default null Use the data source value. - * - * @name DataTable.defaults.column.render - * @dtopt Columns - * - * @example - * // Create a comma separated list from an array of objects - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { - * "data": "platform", - * "render": "[, ].name" - * } - * ] - * } ); - * } ); - * - * @example - * // Execute a function to obtain data - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": "browserName()" - * } ] - * } ); - * } ); - * - * @example - * // As an object, extracting different data for the different types - * // This would be used with a data source such as: - * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" } - * // Here the `phone` integer is used for sorting and type detection, while `phone_filter` - * // (which has both forms) is used for filtering for if a user inputs either format, while - * // the formatted phone number is the one that is shown in the table. - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": { - * "_": "phone", - * "filter": "phone_filter", - * "display": "phone_display" - * } - * } ] - * } ); - * } ); - * - * @example - * // Use as a function to create a link from the data source - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "download_link", - * "render": function ( data, type, full ) { - * return 'Download'; - * } - * } ] - * } ); - * } ); - */ - "mRender": null, - - - /** - * Change the cell type created for the column - either TD cells or TH cells. This - * can be useful as TH cells have semantic meaning in the table body, allowing them - * to act as a header for a row (you may wish to add scope='row' to the TH elements). - * @type string - * @default td - * - * @name DataTable.defaults.column.cellType - * @dtopt Columns - * - * @example - * // Make the first column use TH cells - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "cellType": "th" - * } ] - * } ); - * } ); - */ - "sCellType": "td", - - - /** - * Class to give to each cell in this column. - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.class - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "class": "my_class", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "class": "my_class" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sClass": "", - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * Generally you shouldn't need this! - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.contentPadding - * @dtopt Columns - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "contentPadding": "mmm" - * } - * ] - * } ); - * } ); - */ - "sContentPadding": "", - - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because `data` - * is set to null, or because the data source itself is null). - * @type string - * @default null - * - * @name DataTable.defaults.column.defaultContent - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { - * "data": null, - * "defaultContent": "Edit", - * "targets": [ -1 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "data": null, - * "defaultContent": "Edit" - * } - * ] - * } ); - * } ); - */ - "sDefaultContent": null, - - - /** - * This parameter is only used in DataTables' server-side processing. It can - * be exceptionally useful to know what columns are being displayed on the - * client side, and to map these to database fields. When defined, the names - * also allow DataTables to reorder information from the server if it comes - * back in an unexpected order (i.e. if you switch your columns around on the - * client-side, your server-side code does not also need updating). - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.name - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "name": "engine", "targets": [ 0 ] }, - * { "name": "browser", "targets": [ 1 ] }, - * { "name": "platform", "targets": [ 2 ] }, - * { "name": "version", "targets": [ 3 ] }, - * { "name": "grade", "targets": [ 4 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "name": "engine" }, - * { "name": "browser" }, - * { "name": "platform" }, - * { "name": "version" }, - * { "name": "grade" } - * ] - * } ); - * } ); - */ - "sName": "", - - - /** - * Defines a data source type for the ordering which can be used to read - * real-time information from the table (updating the internally cached - * version) prior to ordering. This allows ordering to occur on user - * editable elements such as form inputs. - * @type string - * @default std - * - * @name DataTable.defaults.column.orderDataType - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderDataType": "dom-text", "targets": [ 2, 3 ] }, - * { "type": "numeric", "targets": [ 3 ] }, - * { "orderDataType": "dom-select", "targets": [ 4 ] }, - * { "orderDataType": "dom-checkbox", "targets": [ 5 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * { "orderDataType": "dom-text" }, - * { "orderDataType": "dom-text", "type": "numeric" }, - * { "orderDataType": "dom-select" }, - * { "orderDataType": "dom-checkbox" } - * ] - * } ); - * } ); - */ - "sSortDataType": "std", - - - /** - * The title of this column. - * @type string - * @default null Derived from the 'TH' value for this column in the - * original HTML table. - * - * @name DataTable.defaults.column.title - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "title": "My column title", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "title": "My column title" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sTitle": null, - - - /** - * The type allows you to specify how the data for this column will be - * ordered. Four types (string, numeric, date and html (which will strip - * HTML tags before ordering)) are currently available. Note that only date - * formats understood by Javascript's Date() object will be accepted as type - * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string', - * 'numeric', 'date' or 'html' (by default). Further types can be adding - * through plug-ins. - * @type string - * @default null Auto-detected from raw data - * - * @name DataTable.defaults.column.type - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "type": "html", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "type": "html" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sType": null, - - - /** - * Defining the width of the column, this parameter may take any CSS value - * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not - * been given a specific width through this interface ensuring that the table - * remains readable. - * @type string - * @default null Automatic - * - * @name DataTable.defaults.column.width - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "width": "20%", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "width": "20%" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sWidth": null - }; - - _fnHungarianMap( DataTable.defaults.column ); - - - - /** - * DataTables settings object - this holds all the information needed for a - * given table, including configuration, data and current application of the - * table options. DataTables does not have a single instance for each DataTable - * with the settings attached to that instance, but rather instances of the - * DataTable "class" are created on-the-fly as needed (typically by a - * $().dataTable() call) and the settings object is then applied to that - * instance. - * - * Note that this object is related to {@link DataTable.defaults} but this - * one is the internal data store for DataTables's cache of columns. It should - * NOT be manipulated outside of DataTables. Any configuration should be done - * through the initialisation options. - * @namespace - * @todo Really should attach the settings object to individual instances so we - * don't need to create new instances on each $().dataTable() call (if the - * table already exists). It would also save passing oSettings around and - * into every single function. However, this is a very significant - * architecture change for DataTables and will almost certainly break - * backwards compatibility with older installations. This is something that - * will be done in 2.0. - */ - DataTable.models.oSettings = { - /** - * Primary features of DataTables and their enablement state. - * @namespace - */ - "oFeatures": { - - /** - * Flag to say if DataTables should automatically try to calculate the - * optimum table and columns widths (true) or not (false). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoWidth": null, - - /** - * Delay the creation of TR and TD elements until they are actually - * needed by a driven page draw. This can give a significant speed - * increase for Ajax source and Javascript source data, but makes no - * difference at all fro DOM and server-side processing tables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bDeferRender": null, - - /** - * Enable filtering on the table or not. Note that if this is disabled - * then there is no filtering at all on the table, including fnFilter. - * To just remove the filtering input use sDom and remove the 'f' option. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bFilter": null, - - /** - * Table information element (the 'Showing x of y records' div) enable - * flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfo": null, - - /** - * Present a user control allowing the end user to change the page size - * when pagination is enabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bLengthChange": null, - - /** - * Pagination enabled or not. Note that if this is disabled then length - * changing must also be disabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bPaginate": null, - - /** - * Processing indicator enable flag whenever DataTables is enacting a - * user request - typically an Ajax request for server-side processing. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bProcessing": null, - - /** - * Server-side processing enabled flag - when enabled DataTables will - * get all data from the server for every draw - there is no filtering, - * sorting or paging done on the client-side. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bServerSide": null, - - /** - * Sorting enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSort": null, - - /** - * Multi-column sorting - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortMulti": null, - - /** - * Apply a class to the columns which are being sorted to provide a - * visual highlight or not. This can slow things down when enabled since - * there is a lot of DOM interaction. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortClasses": null, - - /** - * State saving enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bStateSave": null - }, - - - /** - * Scrolling settings for a table. - * @namespace - */ - "oScroll": { - /** - * When the table is shorter in height than sScrollY, collapse the - * table container down to the height of the table (when true). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bCollapse": null, - - /** - * Width of the scrollbar for the web-browser's platform. Calculated - * during table initialisation. - * @type int - * @default 0 - */ - "iBarWidth": 0, - - /** - * Viewport width for horizontal scrolling. Horizontal scrolling is - * disabled if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sX": null, - - /** - * Width to expand the table to when using x-scrolling. Typically you - * should not need to use this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @deprecated - */ - "sXInner": null, - - /** - * Viewport height for vertical scrolling. Vertical scrolling is disabled - * if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sY": null - }, - - /** - * Language information for the table. - * @namespace - * @extends DataTable.defaults.oLanguage - */ - "oLanguage": { - /** - * Information callback function. See - * {@link DataTable.defaults.fnInfoCallback} - * @type function - * @default null - */ - "fnInfoCallback": null - }, - - /** - * Browser support parameters - * @namespace - */ - "oBrowser": { - /** - * Indicate if the browser incorrectly calculates width:100% inside a - * scrolling element (IE6/7) - * @type boolean - * @default false - */ - "bScrollOversize": false, - - /** - * Determine if the vertical scrollbar is on the right or left of the - * scrolling container - needed for rtl language layout, although not - * all browsers move the scrollbar (Safari). - * @type boolean - * @default false - */ - "bScrollbarLeft": false, - - /** - * Flag for if `getBoundingClientRect` is fully supported or not - * @type boolean - * @default false - */ - "bBounding": false, - - /** - * Browser scrollbar width - * @type integer - * @default 0 - */ - "barWidth": 0 - }, - - - "ajax": null, - - - /** - * Array referencing the nodes which are used for the features. The - * parameters of this object match what is allowed by sDom - i.e. - *
      - *
    • 'l' - Length changing
    • - *
    • 'f' - Filtering input
    • - *
    • 't' - The table!
    • - *
    • 'i' - Information
    • - *
    • 'p' - Pagination
    • - *
    • 'r' - pRocessing
    • - *
    - * @type array - * @default [] - */ - "aanFeatures": [], - - /** - * Store data information - see {@link DataTable.models.oRow} for detailed - * information. - * @type array - * @default [] - */ - "aoData": [], - - /** - * Array of indexes which are in the current display (after filtering etc) - * @type array - * @default [] - */ - "aiDisplay": [], - - /** - * Array of indexes for display - no filtering - * @type array - * @default [] - */ - "aiDisplayMaster": [], - - /** - * Map of row ids to data indexes - * @type object - * @default {} - */ - "aIds": {}, - - /** - * Store information about each column that is in use - * @type array - * @default [] - */ - "aoColumns": [], - - /** - * Store information about the table's header - * @type array - * @default [] - */ - "aoHeader": [], - - /** - * Store information about the table's footer - * @type array - * @default [] - */ - "aoFooter": [], - - /** - * Store the applied global search information in case we want to force a - * research or compare the old search to a new one. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @namespace - * @extends DataTable.models.oSearch - */ - "oPreviousSearch": {}, - - /** - * Store the applied search for each column - see - * {@link DataTable.models.oSearch} for the format that is used for the - * filtering information for each column. - * @type array - * @default [] - */ - "aoPreSearchCols": [], - - /** - * Sorting that is applied to the table. Note that the inner arrays are - * used in the following manner: - *
      - *
    • Index 0 - column number
    • - *
    • Index 1 - current sorting direction
    • - *
    - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @todo These inner arrays should really be objects - */ - "aaSorting": null, - - /** - * Sorting that is always applied to the table (i.e. prefixed in front of - * aaSorting). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aaSortingFixed": [], - - /** - * Classes to use for the striping of a table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "asStripeClasses": null, - - /** - * If restoring a table - we should restore its striping classes as well - * @type array - * @default [] - */ - "asDestroyStripes": [], - - /** - * If restoring a table - we should restore its width - * @type int - * @default 0 - */ - "sDestroyWidth": 0, - - /** - * Callback functions array for every time a row is inserted (i.e. on a draw). - * @type array - * @default [] - */ - "aoRowCallback": [], - - /** - * Callback functions for the header on each draw. - * @type array - * @default [] - */ - "aoHeaderCallback": [], - - /** - * Callback function for the footer on each draw. - * @type array - * @default [] - */ - "aoFooterCallback": [], - - /** - * Array of callback functions for draw callback functions - * @type array - * @default [] - */ - "aoDrawCallback": [], - - /** - * Array of callback functions for row created function - * @type array - * @default [] - */ - "aoRowCreatedCallback": [], - - /** - * Callback functions for just before the table is redrawn. A return of - * false will be used to cancel the draw. - * @type array - * @default [] - */ - "aoPreDrawCallback": [], - - /** - * Callback functions for when the table has been initialised. - * @type array - * @default [] - */ - "aoInitComplete": [], - - - /** - * Callbacks for modifying the settings to be stored for state saving, prior to - * saving state. - * @type array - * @default [] - */ - "aoStateSaveParams": [], - - /** - * Callbacks for modifying the settings that have been stored for state saving - * prior to using the stored values to restore the state. - * @type array - * @default [] - */ - "aoStateLoadParams": [], - - /** - * Callbacks for operating on the settings object once the saved state has been - * loaded - * @type array - * @default [] - */ - "aoStateLoaded": [], - - /** - * Cache the table ID for quick access - * @type string - * @default Empty string - */ - "sTableId": "", - - /** - * The TABLE node for the main table - * @type node - * @default null - */ - "nTable": null, - - /** - * Permanent ref to the thead element - * @type node - * @default null - */ - "nTHead": null, - - /** - * Permanent ref to the tfoot element - if it exists - * @type node - * @default null - */ - "nTFoot": null, - - /** - * Permanent ref to the tbody element - * @type node - * @default null - */ - "nTBody": null, - - /** - * Cache the wrapper node (contains all DataTables controlled elements) - * @type node - * @default null - */ - "nTableWrapper": null, - - /** - * Indicate if when using server-side processing the loading of data - * should be deferred until the second draw. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - * @default false - */ - "bDeferLoading": false, - - /** - * Indicate if all required information has been read in - * @type boolean - * @default false - */ - "bInitialised": false, - - /** - * Information about open rows. Each object in the array has the parameters - * 'nTr' and 'nParent' - * @type array - * @default [] - */ - "aoOpenRows": [], - - /** - * Dictate the positioning of DataTables' control elements - see - * {@link DataTable.model.oInit.sDom}. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sDom": null, - - /** - * Search delay (in mS) - * @type integer - * @default null - */ - "searchDelay": null, - - /** - * Which type of pagination should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default two_button - */ - "sPaginationType": "two_button", - - /** - * The state duration (for `stateSave`) in seconds. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - * @default 0 - */ - "iStateDuration": 0, - - /** - * Array of callback functions for state saving. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the JSON string to save that has been thus far created. Returns - * a JSON string to be inserted into a json object - * (i.e. '"param": [ 0, 1, 2]')
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateSave": [], - - /** - * Array of callback functions for state loading. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the object stored. May return false to cancel state loading
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateLoad": [], - - /** - * State that was saved. Useful for back reference - * @type object - * @default null - */ - "oSavedState": null, - - /** - * State that was loaded. Useful for back reference - * @type object - * @default null - */ - "oLoadedState": null, - - /** - * Source url for AJAX data for the table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sAjaxSource": null, - - /** - * Property from a given object from which to read the table data from. This - * can be an empty string (when not server-side processing), in which case - * it is assumed an an array is given directly. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sAjaxDataProp": null, - - /** - * Note if draw should be blocked while getting data - * @type boolean - * @default true - */ - "bAjaxDataGet": true, - - /** - * The last jQuery XHR object that was used for server-side data gathering. - * This can be used for working with the XHR information in one of the - * callbacks - * @type object - * @default null - */ - "jqXHR": null, - - /** - * JSON returned from the server in the last Ajax request - * @type object - * @default undefined - */ - "json": undefined, - - /** - * Data submitted as part of the last Ajax request - * @type object - * @default undefined - */ - "oAjaxData": undefined, - - /** - * Function to get the server-side data. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnServerData": null, - - /** - * Functions which are called prior to sending an Ajax request so extra - * parameters can easily be sent to the server - * @type array - * @default [] - */ - "aoServerParams": [], - - /** - * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if - * required). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sServerMethod": null, - - /** - * Format numbers for display. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnFormatNumber": null, - - /** - * List of options that can be used for the user selectable length menu. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aLengthMenu": null, - - /** - * Counter for the draws that the table does. Also used as a tracker for - * server-side processing - * @type int - * @default 0 - */ - "iDraw": 0, - - /** - * Indicate if a redraw is being done - useful for Ajax - * @type boolean - * @default false - */ - "bDrawing": false, - - /** - * Draw index (iDraw) of the last error when parsing the returned data - * @type int - * @default -1 - */ - "iDrawError": -1, - - /** - * Paging display length - * @type int - * @default 10 - */ - "_iDisplayLength": 10, - - /** - * Paging start point - aiDisplay index - * @type int - * @default 0 - */ - "_iDisplayStart": 0, - - /** - * Server-side processing - number of records in the result set - * (i.e. before filtering), Use fnRecordsTotal rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type int - * @default 0 - * @private - */ - "_iRecordsTotal": 0, - - /** - * Server-side processing - number of records in the current display set - * (i.e. after filtering). Use fnRecordsDisplay rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type boolean - * @default 0 - * @private - */ - "_iRecordsDisplay": 0, - - /** - * The classes to use for the table - * @type object - * @default {} - */ - "oClasses": {}, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if filtering has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bFiltered": false, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if sorting has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bSorted": false, - - /** - * Indicate that if multiple rows are in the header and there is more than - * one unique cell per column, if the top one (true) or bottom one (false) - * should be used for sorting / title by DataTables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortCellsTop": null, - - /** - * Initialisation object that is used for the table - * @type object - * @default null - */ - "oInit": null, - - /** - * Destroy callback functions - for plug-ins to attach themselves to the - * destroy so they can clean up markup and events. - * @type array - * @default [] - */ - "aoDestroyCallback": [], - - - /** - * Get the number of records in the current record set, before filtering - * @type function - */ - "fnRecordsTotal": function () - { - return _fnDataSource( this ) == 'ssp' ? - this._iRecordsTotal * 1 : - this.aiDisplayMaster.length; - }, - - /** - * Get the number of records in the current record set, after filtering - * @type function - */ - "fnRecordsDisplay": function () - { - return _fnDataSource( this ) == 'ssp' ? - this._iRecordsDisplay * 1 : - this.aiDisplay.length; - }, - - /** - * Get the display end point - aiDisplay index - * @type function - */ - "fnDisplayEnd": function () - { - var - len = this._iDisplayLength, - start = this._iDisplayStart, - calc = start + len, - records = this.aiDisplay.length, - features = this.oFeatures, - paginate = features.bPaginate; - - if ( features.bServerSide ) { - return paginate === false || len === -1 ? - start + records : - Math.min( start+len, this._iRecordsDisplay ); - } - else { - return ! paginate || calc>records || len===-1 ? - records : - calc; - } - }, - - /** - * The DataTables object for this table - * @type object - * @default null - */ - "oInstance": null, - - /** - * Unique identifier for each instance of the DataTables object. If there - * is an ID on the table node, then it takes that value, otherwise an - * incrementing internal counter is used. - * @type string - * @default null - */ - "sInstance": null, - - /** - * tabindex attribute value that is added to DataTables control elements, allowing - * keyboard navigation of the table and its controls. - */ - "iTabIndex": 0, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollHead": null, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollFoot": null, - - /** - * Last applied sort - * @type array - * @default [] - */ - "aLastSort": [], - - /** - * Stored plug-in instances - * @type object - * @default {} - */ - "oPlugins": {}, - - /** - * Function used to get a row's id from the row's data - * @type function - * @default null - */ - "rowIdFn": null, - - /** - * Data location where to store a row's id - * @type string - * @default null - */ - "rowId": null - }; - - /** - * Extension object for DataTables that is used to provide all extension - * options. - * - * Note that the `DataTable.ext` object is available through - * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is - * also aliased to `jQuery.fn.dataTableExt` for historic reasons. - * @namespace - * @extends DataTable.models.ext - */ - - - /** - * DataTables extensions - * - * This namespace acts as a collection area for plug-ins that can be used to - * extend DataTables capabilities. Indeed many of the build in methods - * use this method to provide their own capabilities (sorting methods for - * example). - * - * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy - * reasons - * - * @namespace - */ - DataTable.ext = _ext = { - /** - * Buttons. For use with the Buttons extension for DataTables. This is - * defined here so other extensions can define buttons regardless of load - * order. It is _not_ used by DataTables core. - * - * @type object - * @default {} - */ - buttons: {}, - - - /** - * Element class names - * - * @type object - * @default {} - */ - classes: {}, - - - /** - * DataTables build type (expanded by the download builder) - * - * @type string - */ - builder: "-source-", - - - /** - * Error reporting. - * - * How should DataTables report an error. Can take the value 'alert', - * 'throw', 'none' or a function. - * - * @type string|function - * @default alert - */ - errMode: "alert", - - - /** - * Feature plug-ins. - * - * This is an array of objects which describe the feature plug-ins that are - * available to DataTables. These feature plug-ins are then available for - * use through the `dom` initialisation option. - * - * Each feature plug-in is described by an object which must have the - * following properties: - * - * * `fnInit` - function that is used to initialise the plug-in, - * * `cFeature` - a character so the feature can be enabled by the `dom` - * instillation option. This is case sensitive. - * - * The `fnInit` function has the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * - * And the following return is expected: - * - * * {node|null} The element which contains your feature. Note that the - * return may also be void if your plug-in does not require to inject any - * DOM elements into DataTables control (`dom`) - for example this might - * be useful when developing a plug-in which allows table control via - * keyboard entry - * - * @type array - * - * @example - * $.fn.dataTable.ext.features.push( { - * "fnInit": function( oSettings ) { - * return new TableTools( { "oDTSettings": oSettings } ); - * }, - * "cFeature": "T" - * } ); - */ - feature: [], - - - /** - * Row searching. - * - * This method of searching is complimentary to the default type based - * searching, and a lot more comprehensive as it allows you complete control - * over the searching logic. Each element in this array is a function - * (parameters described below) that is called for every row in the table, - * and your logic decides if it should be included in the searching data set - * or not. - * - * Searching functions have the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{array|object}` Data for the row to be processed (same as the - * original format that was passed in as the data source, or an array - * from a DOM data source - * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which - * can be useful to retrieve the `TR` element if you need DOM interaction. - * - * And the following return is expected: - * - * * {boolean} Include the row in the searched result set (true) or not - * (false) - * - * Note that as with the main search ability in DataTables, technically this - * is "filtering", since it is subtractive. However, for consistency in - * naming we call it searching here. - * - * @type array - * @default [] - * - * @example - * // The following example shows custom search being applied to the - * // fourth column (i.e. the data[3] index) based on two input values - * // from the end-user, matching the data in a certain range. - * $.fn.dataTable.ext.search.push( - * function( settings, data, dataIndex ) { - * var min = document.getElementById('min').value * 1; - * var max = document.getElementById('max').value * 1; - * var version = data[3] == "-" ? 0 : data[3]*1; - * - * if ( min == "" && max == "" ) { - * return true; - * } - * else if ( min == "" && version < max ) { - * return true; - * } - * else if ( min < version && "" == max ) { - * return true; - * } - * else if ( min < version && version < max ) { - * return true; - * } - * return false; - * } - * ); - */ - search: [], - - - /** - * Selector extensions - * - * The `selector` option can be used to extend the options available for the - * selector modifier options (`selector-modifier` object data type) that - * each of the three built in selector types offer (row, column and cell + - * their plural counterparts). For example the Select extension uses this - * mechanism to provide an option to select only rows, columns and cells - * that have been marked as selected by the end user (`{selected: true}`), - * which can be used in conjunction with the existing built in selector - * options. - * - * Each property is an array to which functions can be pushed. The functions - * take three attributes: - * - * * Settings object for the host table - * * Options object (`selector-modifier` object type) - * * Array of selected item indexes - * - * The return is an array of the resulting item indexes after the custom - * selector has been applied. - * - * @type object - */ - selector: { - cell: [], - column: [], - row: [] - }, - - - /** - * Internal functions, exposed for used in plug-ins. - * - * Please note that you should not need to use the internal methods for - * anything other than a plug-in (and even then, try to avoid if possible). - * The internal function may change between releases. - * - * @type object - * @default {} - */ - internal: {}, - - - /** - * Legacy configuration options. Enable and disable legacy options that - * are available in DataTables. - * - * @type object - */ - legacy: { - /** - * Enable / disable DataTables 1.9 compatible server-side processing - * requests - * - * @type boolean - * @default null - */ - ajax: null - }, - - - /** - * Pagination plug-in methods. - * - * Each entry in this object is a function and defines which buttons should - * be shown by the pagination rendering method that is used for the table: - * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the - * buttons are displayed in the document, while the functions here tell it - * what buttons to display. This is done by returning an array of button - * descriptions (what each button will do). - * - * Pagination types (the four built in options and any additional plug-in - * options defined here) can be used through the `paginationType` - * initialisation parameter. - * - * The functions defined take two parameters: - * - * 1. `{int} page` The current page index - * 2. `{int} pages` The number of pages in the table - * - * Each function is expected to return an array where each element of the - * array can be one of: - * - * * `first` - Jump to first page when activated - * * `last` - Jump to last page when activated - * * `previous` - Show previous page when activated - * * `next` - Show next page when activated - * * `{int}` - Show page of the index given - * * `{array}` - A nested array containing the above elements to add a - * containing 'DIV' element (might be useful for styling). - * - * Note that DataTables v1.9- used this object slightly differently whereby - * an object with two functions would be defined for each plug-in. That - * ability is still supported by DataTables 1.10+ to provide backwards - * compatibility, but this option of use is now decremented and no longer - * documented in DataTables 1.10+. - * - * @type object - * @default {} - * - * @example - * // Show previous, next and current page buttons only - * $.fn.dataTableExt.oPagination.current = function ( page, pages ) { - * return [ 'previous', page, 'next' ]; - * }; - */ - pager: {}, - - - renderer: { - pageButton: {}, - header: {} - }, - - - /** - * Ordering plug-ins - custom data source - * - * The extension options for ordering of data available here is complimentary - * to the default type based ordering that DataTables typically uses. It - * allows much greater control over the the data that is being used to - * order a column, but is necessarily therefore more complex. - * - * This type of ordering is useful if you want to do ordering based on data - * live from the DOM (for example the contents of an 'input' element) rather - * than just the static string that DataTables knows of. - * - * The way these plug-ins work is that you create an array of the values you - * wish to be ordering for the column in question and then return that - * array. The data in the array much be in the index order of the rows in - * the table (not the currently ordering order!). Which order data gathering - * function is run here depends on the `dt-init columns.orderDataType` - * parameter that is used for the column (if any). - * - * The functions defined take two parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{int}` Target column index - * - * Each function is expected to return an array: - * - * * `{array}` Data for the column to be ordering upon - * - * @type array - * - * @example - * // Ordering using `input` node values - * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col ) - * { - * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { - * return $('input', td).val(); - * } ); - * } - */ - order: {}, - - - /** - * Type based plug-ins. - * - * Each column in DataTables has a type assigned to it, either by automatic - * detection or by direct assignment using the `type` option for the column. - * The type of a column will effect how it is ordering and search (plug-ins - * can also make use of the column type if required). - * - * @namespace - */ - type: { - /** - * Type detection functions. - * - * The functions defined in this object are used to automatically detect - * a column's type, making initialisation of DataTables super easy, even - * when complex data is in the table. - * - * The functions defined take two parameters: - * - * 1. `{*}` Data from the column cell to be analysed - * 2. `{settings}` DataTables settings object. This can be used to - * perform context specific type detection - for example detection - * based on language settings such as using a comma for a decimal - * place. Generally speaking the options from the settings will not - * be required - * - * Each function is expected to return: - * - * * `{string|null}` Data type detected, or null if unknown (and thus - * pass it on to the other type detection functions. - * - * @type array - * - * @example - * // Currency type detection plug-in: - * $.fn.dataTable.ext.type.detect.push( - * function ( data, settings ) { - * // Check the numeric part - * if ( ! data.substring(1).match(/[0-9]/) ) { - * return null; - * } - * - * // Check prefixed by currency - * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) { - * return 'currency'; - * } - * return null; - * } - * ); - */ - detect: [], - - - /** - * Type based search formatting. - * - * The type based searching functions can be used to pre-format the - * data to be search on. For example, it can be used to strip HTML - * tags or to de-format telephone numbers for numeric only searching. - * - * Note that is a search is not defined for a column of a given type, - * no search formatting will be performed. - * - * Pre-processing of searching data plug-ins - When you assign the sType - * for a column (or have it automatically detected for you by DataTables - * or a type detection plug-in), you will typically be using this for - * custom sorting, but it can also be used to provide custom searching - * by allowing you to pre-processing the data and returning the data in - * the format that should be searched upon. This is done by adding - * functions this object with a parameter name which matches the sType - * for that target column. This is the corollary of afnSortData - * for searching data. - * - * The functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for searching - * - * Each function is expected to return: - * - * * `{string|null}` Formatted string that will be used for the searching. - * - * @type object - * @default {} - * - * @example - * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) { - * return d.replace(/\n/g," ").replace( /<.*?>/g, "" ); - * } - */ - search: {}, - - - /** - * Type based ordering. - * - * The column type tells DataTables what ordering to apply to the table - * when a column is sorted upon. The order for each type that is defined, - * is defined by the functions available in this object. - * - * Each ordering option can be described by three properties added to - * this object: - * - * * `{type}-pre` - Pre-formatting function - * * `{type}-asc` - Ascending order function - * * `{type}-desc` - Descending order function - * - * All three can be used together, only `{type}-pre` or only - * `{type}-asc` and `{type}-desc` together. It is generally recommended - * that only `{type}-pre` is used, as this provides the optimal - * implementation in terms of speed, although the others are provided - * for compatibility with existing Javascript sort functions. - * - * `{type}-pre`: Functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for ordering - * - * And return: - * - * * `{*}` Data to be sorted upon - * - * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort - * functions, taking two parameters: - * - * 1. `{*}` Data to compare to the second parameter - * 2. `{*}` Data to compare to the first parameter - * - * And returning: - * - * * `{*}` Ordering match: <0 if first parameter should be sorted lower - * than the second parameter, ===0 if the two parameters are equal and - * >0 if the first parameter should be sorted height than the second - * parameter. - * - * @type object - * @default {} - * - * @example - * // Numeric ordering of formatted numbers with a pre-formatter - * $.extend( $.fn.dataTable.ext.type.order, { - * "string-pre": function(x) { - * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" ); - * return parseFloat( a ); - * } - * } ); - * - * @example - * // Case-sensitive string ordering, with no pre-formatting method - * $.extend( $.fn.dataTable.ext.order, { - * "string-case-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-case-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - */ - order: {} - }, - - /** - * Unique DataTables instance counter - * - * @type int - * @private - */ - _unique: 0, - - - // - // Depreciated - // The following properties are retained for backwards compatiblity only. - // The should not be used in new projects and will be removed in a future - // version - // - - /** - * Version check function. - * @type function - * @depreciated Since 1.10 - */ - fnVersionCheck: DataTable.fnVersionCheck, - - - /** - * Index for what 'this' index API functions should use - * @type int - * @deprecated Since v1.10 - */ - iApiIndex: 0, - - - /** - * jQuery UI class container - * @type object - * @deprecated Since v1.10 - */ - oJUIClasses: {}, - - - /** - * Software version - * @type string - * @deprecated Since v1.10 - */ - sVersion: DataTable.version - }; - - - // - // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts - // - $.extend( _ext, { - afnFiltering: _ext.search, - aTypes: _ext.type.detect, - ofnSearch: _ext.type.search, - oSort: _ext.type.order, - afnSortData: _ext.order, - aoFeatures: _ext.feature, - oApi: _ext.internal, - oStdClasses: _ext.classes, - oPagination: _ext.pager - } ); - - - $.extend( DataTable.ext.classes, { - "sTable": "dataTable", - "sNoFooter": "no-footer", - - /* Paging buttons */ - "sPageButton": "paginate_button", - "sPageButtonActive": "current", - "sPageButtonDisabled": "disabled", - - /* Striping classes */ - "sStripeOdd": "odd", - "sStripeEven": "even", - - /* Empty row */ - "sRowEmpty": "dataTables_empty", - - /* Features */ - "sWrapper": "dataTables_wrapper", - "sFilter": "dataTables_filter", - "sInfo": "dataTables_info", - "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ - "sLength": "dataTables_length", - "sProcessing": "dataTables_processing", - - /* Sorting */ - "sSortAsc": "sorting_asc", - "sSortDesc": "sorting_desc", - "sSortable": "sorting", /* Sortable in both directions */ - "sSortableAsc": "sorting_asc_disabled", - "sSortableDesc": "sorting_desc_disabled", - "sSortableNone": "sorting_disabled", - "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ - - /* Filtering */ - "sFilterInput": "", - - /* Page length */ - "sLengthSelect": "", - - /* Scrolling */ - "sScrollWrapper": "dataTables_scroll", - "sScrollHead": "dataTables_scrollHead", - "sScrollHeadInner": "dataTables_scrollHeadInner", - "sScrollBody": "dataTables_scrollBody", - "sScrollFoot": "dataTables_scrollFoot", - "sScrollFootInner": "dataTables_scrollFootInner", - - /* Misc */ - "sHeaderTH": "", - "sFooterTH": "", - - // Deprecated - "sSortJUIAsc": "", - "sSortJUIDesc": "", - "sSortJUI": "", - "sSortJUIAscAllowed": "", - "sSortJUIDescAllowed": "", - "sSortJUIWrapper": "", - "sSortIcon": "", - "sJUIHeader": "", - "sJUIFooter": "" - } ); - - - var extPagination = DataTable.ext.pager; - - function _numbers ( page, pages ) { - var - numbers = [], - buttons = extPagination.numbers_length, - half = Math.floor( buttons / 2 ), - i = 1; - - if ( pages <= buttons ) { - numbers = _range( 0, pages ); - } - else if ( page <= half ) { - numbers = _range( 0, buttons-2 ); - numbers.push( 'ellipsis' ); - numbers.push( pages-1 ); - } - else if ( page >= pages - 1 - half ) { - numbers = _range( pages-(buttons-2), pages ); - numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6 - numbers.splice( 0, 0, 0 ); - } - else { - numbers = _range( page-half+2, page+half-1 ); - numbers.push( 'ellipsis' ); - numbers.push( pages-1 ); - numbers.splice( 0, 0, 'ellipsis' ); - numbers.splice( 0, 0, 0 ); - } - - numbers.DT_el = 'span'; - return numbers; - } - - - $.extend( extPagination, { - simple: function ( page, pages ) { - return [ 'previous', 'next' ]; - }, - - full: function ( page, pages ) { - return [ 'first', 'previous', 'next', 'last' ]; - }, - - numbers: function ( page, pages ) { - return [ _numbers(page, pages) ]; - }, - - simple_numbers: function ( page, pages ) { - return [ 'previous', _numbers(page, pages), 'next' ]; - }, - - full_numbers: function ( page, pages ) { - return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ]; - }, - - first_last_numbers: function (page, pages) { - return ['first', _numbers(page, pages), 'last']; - }, - - // For testing and plug-ins to use - _numbers: _numbers, - - // Number of number buttons (including ellipsis) to show. _Must be odd!_ - numbers_length: 7 - } ); - - - $.extend( true, DataTable.ext.renderer, { - pageButton: { - _: function ( settings, host, idx, buttons, page, pages ) { - var classes = settings.oClasses; - var lang = settings.oLanguage.oPaginate; - var aria = settings.oLanguage.oAria.paginate || {}; - var btnDisplay, btnClass, counter=0; - - var attach = function( container, buttons ) { - var i, ien, node, button, tabIndex; - var disabledClass = classes.sPageButtonDisabled; - var clickHandler = function ( e ) { - _fnPageChange( settings, e.data.action, true ); - }; - - for ( i=0, ien=buttons.length ; i' ) - .appendTo( container ); - attach( inner, button ); - } - else { - btnDisplay = null; - btnClass = button; - tabIndex = settings.iTabIndex; - - switch ( button ) { - case 'ellipsis': - container.append(''); - break; - - case 'first': - btnDisplay = lang.sFirst; - - if ( page === 0 ) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - case 'previous': - btnDisplay = lang.sPrevious; - - if ( page === 0 ) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - case 'next': - btnDisplay = lang.sNext; - - if ( pages === 0 || page === pages-1 ) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - case 'last': - btnDisplay = lang.sLast; - - if ( page === pages-1 ) { - tabIndex = -1; - btnClass += ' ' + disabledClass; - } - break; - - default: - btnDisplay = button + 1; - btnClass = page === button ? - classes.sPageButtonActive : ''; - break; - } - - if ( btnDisplay !== null ) { - node = $('', { - 'class': classes.sPageButton+' '+btnClass, - 'aria-controls': settings.sTableId, - 'aria-label': aria[ button ], - 'data-dt-idx': counter, - 'tabindex': tabIndex, - 'id': idx === 0 && typeof button === 'string' ? - settings.sTableId +'_'+ button : - null - } ) - .html( btnDisplay ) - .appendTo( container ); - - _fnBindAction( - node, {action: button}, clickHandler - ); - - counter++; - } - } - } - }; - - // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. Try / catch the error. Not good for - // accessibility, but neither are frames. - var activeEl; - - try { - // Because this approach is destroying and recreating the paging - // elements, focus is lost on the select button which is bad for - // accessibility. So we want to restore focus once the draw has - // completed - activeEl = $(host).find(document.activeElement).data('dt-idx'); - } - catch (e) {} - - attach( $(host).empty(), buttons ); - - if ( activeEl !== undefined ) { - $(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus'); - } - } - } - } ); - - - - // Built in type detection. See model.ext.aTypes for information about - // what is required from this methods. - $.extend( DataTable.ext.type.detect, [ - // Plain numbers - first since V8 detects some plain numbers as dates - // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...). - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _isNumber( d, decimal ) ? 'num'+decimal : null; - }, - - // Dates (only those recognised by the browser's Date.parse) - function ( d, settings ) - { - // V8 tries _very_ hard to make a string passed into `Date.parse()` - // valid, so we need to use a regex to restrict date formats. Use a - // plug-in for anything other than ISO8601 style strings - if ( d && !(d instanceof Date) && ! _re_date.test(d) ) { - return null; - } - var parsed = Date.parse(d); - return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null; - }, - - // Formatted numbers - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null; - }, - - // HTML numeric - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null; - }, - - // HTML numeric, formatted - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null; - }, - - // HTML (this is strict checking - there must be html) - function ( d, settings ) - { - return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ? - 'html' : null; - } - ] ); - - - - // Filter formatting functions. See model.ext.ofnSearch for information about - // what is required from these methods. - // - // Note that additional search methods are added for the html numbers and - // html formatted numbers by `_addNumericSort()` when we know what the decimal - // place is - - - $.extend( DataTable.ext.type.search, { - html: function ( data ) { - return _empty(data) ? - data : - typeof data === 'string' ? - data - .replace( _re_new_lines, " " ) - .replace( _re_html, "" ) : - ''; - }, - - string: function ( data ) { - return _empty(data) ? - data : - typeof data === 'string' ? - data.replace( _re_new_lines, " " ) : - data; - } - } ); - - - - var __numericReplace = function ( d, decimalPlace, re1, re2 ) { - if ( d !== 0 && (!d || d === '-') ) { - return -Infinity; - } - - // If a decimal place other than `.` is used, it needs to be given to the - // function so we can detect it and replace with a `.` which is the only - // decimal place Javascript recognises - it is not locale aware. - if ( decimalPlace ) { - d = _numToDecimal( d, decimalPlace ); - } - - if ( d.replace ) { - if ( re1 ) { - d = d.replace( re1, '' ); - } - - if ( re2 ) { - d = d.replace( re2, '' ); - } - } - - return d * 1; - }; - - - // Add the numeric 'deformatting' functions for sorting and search. This is done - // in a function to provide an easy ability for the language options to add - // additional methods if a non-period decimal place is used. - function _addNumericSort ( decimalPlace ) { - $.each( - { - // Plain numbers - "num": function ( d ) { - return __numericReplace( d, decimalPlace ); - }, - - // Formatted numbers - "num-fmt": function ( d ) { - return __numericReplace( d, decimalPlace, _re_formatted_numeric ); - }, - - // HTML numeric - "html-num": function ( d ) { - return __numericReplace( d, decimalPlace, _re_html ); - }, - - // HTML numeric, formatted - "html-num-fmt": function ( d ) { - return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric ); - } - }, - function ( key, fn ) { - // Add the ordering method - _ext.type.order[ key+decimalPlace+'-pre' ] = fn; - - // For HTML types add a search formatter that will strip the HTML - if ( key.match(/^html\-/) ) { - _ext.type.search[ key+decimalPlace ] = _ext.type.search.html; - } - } - ); - } - - - // Default sort methods - $.extend( _ext.type.order, { - // Dates - "date-pre": function ( d ) { - var ts = Date.parse( d ); - return isNaN(ts) ? -Infinity : ts; - }, - - // html - "html-pre": function ( a ) { - return _empty(a) ? - '' : - a.replace ? - a.replace( /<.*?>/g, "" ).toLowerCase() : - a+''; - }, - - // string - "string-pre": function ( a ) { - // This is a little complex, but faster than always calling toString, - // http://jsperf.com/tostring-v-check - return _empty(a) ? - '' : - typeof a === 'string' ? - a.toLowerCase() : - ! a.toString ? - '' : - a.toString(); - }, - - // string-asc and -desc are retained only for compatibility with the old - // sort methods - "string-asc": function ( x, y ) { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "string-desc": function ( x, y ) { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - } - } ); - - - // Numeric sorting types - order doesn't matter here - _addNumericSort( '' ); - - - $.extend( true, DataTable.ext.renderer, { - header: { - _: function ( settings, cell, column, classes ) { - // No additional mark-up required - // Attach a sort listener to update on sort - note that using the - // `DT` namespace will allow the event to be removed automatically - // on destroy, while the `dt` namespaced event is the one we are - // listening for - $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { - if ( settings !== ctx ) { // need to check this this is the host - return; // table, not a nested one - } - - var colIdx = column.idx; - - cell - .removeClass( - column.sSortingClass +' '+ - classes.sSortAsc +' '+ - classes.sSortDesc - ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortAsc : columns[ colIdx ] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - } ); - }, - - jqueryui: function ( settings, cell, column, classes ) { - $('
    ') - .addClass( classes.sSortJUIWrapper ) - .append( cell.contents() ) - .append( $('') - .addClass( classes.sSortIcon+' '+column.sSortingClassJUI ) - ) - .appendTo( cell ); - - // Attach a sort listener to update on sort - $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { - if ( settings !== ctx ) { - return; - } - - var colIdx = column.idx; - - cell - .removeClass( classes.sSortAsc +" "+classes.sSortDesc ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortAsc : columns[ colIdx ] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - - cell - .find( 'span.'+classes.sSortIcon ) - .removeClass( - classes.sSortJUIAsc +" "+ - classes.sSortJUIDesc +" "+ - classes.sSortJUI +" "+ - classes.sSortJUIAscAllowed +" "+ - classes.sSortJUIDescAllowed - ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ? - classes.sSortJUIDesc : - column.sSortingClassJUI - ); - } ); - } - } - } ); - - /* - * Public helper functions. These aren't used internally by DataTables, or - * called by any of the options passed into DataTables, but they can be used - * externally by developers working with DataTables. They are helper functions - * to make working with DataTables a little bit easier. - */ - - var __htmlEscapeEntities = function ( d ) { - return typeof d === 'string' ? - d - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') : - d; - }; - - /** - * Helpers for `columns.render`. - * - * The options defined here can be used with the `columns.render` initialisation - * option to provide a display renderer. The following functions are defined: - * - * * `number` - Will format numeric data (defined by `columns.data`) for - * display, retaining the original unformatted data for sorting and filtering. - * It takes 5 parameters: - * * `string` - Thousands grouping separator - * * `string` - Decimal point indicator - * * `integer` - Number of decimal points to show - * * `string` (optional) - Prefix. - * * `string` (optional) - Postfix (/suffix). - * * `text` - Escape HTML to help prevent XSS attacks. It has no optional - * parameters. - * - * @example - * // Column definition using the number renderer - * { - * data: "salary", - * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' ) - * } - * - * @namespace - */ - DataTable.render = { - number: function ( thousands, decimal, precision, prefix, postfix ) { - return { - display: function ( d ) { - if ( typeof d !== 'number' && typeof d !== 'string' ) { - return d; - } - - var negative = d < 0 ? '-' : ''; - var flo = parseFloat( d ); - - // If NaN then there isn't much formatting that we can do - just - // return immediately, escaping any HTML (this was supposed to - // be a number after all) - if ( isNaN( flo ) ) { - return __htmlEscapeEntities( d ); - } - - flo = flo.toFixed( precision ); - d = Math.abs( flo ); - - var intPart = parseInt( d, 10 ); - var floatPart = precision ? - decimal+(d - intPart).toFixed( precision ).substring( 2 ): - ''; - - return negative + (prefix||'') + - intPart.toString().replace( - /\B(?=(\d{3})+(?!\d))/g, thousands - ) + - floatPart + - (postfix||''); - } - }; - }, - - text: function () { - return { - display: __htmlEscapeEntities, - filter: __htmlEscapeEntities - }; - } - }; - - - /* - * This is really a good bit rubbish this method of exposing the internal methods - * publicly... - To be fixed in 2.0 using methods on the prototype - */ - - - /** - * Create a wrapper function for exporting an internal functions to an external API. - * @param {string} fn API function name - * @returns {function} wrapped function - * @memberof DataTable#internal - */ - function _fnExternApiFunc (fn) - { - return function() { - var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat( - Array.prototype.slice.call(arguments) - ); - return DataTable.ext.internal[fn].apply( this, args ); - }; - } - - - /** - * Reference to internal functions for use by plug-in developers. Note that - * these methods are references to internal functions and are considered to be - * private. If you use these methods, be aware that they are liable to change - * between versions. - * @namespace - */ - $.extend( DataTable.ext.internal, { - _fnExternApiFunc: _fnExternApiFunc, - _fnBuildAjax: _fnBuildAjax, - _fnAjaxUpdate: _fnAjaxUpdate, - _fnAjaxParameters: _fnAjaxParameters, - _fnAjaxUpdateDraw: _fnAjaxUpdateDraw, - _fnAjaxDataSrc: _fnAjaxDataSrc, - _fnAddColumn: _fnAddColumn, - _fnColumnOptions: _fnColumnOptions, - _fnAdjustColumnSizing: _fnAdjustColumnSizing, - _fnVisibleToColumnIndex: _fnVisibleToColumnIndex, - _fnColumnIndexToVisible: _fnColumnIndexToVisible, - _fnVisbleColumns: _fnVisbleColumns, - _fnGetColumns: _fnGetColumns, - _fnColumnTypes: _fnColumnTypes, - _fnApplyColumnDefs: _fnApplyColumnDefs, - _fnHungarianMap: _fnHungarianMap, - _fnCamelToHungarian: _fnCamelToHungarian, - _fnLanguageCompat: _fnLanguageCompat, - _fnBrowserDetect: _fnBrowserDetect, - _fnAddData: _fnAddData, - _fnAddTr: _fnAddTr, - _fnNodeToDataIndex: _fnNodeToDataIndex, - _fnNodeToColumnIndex: _fnNodeToColumnIndex, - _fnGetCellData: _fnGetCellData, - _fnSetCellData: _fnSetCellData, - _fnSplitObjNotation: _fnSplitObjNotation, - _fnGetObjectDataFn: _fnGetObjectDataFn, - _fnSetObjectDataFn: _fnSetObjectDataFn, - _fnGetDataMaster: _fnGetDataMaster, - _fnClearTable: _fnClearTable, - _fnDeleteIndex: _fnDeleteIndex, - _fnInvalidate: _fnInvalidate, - _fnGetRowElements: _fnGetRowElements, - _fnCreateTr: _fnCreateTr, - _fnBuildHead: _fnBuildHead, - _fnDrawHead: _fnDrawHead, - _fnDraw: _fnDraw, - _fnReDraw: _fnReDraw, - _fnAddOptionsHtml: _fnAddOptionsHtml, - _fnDetectHeader: _fnDetectHeader, - _fnGetUniqueThs: _fnGetUniqueThs, - _fnFeatureHtmlFilter: _fnFeatureHtmlFilter, - _fnFilterComplete: _fnFilterComplete, - _fnFilterCustom: _fnFilterCustom, - _fnFilterColumn: _fnFilterColumn, - _fnFilter: _fnFilter, - _fnFilterCreateSearch: _fnFilterCreateSearch, - _fnEscapeRegex: _fnEscapeRegex, - _fnFilterData: _fnFilterData, - _fnFeatureHtmlInfo: _fnFeatureHtmlInfo, - _fnUpdateInfo: _fnUpdateInfo, - _fnInfoMacros: _fnInfoMacros, - _fnInitialise: _fnInitialise, - _fnInitComplete: _fnInitComplete, - _fnLengthChange: _fnLengthChange, - _fnFeatureHtmlLength: _fnFeatureHtmlLength, - _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate, - _fnPageChange: _fnPageChange, - _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing, - _fnProcessingDisplay: _fnProcessingDisplay, - _fnFeatureHtmlTable: _fnFeatureHtmlTable, - _fnScrollDraw: _fnScrollDraw, - _fnApplyToChildren: _fnApplyToChildren, - _fnCalculateColumnWidths: _fnCalculateColumnWidths, - _fnThrottle: _fnThrottle, - _fnConvertToWidth: _fnConvertToWidth, - _fnGetWidestNode: _fnGetWidestNode, - _fnGetMaxLenString: _fnGetMaxLenString, - _fnStringToCss: _fnStringToCss, - _fnSortFlatten: _fnSortFlatten, - _fnSort: _fnSort, - _fnSortAria: _fnSortAria, - _fnSortListener: _fnSortListener, - _fnSortAttachListener: _fnSortAttachListener, - _fnSortingClasses: _fnSortingClasses, - _fnSortData: _fnSortData, - _fnSaveState: _fnSaveState, - _fnLoadState: _fnLoadState, - _fnSettingsFromNode: _fnSettingsFromNode, - _fnLog: _fnLog, - _fnMap: _fnMap, - _fnBindAction: _fnBindAction, - _fnCallbackReg: _fnCallbackReg, - _fnCallbackFire: _fnCallbackFire, - _fnLengthOverflow: _fnLengthOverflow, - _fnRenderer: _fnRenderer, - _fnDataSource: _fnDataSource, - _fnRowAttributes: _fnRowAttributes, - _fnExtend: _fnExtend, - _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant - // in 1.10, so this dead-end function is - // added to prevent errors - } ); - - - // jQuery access - $.fn.dataTable = DataTable; - - // Provide access to the host jQuery object (circular reference) - DataTable.$ = $; - - // Legacy aliases - $.fn.dataTableSettings = DataTable.settings; - $.fn.dataTableExt = DataTable.ext; - - // With a capital `D` we return a DataTables API instance rather than a - // jQuery object - $.fn.DataTable = function ( opts ) { - return $(this).dataTable( opts ).api(); - }; - - // All properties that are available to $.fn.dataTable should also be - // available on $.fn.DataTable - $.each( DataTable, function ( prop, val ) { - $.fn.DataTable[ prop ] = val; - } ); - - - // Information about events fired by DataTables - for documentation. - /** - * Draw event, fired whenever the table is redrawn on the page, at the same - * point as fnDrawCallback. This may be useful for binding events or - * performing calculations when the table is altered at all. - * @name DataTable#draw.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Search event, fired when the searching applied to the table (using the - * built-in global search, or column filters) is altered. - * @name DataTable#search.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Page change event, fired when the paging of the table is altered. - * @name DataTable#page.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Order event, fired when the ordering applied to the table is altered. - * @name DataTable#order.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * DataTables initialisation complete event, fired when the table is fully - * drawn, including Ajax data loaded, if Ajax data is required. - * @name DataTable#init.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - */ - - /** - * State save event, fired when the table has changed state a new state save - * is required. This event allows modification of the state saving object - * prior to actually doing the save, including addition or other state - * properties (for plug-ins) or modification of a DataTables core property. - * @name DataTable#stateSaveParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The state information to be saved - */ - - /** - * State load event, fired when the table is loading state from the stored - * data, but prior to the settings object being modified by the saved state - * - allowing modification of the saved state is required or loading of - * state for a plug-in. - * @name DataTable#stateLoadParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * State loaded event, fired when state has been loaded from stored data and - * the settings object has been modified by the loaded data. - * @name DataTable#stateLoaded.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * Processing event, fired when DataTables is doing some kind of processing - * (be it, order, search or anything else). It can be used to indicate to - * the end user that there is something happening, or that something has - * finished. - * @name DataTable#processing.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {boolean} bShow Flag for if DataTables is doing processing or not - */ - - /** - * Ajax (XHR) event, fired whenever an Ajax request is completed from a - * request to made to the server for new data. This event is called before - * DataTables processed the returned data, so it can also be used to pre- - * process the data returned from the server, if needed. - * - * Note that this trigger is called in `fnServerData`, if you override - * `fnServerData` and which to use this event, you need to trigger it in you - * success function. - * @name DataTable#xhr.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - * @param {object} json JSON returned from the server - * - * @example - * // Use a custom property returned from the server in another DOM element - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * $('#status').html( json.status ); - * } ); - * - * @example - * // Pre-process the data returned from the server - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * for ( var i=0, ien=json.aaData.length ; i { Console.WriteLine($"Connection from {context.Connection.RemoteIpAddress}"); - + // get list of moneylines using var con = new SqlConnection(connString); con.Open(); @@ -39,11 +39,11 @@ app.MapGet("/", async context => { List games = new List(); while(rows.Read()) { var game = new Game((int)rows.GetValue(0), - (string)rows.GetValue(1), - (int)rows.GetValue(2), - (int)rows.GetValue(3), - (string)rows.GetValue(4), - (int)rows.GetValue(5), + (string)rows.GetValue(1), + (int)rows.GetValue(2), + (int)rows.GetValue(3), + (string)rows.GetValue(4), + (int)rows.GetValue(5), (DateTime)rows.GetValue(6)); games.Add(game); } @@ -72,13 +72,13 @@ app.MapGet("/", async context => { sbHtml.Append(string.Format(Radio, g.MoneyLineID, g.HomeCountry, "W", g.HomeCountryOdds)); sbHtml.Append(g.HomeCountry + " " + g.HomeCountryOdds); sbHtml.Append(EndTD); - + // Draw sbHtml.Append(TD); sbHtml.Append(string.Format(Radio, g.MoneyLineID, g.HomeCountry, "D", g.DrawOdds)); sbHtml.Append("Draw " + g.DrawOdds); sbHtml.Append(EndTD); - + // Loss sbHtml.Append(TD); sbHtml.Append(string.Format(Radio, g.MoneyLineID, g.HomeCountry, "L", g.VisitCountryOdds)); @@ -104,7 +104,7 @@ app.MapGet("/placebet", async context => { string moneyline = context.Request.Query["bet"]; string name = "Pieter Vanhove"; Console.WriteLine($"Request for bet from {name} for {amount} on {moneyline}"); - + string fName = "", lName = ""; string Country = "", result = ""; var odds = 0; @@ -123,7 +123,7 @@ app.MapGet("/placebet", async context => { ref result, ref odds, ref amount2)) { - await context.Response.WriteAsync(htmlError); + await context.Response.WriteAsync(htmlError); } else { var cs = connString; @@ -231,7 +231,7 @@ string? GetLedgerDigest(SqlConnection con) { } /* NOT USED -// sign some data, this creates real signatures, +// sign some data, this creates real signatures, // but the keys are ephemeral for demo purposes only string SignBlob(string text) { const string CRYPTO_VERSION = "01"; diff --git a/samples/features/security/ledger/source/WorldCup/Scripts/Create Database Schema.sql b/samples/features/security/ledger/source/WorldCup/Scripts/Create Database Schema.sql index 22d386c3..c11eb48d 100644 --- a/samples/features/security/ledger/source/WorldCup/Scripts/Create Database Schema.sql +++ b/samples/features/security/ledger/source/WorldCup/Scripts/Create Database Schema.sql @@ -13,16 +13,16 @@ CREATE TABLE [dbo].[MoneyLine]( [VisitCountryOdds] [INT] NOT NULL, [GameDateTime] [datetime2] NOT NULL ) -WITH +WITH ( SYSTEM_VERSIONING = ON, LEDGER = ON -); +); GO --https://sportsbook.draftkings.com/leagues/soccer/world-cup-2022?category=game-lines&subcategory=moneyline-(regular-time) -INSERT INTO [dbo].[MoneyLine] ([HomeCountry], [HomeCountryOdds], [DrawOdds], [VisitCountry],[VisitCountryOdds],[GameDateTime]) +INSERT INTO [dbo].[MoneyLine] ([HomeCountry], [HomeCountryOdds], [DrawOdds], [VisitCountry],[VisitCountryOdds],[GameDateTime]) VALUES ('Qatar', 250, 245, 'Ecuador',105,'2022-11-20 17:00:00'), ('England', -340, 390, 'Iran', 1000, '2022-11-21 14:00:00' ), ('Senegal', 475, 270, 'Netherlands',-165, '2022-11-21 17:00:00'), @@ -76,7 +76,7 @@ CREATE TABLE [dbo].[Bets]( WITH (LEDGER = ON (APPEND_ONLY = ON)); GO -CREATE FUNCTION fn_CalucatePayout +CREATE FUNCTION fn_CalucatePayout ( -- Add the parameters for the function here @Stake decimal(8,2), @Odds decimal(8,2) @@ -102,7 +102,7 @@ GO -- Calculating Payouts From Positive Moneyline Odds ---- Potential Profit = Stake x (Odds/100) + Stake -- Calculating Payouts From Negative Moneyline Odds ---- Potential Profit = Stake / (Odds/100) + Stake -CREATE PROCEDURE usp_PlaceBet +CREATE PROCEDURE usp_PlaceBet @MoneylineID INT, @FirstName NVARCHAR(50), @LastName NVARCHAR(50), @@ -124,9 +124,9 @@ GO */ -CREATE CREDENTIAL [https://ledgerdemostg.blob.core.windows.net/sqldbledgerdigests] -WITH IDENTITY='SHARED ACCESS SIGNATURE', -SECRET = 'st=2022-10-18T13:24:48Z&se=2023-10-18T21:24:48Z&si=Ledger&spr=https&sv=2021-06-08&sr=c&sig=KhSroFrZ4HHUn%2B7LldOljrTWqPueV72heqYoaFFjfUk%3D' +CREATE CREDENTIAL [https://ledgerdemostg.blob.core.windows.net/sqldbledgerdigests] +WITH IDENTITY='SHARED ACCESS SIGNATURE', +SECRET = 'st=2022-10-18T13:24:48Z&se=2023-10-18T21:24:48Z&si=Ledger&spr=https&sv=2021-06-08&sr=c&sig=KhSroFrZ4HHUn%2B7LldOljrTWqPueV72heqYoaFFjfUk%3D' GO ALTER DATABASE SCOPED CONFIGURATION SET LEDGER_DIGEST_STORAGE_ENDPOINT = 'https://ledgerdemostg.blob.core.windows.net'; @@ -134,7 +134,7 @@ ALTER DATABASE SCOPED CONFIGURATION GO CREATE PROCEDURE sp_TamperWithBet - @PageID int, + @PageID int, @ID int, @PayOut money AS @@ -143,7 +143,7 @@ SET NOCOUNT ON; DROP TABLE IF EXISTS #DBCCPAGE - CREATE TABLE #DBCCPAGE + CREATE TABLE #DBCCPAGE (ParentObject NVARCHAR(128), Object NVARCHAR(128), Field NVARCHAR(128), @@ -159,17 +159,17 @@ INSERT INTO #dbccpage EXEC('DBCC TRACEON(3604) WITH NO_INFOMSGS; DBCC PAGE(' + @DBName + ', 1, ' + @PageID + ', 3) WITH NO_INFOMSGS,TABLERESULTS '); -WITH DBCCPAGE_Offset_PayOut (ParentObject,Object,Field,Value) -AS - -( +WITH DBCCPAGE_Offset_PayOut (ParentObject,Object,Field,Value) +AS + +( SELECT ParentObject, Object, Field,Value FROM #DBCCPAGE - WHERE ParentObject=(SELECT ParentObject FROM #DBCCPAGE WHERE Field='BetID' AND Value=@ID) -) + WHERE ParentObject=(SELECT ParentObject FROM #DBCCPAGE WHERE Field='BetID' AND Value=@ID) +) SELECT @OffsetPayOut= CONVERT(INT,CONVERT(VARBINARY,'0x'+ REPLICATE('0', 8-LEN(SUBSTRING(ParentObject,CHARINDEX('0x',ParentObject)+2,CHARINDEX('Length',ParentObject)-CHARINDEX('0x',ParentObject)-3)))+SUBSTRING(ParentObject,CHARINDEX('0x',ParentObject)+2,CHARINDEX('Length',ParentObject)-CHARINDEX('0x',ParentObject)-3),1)) + CONVERT(INT,CONVERT(VARBINARY,'0x'+ REPLICATE('0', 8-LEN(SUBSTRING(Object,CHARINDEX('0x',Object)+2,CHARINDEX('Length',Object)-charindex('0x',Object)-3)))+SUBSTRING(Object,CHARINDEX('0x',Object)+2,CHARINDEX('Length',Object)-CHARINDEX('0x',Object)-3),1)) -FROM DBCCPAGE_Offset_PayOut +FROM DBCCPAGE_Offset_PayOut WHERE Field='Payout'; DECLARE @BinaryPayout VARBINARY(8) = CONVERT(binary(8), REVERSE(CONVERT(VARBINARY(8), @Payout))) diff --git a/samples/features/security/ledger/source/WorldCup/indexStart.html b/samples/features/security/ledger/source/WorldCup/indexStart.html index 7e8a7c9d..cb1b9570 100644 --- a/samples/features/security/ledger/source/WorldCup/indexStart.html +++ b/samples/features/security/ledger/source/WorldCup/indexStart.html @@ -19,14 +19,14 @@ });

    Hello
    Pieter Vanhove

    - +
    - +

    Pieter Vanhove

    - +

    - +
    @@ -45,7 +45,7 @@ - + --> diff --git a/samples/features/security/ledger/sql-server/README.md b/samples/features/security/ledger/sql-server/README.md index ffbd0b59..c4189b4f 100644 --- a/samples/features/security/ledger/sql-server/README.md +++ b/samples/features/security/ledger/sql-server/README.md @@ -107,7 +107,7 @@ Perform the below steps before you show the demo. 1. Pieter has been asked to change the Home Country Odds for the game with ID 1. Run `code cell 2` in the Notebook to update the record. 1. Run `code cell 3` in the Notebook to show the history of the updated record. Explain that updates are stored as 2 records in the history table. A delete of the old version and an insert of the new version of the row. -1. Show how append-only ledger table works and how ledger helps investigate tampering by DBAs. +1. Show how append-only ledger table works and how ledger helps investigate tampering by DBAs. 1. Michael, who is an internal auditor, performs a routine review of changes in the Worldcup database. As his first step, Michael runs the ledger verification to be sure he can trust the data he’s going to examine. Run `code cell 4` to execute the verification stored procedure. The result should be "Ledger verification succeeded." 1. Pieter wants to maliciously increase his payout for the game he betted on. Run `code cell 5 and 6` to try to update the record. Explain that update on an append-only ledger table is blocked. 1. Pieter thinks he's smart and tampers with the data directly into the data file by using a stored procedure. **DO NOT RUN** `code cell 7` because the stored procedure does not exists. diff --git a/samples/features/security/ledger/sql-server/setup/CreateDatabaseSchemaAndPopulateDatabase.sql b/samples/features/security/ledger/sql-server/setup/CreateDatabaseSchemaAndPopulateDatabase.sql index ad01653a..e9b68b66 100644 --- a/samples/features/security/ledger/sql-server/setup/CreateDatabaseSchemaAndPopulateDatabase.sql +++ b/samples/features/security/ledger/sql-server/setup/CreateDatabaseSchemaAndPopulateDatabase.sql @@ -6,7 +6,7 @@ GO USE WorldCup GO ---Enable Automatic Digest Storage +--Enable Automatic Digest Storage --REPLACE with the name of your Azure storage account. ALTER DATABASE SCOPED CONFIGURATION SET LEDGER_DIGEST_STORAGE_ENDPOINT = 'https://.blob.core.windows.net'; @@ -21,16 +21,16 @@ CREATE TABLE [dbo].[MoneyLine]( [VisitCountryOdds] [INT] NOT NULL, [GameDateTime] [datetime2] NOT NULL ) -WITH +WITH ( SYSTEM_VERSIONING = ON, LEDGER = ON -); +); GO --Populate the MoneyLine table -INSERT INTO [dbo].[MoneyLine] ([HomeCountry], [HomeCountryOdds], [DrawOdds], [VisitCountry],[VisitCountryOdds],[GameDateTime]) +INSERT INTO [dbo].[MoneyLine] ([HomeCountry], [HomeCountryOdds], [DrawOdds], [VisitCountry],[VisitCountryOdds],[GameDateTime]) VALUES ('Qatar', 250, 245, 'Ecuador',105,'2022-11-20 17:00:00'), ('England', -340, 390, 'Iran', 1000, '2022-11-21 14:00:00' ), ('Senegal', 475, 270, 'Netherlands',-165, '2022-11-21 17:00:00'), @@ -88,7 +88,7 @@ GO -- Create a function to calculate the Payout -- Calculating Payouts From Positive Moneyline Odds ---- Potential Profit = Stake x (Odds/100) + Stake -- Calculating Payouts From Negative Moneyline Odds ---- Potential Profit = Stake / (Odds/100) + Stake -CREATE FUNCTION fn_CalculatePayout +CREATE FUNCTION fn_CalculatePayout ( -- Add the parameters for the function here @Stake decimal(8,2), @Odds decimal(8,2) @@ -113,7 +113,7 @@ GO -- Create a stored procedure to place a bet -CREATE PROCEDURE usp_PlaceBet +CREATE PROCEDURE usp_PlaceBet @MoneylineID INT, @FirstName NVARCHAR(50), @LastName NVARCHAR(50), diff --git a/samples/features/sql-big-data-cluster/README.md b/samples/features/sql-big-data-cluster/README.md index f141aad7..e4c1051d 100644 --- a/samples/features/sql-big-data-cluster/README.md +++ b/samples/features/sql-big-data-cluster/README.md @@ -30,7 +30,7 @@ The sample script [data-pool/data-ingestion-sql.sql](data-pool/data-ingestion-sq ## __[data-virtualization](data-virtualization/)__ -SQL Server 2019 or SQL Server 2019 big data cluster can use PolyBase external tables to connect to other data sources. +SQL Server 2019 or SQL Server 2019 big data cluster can use PolyBase external tables to connect to other data sources. ### External table over Generic ODBC data source The [data-virtualization/generic-odbc](data-virtualization/generic-odbc) folder contains samples that demonstrate how to query data in MySQL & PostgreSQL using external tables and generic ODBC data source. The generic ODBC data soruce can be used only in SQL Server 2019 on Windows. diff --git a/samples/features/sql-big-data-cluster/app-deploy/README.md b/samples/features/sql-big-data-cluster/app-deploy/README.md index 521be989..7580f36b 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/README.md +++ b/samples/features/sql-big-data-cluster/app-deploy/README.md @@ -9,7 +9,7 @@ Application deployment allows you to deploy applications into SQL Server big dat * SQL Server big data cluster CTP 2.3 or later * `azdata` CLI familiarity. If you are unfamiliar with `azdata` please refer to - [App Deployment in SQL Server big data cluster](https://docs.microsoft.com/en-us/sql/big-data-cluster/big-data-cluster-create-apps) for more information. -* Tip +* Tip **azdata app -h** will display the various commands to manage the app ## Templates @@ -17,7 +17,7 @@ Templates are used by our [App Deploy add-ins](https://docs.microsoft.com/en-us/ > Looking for our templates? See [the SQLBDC-AppDeploy repo](https://github.com/Microsoft/SQLBDC-AppDeploy). ## Available samples -### Python +### Python These samples demonstrates how you can deploy a simple Python app into SQL Server big data cluster as container app as web service that is swagger compliant for building your application. |Sample|Description| @@ -25,8 +25,8 @@ These samples demonstrates how you can deploy a simple Python app into SQL Serve |__[addpy](addpy/)__|This sample takes two numbers and returns the sum. This sample also has detailed instructions on how to call apps through a RESTful web service.| |__[magic8ball](magic8ball/)__|Runs a [Magic 8-Ball](https://en.wikipedia.org/wiki/Magic_8-Ball)| -### R -These samples demonstrates how you can deploy a simple R app into SQL Server big data cluster as container app as web service that is swagger compliant for building your application. +### R +These samples demonstrates how you can deploy a simple R app into SQL Server big data cluster as container app as web service that is swagger compliant for building your application. |Sample|Description| |-|-| @@ -35,14 +35,14 @@ These samples demonstrates how you can deploy a simple R app into SQL Server big |__[sumofsq](sumofsq/)__|Returns the sum of squares of two input numbers| -### MLeap +### MLeap |Sample|Description| |-|-| |__[mleap](mleap/)__|This sample demonstrates how you use a MLeap bundle (a Spark model serialized in this format) and run it outside of Spark. The sample is based on the MLeap sample available here http://mleap-docs.combust.ml/mleap-serving/. We are using the MLeap Serving container that is published in Docker Hub. The MLeap Serving is deployed as container in SQL Server big data cluster as a container app with a web service that takes the Leap Frame as the input.| -### Sql Server Integration Services +### Sql Server Integration Services |Sample|Description| |-|-| diff --git a/samples/features/sql-big-data-cluster/app-deploy/RollDice/roll-dice.R b/samples/features/sql-big-data-cluster/app-deploy/RollDice/roll-dice.R index df29ebed..bc5260d8 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/RollDice/roll-dice.R +++ b/samples/features/sql-big-data-cluster/app-deploy/RollDice/roll-dice.R @@ -2,12 +2,12 @@ ##################################################### ## ## Roll dice demo -## +## ## ##################################################### ##################################################### # Note if you choose > 10 as the number of dice the app fails as it is not able to handle Null or N/A which are the default lables for the colors -rollEm <- function(numDice = 2) +rollEm <- function(numDice = 2) { if (numDice < 11) diff --git a/samples/features/sql-big-data-cluster/app-deploy/RollDice/spec.yaml b/samples/features/sql-big-data-cluster/app-deploy/RollDice/spec.yaml index 2053da9f..7b2bcbc8 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/RollDice/spec.yaml +++ b/samples/features/sql-big-data-cluster/app-deploy/RollDice/spec.yaml @@ -8,4 +8,4 @@ poolsize: 1 inputs: x: integer output: - result: data.frame + result: data.frame diff --git a/samples/features/sql-big-data-cluster/app-deploy/SSIS/README.md b/samples/features/sql-big-data-cluster/app-deploy/SSIS/README.md index f4fa2689..3c49a927 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/SSIS/README.md +++ b/samples/features/sql-big-data-cluster/app-deploy/SSIS/README.md @@ -24,7 +24,7 @@ To run this sample, you need the following prerequisites. 1. SQL Server big data cluster CTP 2.3 or later. 2. `azdata`. Refer to [installing azdata](https://docs.microsoft.com/en-us/sql/big-data-cluster/deploy-install-azdata?view=sqlallproducts-allversions) document on setting up the `azdata` and connecting to a SQL Server big data cluster. -3. Optional: to see the SSIS package itself, install Visual Studio 2017 if you don't have it already. After that download and install [SSDT](https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?view=sql-server-2017#ssdt-for-vs-2017-standalone-installer). +3. Optional: to see the SSIS package itself, install Visual Studio 2017 if you don't have it already. After that download and install [SSDT](https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt?view=sql-server-2017#ssdt-for-vs-2017-standalone-installer). 4. Optional: install [SSMS](https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017) if it is not already installed. @@ -65,7 +65,7 @@ To run this sample, you need the following prerequisites. ## Sample details -Please open to [Visual Studio solution](back-up-db.sln) to see the SSIS package. +Please open to [Visual Studio solution](back-up-db.sln) to see the SSIS package. ### Spec file Here is the spec file for this application. This sample uses the `SSIS` runtime and does not specify any `inputs` or `outputs`. Next to that, the spec file in this example specifies `options` and `schedule`: diff --git a/samples/features/sql-big-data-cluster/app-deploy/addpy/README.md b/samples/features/sql-big-data-cluster/app-deploy/addpy/README.md index 4a2f5b7e..ef5453cb 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/addpy/README.md +++ b/samples/features/sql-big-data-cluster/app-deploy/addpy/README.md @@ -74,7 +74,7 @@ To run this sample, you need the following prerequisites. } ``` 6. Any app you create is also accessible using a RESTful web service that is [Swagger](swagger.io) compliant. See: [Consume an app deployed on SQL Server Big Data Clusters using a RESTful web service](https://docs.microsoft.com/en-us/sql/big-data-cluster/app-consume). - + 7. You can clean up the sample by running the following commands: ```bash # delete app diff --git a/samples/features/sql-big-data-cluster/app-deploy/mleap/README.md b/samples/features/sql-big-data-cluster/app-deploy/mleap/README.md index 95398bec..e53b33c6 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/mleap/README.md +++ b/samples/features/sql-big-data-cluster/app-deploy/mleap/README.md @@ -45,7 +45,7 @@ To run this sample, you need the following prerequisites. ``` 3. This example uses a TensorFlow Machine Learning Model that uses public US Census data predict income. [More details and information on the example are here](https://docs.microsoft.com/en-us/sql/big-data-cluster/train-and-create-machinelearning-models-with-spark?view=sqlallproducts-allversions). The application you will be deploying as part of this sample is a Random Forest Model that was built in Spark and has been [serialized as an MLeap bundle](https://docs.microsoft.com/en-us/sql/big-data-cluster/export-model-with-spark-mleap?view=sqlallproducts-allversions). - Deploy the app using the `create` command and pass the location of the spec file. In the example below, the spec file is expected to be in the `mleap` folder: + Deploy the app using the `create` command and pass the location of the spec file. In the example below, the spec file is expected to be in the `mleap` folder: ```bash azdata app create --spec ./mleap/ ``` @@ -56,7 +56,7 @@ To run this sample, you need the following prerequisites. Once the app is listed as `Ready` you can continue to the next step. 2. Now that the app has been deployed you can test if the app works correctly by passing in a sample input that is available in the `mleap` folder. The deployed app is a RESTful webservice that is [Swagger](swagger.io) compliant. For this sample we will show you how you can test this using the CLI. - To test the app, run the command below. The input parameter is a `MLeapFrame`, a `json` file that describes the parameters and the values provided to the model for predicting income. Note that the input parameter has a special character '@' to indicate that a `json` file is being passed. This command needs to be run within the `mleap` folder. + To test the app, run the command below. The input parameter is a `MLeapFrame`, a `json` file that describes the parameters and the values provided to the model for predicting income. Note that the input parameter has a special character '@' to indicate that a `json` file is being passed. This command needs to be run within the `mleap` folder. ```bash azdata app run --name mleap-census --version [version] --input schema=@census_frame.json diff --git a/samples/features/sql-big-data-cluster/app-deploy/mleap/spec.yaml b/samples/features/sql-big-data-cluster/app-deploy/mleap/spec.yaml index 1823fea1..e2812d06 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/mleap/spec.yaml +++ b/samples/features/sql-big-data-cluster/app-deploy/mleap/spec.yaml @@ -1,5 +1,5 @@ name: mleap-census version: v1 runtime: Mleap -bundleFileName: census_bundle.zip +bundleFileName: census_bundle.zip replicas: 1 diff --git a/samples/features/sql-big-data-cluster/app-deploy/sentiment-analysis/model-training.R b/samples/features/sql-big-data-cluster/app-deploy/sentiment-analysis/model-training.R index 5fcdf9ce..17250b99 100644 --- a/samples/features/sql-big-data-cluster/app-deploy/sentiment-analysis/model-training.R +++ b/samples/features/sql-big-data-cluster/app-deploy/sentiment-analysis/model-training.R @@ -1,52 +1,52 @@ # Load the MicrosoftML library library(MicrosoftML) - + ### # Function to read in text file and perform data preparation ### getData <- function(tempDir, dataFile) { - + # Unzip and read in the file data <- read.csv(unz(temp, dataFile), sep = "\t") - + # Add column names. 1st column is the text, 2nd column is the rating colnames(data) <- c("Text", "Rating") - + # Convert to a string based dataframe data <- data.frame(lapply(data, as.character), stringsAsFactors=FALSE) - + # Convert the Rating column to numeric data$Rating <- as.integer(data$Rating) - + return(data) } - + # The data we'll use is the Sentiment Labelled Sentences Data Set # http://archive.ics.uci.edu/ml/datasets/Sentiment+Labelled+Sentences# - + # We'll pull the data from the UCI database directly # Since it's a zip file, we'll need to store and extract from some local location - + # So get a local temp location temp <- tempfile() - + # Download the zip file to the temp location zipfile <- download.file("http://archive.ics.uci.edu/ml/machine-learning-databases/00331/sentiment%20labelled%20sentences.zip",temp) - + # We'll use the imdb_labelled.txt file for training dataTrain <- getData(temp, "sentiment labelled sentences/imdb_labelled.txt") - + # Now let's setup the text featurizer transform textTransform = list(featurizeText(vars = c(Features = "Text"))) - + # Train a linear model on featurized text model <- rxFastLinear( - Rating ~ Features, + Rating ~ Features, data = dataTrain, mlTransforms = textTransform ) - + serialized <- rxSerializeModel(model, metadata = NULL, relatimeScoringOnly = FALSE) - + saveRDS(serialized, file = "sentiment.rds") \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh b/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh index 910a03b6..639645d3 100644 --- a/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh +++ b/samples/features/sql-big-data-cluster/bootstrap-sample-db.sh @@ -131,7 +131,7 @@ for table in web_clickstreams inventory customer do echo Exporting $table data... if [ $table == web_clickstreams ] - then + then DELIMITER=, else DELIMITER="|" diff --git a/samples/features/sql-big-data-cluster/bootstrap-sample-db.sql b/samples/features/sql-big-data-cluster/bootstrap-sample-db.sql index 732546ac..7980f615 100644 --- a/samples/features/sql-big-data-cluster/bootstrap-sample-db.sql +++ b/samples/features/sql-big-data-cluster/bootstrap-sample-db.sql @@ -1,4 +1,4 @@ -USE master; +USE master; GO -- Enable external scripts execution for R/Python/Java: DECLARE @config_option nvarchar(100) = 'external scripts enabled'; @@ -166,8 +166,8 @@ AS q.clicks_in_7, q.clicks_in_8, q.clicks_in_9 - FROM( - SELECT + FROM( + SELECT w.wcs_user_sk, SUM( CASE WHEN i.i_category = 'Books' THEN 1 ELSE 0 END) AS clicks_in_category, SUM( CASE WHEN i.i_category_id = 1 THEN 1 ELSE 0 END) AS clicks_in_1, diff --git a/samples/features/sql-big-data-cluster/data-pool/README.md b/samples/features/sql-big-data-cluster/data-pool/README.md index a0edb604..ce1cb42d 100644 --- a/samples/features/sql-big-data-cluster/data-pool/README.md +++ b/samples/features/sql-big-data-cluster/data-pool/README.md @@ -14,7 +14,7 @@ SQL Server Big Data clusters provide scale-out compute and storage to improve th ## Data ingestion using Spark streaming -In this example, you are going to use Spark to read and transform data from HDFS and cache it in a data pool. Querying the external table created over this aggregated data stored in data pools will be much more efficient than going to the raw data always. +In this example, you are going to use Spark to read and transform data from HDFS and cache it in a data pool. Querying the external table created over this aggregated data stored in data pools will be much more efficient than going to the raw data always. ### Instructions @@ -27,11 +27,11 @@ In this example, you are going to use Spark to read and transform data from HDFS 1. Create and submit a Spark job that ingests data from HDFS into the external table. Submitting a Spark job will start a Spark streaming session using spark-submit. - + The arguments to the jar file are: 1. server name - sql server to connect to read the table schema - 2. port number + 2. port number 3. username - sql server username for master instance 4. password - sql server password for master instance 5. database name @@ -43,11 +43,11 @@ Submitting a Spark job will start a Spark streaming session using spark-submit. Submit a Spark job with the below parameters. You can use the Spark submit experience from Azure Data Studio (right click on big data cluster endpoint -> Submit Spark Job): ARGUMENTS: - + **job name:** yourJobName **switch** from "Local" to "HDFS" - + **Path to jar** (copy/paste this): /jar/mssql-spark-lib-assembly-1.0.jar @@ -56,7 +56,7 @@ Submitting a Spark job will start a Spark streaming session using spark-submit. FileStreaming **Parameters (copy/paste this; make sure you replace the password!):** - + mssql-master-pool-0.service-master-pool 1433 sa passwordHere sales web_clickstreams_spark_results hdfs:///clickstream_data csv false 6. Query the external table we created earlier using the SELECT queries in the script to see data coming from the streaming job and landing in the table. \ No newline at end of file diff --git a/samples/features/sql-big-data-cluster/data-pool/data-ingestion-spark.sql b/samples/features/sql-big-data-cluster/data-pool/data-ingestion-spark.sql index 9d802b53..08e19962 100644 --- a/samples/features/sql-big-data-cluster/data-pool/data-ingestion-spark.sql +++ b/samples/features/sql-big-data-cluster/data-pool/data-ingestion-spark.sql @@ -2,7 +2,7 @@ USE sales GO -- Create external table in a data pool in SQL Server 2019 big data cluster. --- The SqlDataPool data source is a special data source that is available in +-- The SqlDataPool data source is a special data source that is available in -- any new database in SQL Master instance. This is used to reference the -- data pool in a SQL Server 2019 big data cluster. -- diff --git a/samples/features/sql-big-data-cluster/data-pool/data-ingestion-sql.sql b/samples/features/sql-big-data-cluster/data-pool/data-ingestion-sql.sql index 5101fd60..1445b095 100644 --- a/samples/features/sql-big-data-cluster/data-pool/data-ingestion-sql.sql +++ b/samples/features/sql-big-data-cluster/data-pool/data-ingestion-sql.sql @@ -8,7 +8,7 @@ IF NOT EXISTS(SELECT * FROM sys.external_data_sources WHERE name = 'SqlDataPool' WITH (LOCATION = 'sqldatapool://controller-svc/default'); -- Create external table in a data pool in SQL Server 2019 big data cluster. --- The SqlDataPool data source is a special data source that is available in +-- The SqlDataPool data source is a special data source that is available in -- any new database in SQL Master instance. This is used to reference the -- data pool in a SQL Server 2019 big data cluster. -- diff --git a/samples/features/sql-big-data-cluster/data-virtualization/hadoop/product-reviews-hdfs-orc.sql b/samples/features/sql-big-data-cluster/data-virtualization/hadoop/product-reviews-hdfs-orc.sql index 25652d20..ffbf250b 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/hadoop/product-reviews-hdfs-orc.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/hadoop/product-reviews-hdfs-orc.sql @@ -42,8 +42,8 @@ IF NOT EXISTS(SELECT * FROM sys.external_tables WHERE name = 'product_reviews_hd GO -- Join external table with local tables --- -SELECT +-- +SELECT p.pr_review_sk, pc.pr_review_content FROM product_reviews as p JOIN (SELECT TOP(10) * FROM product_reviews_hdfs_orc) AS pc diff --git a/samples/features/sql-big-data-cluster/data-virtualization/hadoop/web-clickstreams-hdfs-orc.sql b/samples/features/sql-big-data-cluster/data-virtualization/hadoop/web-clickstreams-hdfs-orc.sql index 9445c2b8..7bc7c737 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/hadoop/web-clickstreams-hdfs-orc.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/hadoop/web-clickstreams-hdfs-orc.sql @@ -42,8 +42,8 @@ IF NOT EXISTS(SELECT * FROM sys.external_tables WHERE name = 'web_clickstreams_h GO -- Join external table with local tables --- -SELECT +-- +SELECT wcs_user_sk, SUM( CASE WHEN i_category = 'Books' THEN 1 ELSE 0 END) AS book_category_clicks, SUM( CASE WHEN i_category_id = 1 THEN 1 ELSE 0 END) AS [Home & Kitchen], diff --git a/samples/features/sql-big-data-cluster/data-virtualization/oracle/customer-oracle.sql b/samples/features/sql-big-data-cluster/data-virtualization/oracle/customer-oracle.sql index 6e3d7c86..0474aa49 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/oracle/customer-oracle.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/oracle/customer-oracle.sql @@ -46,7 +46,7 @@ GO -- Find product reviews of customers who made purchases of items in a specific time window: -- -SELECT pr.pr_item_sk, pc.pr_review_content, pr.pr_user_sk AS customerid +SELECT pr.pr_item_sk, pc.pr_review_content, pr.pr_user_sk AS customerid FROM dbo.product_reviews as pr JOIN (SELECT TOP(100) * FROM dbo.product_reviews_hdfs_csv) AS pc ON pc.pr_review_sk = pr.pr_review_sk JOIN dbo.customer_ora AS c ON c.C_CUSTOMER_SK = pr.pr_user_sk @@ -55,7 +55,7 @@ INNER JOIN ( SELECT ws_item_sk FROM web_sales ws - WHERE + WHERE ws.ws_item_sk IS NOT null AND ws_sold_date_sk IN ( diff --git a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.ctl b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.ctl index 15abc205..895d84be 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.ctl +++ b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.ctl @@ -1,5 +1,5 @@ options (readsize=2048000,bindsize=1600000, rows=100000, silent=(header, feedback) ) -load data +load data infile 'customer.csv' "str '\r\n'" append into table SALES.CUSTOMER diff --git a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.sql b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.sql index 2ac042e2..c2bdea0c 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/customer.sql @@ -1,23 +1,23 @@ -- Customer table over which the SQL Server external table will be defined CREATE TABLE "SALES"."CUSTOMER" ( - "C_CUSTOMER_SK" NUMBER(10,0), - "C_CUSTOMER_ID" VARCHAR2(16 BYTE), - "C_CURRENT_CDEMO_SK" NUMBER(10,0), - "C_CURRENT_HDEMO_SK" NUMBER(10,0), - "C_CURRENT_ADDR_SK" NUMBER(10,0), - "C_FIRST_SHIPTO_DATE_SK" NUMBER(10,0), - "C_FIRST_SALES_DATE_SK" NUMBER(8,0), - "C_SALUTATION" VARCHAR2(10 BYTE), - "C_FIRST_NAME" VARCHAR2(20 BYTE), - "C_LAST_NAME" VARCHAR2(30 BYTE), - "C_PREFERRED_CUST_FLAG" VARCHAR2(1 BYTE), - "C_BIRTH_DAY" NUMBER(8,0), - "C_BIRTH_MONTH" NUMBER(8,0), - "C_BIRTH_YEAR" NUMBER(8,0), - "C_BIRTH_COUNTRY" VARCHAR2(20 BYTE), - "C_LOGIN" VARCHAR2(13 BYTE), - "C_EMAIL_ADDRESS" VARCHAR2(50 BYTE), + "C_CUSTOMER_SK" NUMBER(10,0), + "C_CUSTOMER_ID" VARCHAR2(16 BYTE), + "C_CURRENT_CDEMO_SK" NUMBER(10,0), + "C_CURRENT_HDEMO_SK" NUMBER(10,0), + "C_CURRENT_ADDR_SK" NUMBER(10,0), + "C_FIRST_SHIPTO_DATE_SK" NUMBER(10,0), + "C_FIRST_SALES_DATE_SK" NUMBER(8,0), + "C_SALUTATION" VARCHAR2(10 BYTE), + "C_FIRST_NAME" VARCHAR2(20 BYTE), + "C_LAST_NAME" VARCHAR2(30 BYTE), + "C_PREFERRED_CUST_FLAG" VARCHAR2(1 BYTE), + "C_BIRTH_DAY" NUMBER(8,0), + "C_BIRTH_MONTH" NUMBER(8,0), + "C_BIRTH_YEAR" NUMBER(8,0), + "C_BIRTH_COUNTRY" VARCHAR2(20 BYTE), + "C_LOGIN" VARCHAR2(13 BYTE), + "C_EMAIL_ADDRESS" VARCHAR2(50 BYTE), "C_LAST_REVIEW_DATE" VARCHAR2(20 BYTE) ); diff --git a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/inventory.ctl b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/inventory.ctl index de24f9ed..3a46715a 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/inventory.ctl +++ b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/inventory.ctl @@ -1,5 +1,5 @@ options (readsize=2048000,bindsize=1600000, rows=100000, silent=(header, feedback) ) -load data +load data infile 'inventory.csv' "str '\r\n'" append into table SALES.INVENTORY diff --git a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/sales-user.sql b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/sales-user.sql index e928c09a..63c81e92 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/sales-user.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/oracle/setup/sales-user.sql @@ -1,4 +1,4 @@ -CREATE USER "SALES" IDENTIFIED BY "sql19tw0oracle" +CREATE USER "SALES" IDENTIFIED BY "sql19tw0oracle" DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP" -- QUOTAS diff --git a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-csv.sql b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-csv.sql index 6be7ab0b..58ed4b50 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-csv.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-csv.sql @@ -37,8 +37,8 @@ IF NOT EXISTS(SELECT * FROM sys.external_tables WHERE name = 'product_reviews_hd GO -- Join external table with local tables --- -SELECT +-- +SELECT p.pr_review_sk, pc.pr_review_content FROM product_reviews as p JOIN (SELECT TOP(10) * FROM product_reviews_hdfs_csv) AS pc diff --git a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-parquet.sql b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-parquet.sql index 5c64a3ef..f87f5c6d 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-parquet.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-parquet.sql @@ -33,8 +33,8 @@ IF NOT EXISTS(SELECT * FROM sys.external_tables WHERE name = 'product_reviews_hd GO -- Join external table with local tables --- -SELECT +-- +SELECT p.pr_review_sk, pc.pr_review_content FROM product_reviews as p JOIN (SELECT TOP(10) * FROM product_reviews_hdfs_parquet) AS pc diff --git a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-tsv.sql b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-tsv.sql index 7d8d40f5..c1a35c5f 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-tsv.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/product-reviews-hdfs-tsv.sql @@ -34,8 +34,8 @@ WITH GO -- Join external table with local tables --- -SELECT +-- +SELECT wcs_user_sk, SUM( CASE WHEN i_category = 'Books' THEN 1 ELSE 0 END) AS book_category_clicks, SUM( CASE WHEN i_category_id = 1 THEN 1 ELSE 0 END) AS [Home & Kitchen], diff --git a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-csv.sql b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-csv.sql index 2e3bc194..5dec8ad1 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-csv.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-csv.sql @@ -36,8 +36,8 @@ IF NOT EXISTS(SELECT * FROM sys.external_tables WHERE name = 'web_clickstreams_h GO -- Join external table with local tables --- -SELECT +-- +SELECT wcs_user_sk, SUM( CASE WHEN i_category = 'Books' THEN 1 ELSE 0 END) AS book_category_clicks, SUM( CASE WHEN i_category_id = 1 THEN 1 ELSE 0 END) AS [Home & Kitchen], diff --git a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-parquet.sql b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-parquet.sql index 9a1c1380..013eccca 100644 --- a/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-parquet.sql +++ b/samples/features/sql-big-data-cluster/data-virtualization/storage-pool/web-clickstreams-hdfs-parquet.sql @@ -32,8 +32,8 @@ IF NOT EXISTS(SELECT * FROM sys.external_tables WHERE name = 'web_clickstreams_h GO -- Join external table with local tables --- -SELECT +-- +SELECT wcs_user_sk, SUM( CASE WHEN i_category = 'Books' THEN 1 ELSE 0 END) AS book_category_clicks, SUM( CASE WHEN i_category_id = 1 THEN 1 ELSE 0 END) AS [Home & Kitchen], @@ -72,8 +72,8 @@ AS q.clicks_in_8, q.clicks_in_9, q.wcs_user_sk - FROM( - SELECT + FROM( + SELECT w.wcs_user_sk, SUM( CASE WHEN i.i_category = 'Books' THEN 1 ELSE 0 END) AS clicks_in_category, SUM( CASE WHEN i.i_category_id = 1 THEN 1 ELSE 0 END) AS clicks_in_1, diff --git a/samples/features/sql-big-data-cluster/deployment/aks/README.md b/samples/features/sql-big-data-cluster/deployment/aks/README.md index 3b49bd73..64933c14 100644 --- a/samples/features/sql-big-data-cluster/deployment/aks/README.md +++ b/samples/features/sql-big-data-cluster/deployment/aks/README.md @@ -1,5 +1,5 @@ -# Deploy a SQL Server big data cluster on Azure Kubernetes Service (AKS) +# Deploy a SQL Server big data cluster on Azure Kubernetes Service (AKS) Using this sample Python script, you will deploy a Kubernetes cluster in Azure using AKS and a SQL Server big data cluster using this AKS cluster as its environment. The script can be run from any client OS. diff --git a/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py b/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py index 80fe149e..0748a6c0 100644 --- a/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py +++ b/samples/features/sql-big-data-cluster/deployment/aks/deploy-sql-big-data-aks.py @@ -1,6 +1,6 @@ # -# Prerequisites: -# +# Prerequisites: +# # Azure CLI (https://docs.microsoft.com/en-us/cli/azure/install-azure-cli), python3 (https://www.python.org/downloads), azdata CLI (pip3 install -r https://aka.ms/azdata) # # Run `az login` at least once BEFORE running this script @@ -26,7 +26,7 @@ def executeCmd (cmd): # SUBSCRIPTION_ID = input("Provide your Azure subscription ID:").strip() GROUP_NAME = input("Provide Azure resource group name to be created:").strip() -# Use this only if you are using a private registry different than default Micrososft registry (mcr). +# Use this only if you are using a private registry different than default Micrososft registry (mcr). #DOCKER_USERNAME = input("Provide your Docker username:").strip() #DOCKER_PASSWORD = getpass.getpass("Provide your Docker password:").strip() @@ -41,7 +41,7 @@ AKS_NODE_COUNT=input("Provide number of worker nodes for AKS cluster - Press ENT CLUSTER_NAME=input("Provide name of AKS cluster and SQL big data cluster - Press ENTER for using `sqlbigdata`:").strip() or "sqlbigdata" #This password will be use for Controller user, Knox user and SQL Server Master SA accounts -# +# AZDATA_USERNAME=input("Provide username to be used for Controller and SQL Server master accounts - Press ENTER for using `admin`:").strip() or "admin" AZDATA_PASSWORD = getpass.getpass("Provide password to be used for Controller user, Knox user (root) and SQL Server Master accounts - Press ENTER for using `MySQLBigData2019`").strip() or "MySQLBigData2019" @@ -92,7 +92,7 @@ executeCmd (command) command="azdata bdc config replace -c custom/bdc.json -j ""metadata.name=" + CLUSTER_NAME + "" executeCmd (command) -# Use this only if you are using a private registry different than default Micrososft registry (mcr). +# Use this only if you are using a private registry different than default Micrososft registry (mcr). # command="azdata bdc config replace -c custom/control.json -j ""$.spec.controlPlane.spec.docker.registry=" + DOCKER_REGISTRY + "" # executeCmd (command) 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 24c5cfbc..5a2242a0 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 @@ -81,7 +81,7 @@ done # Reset kube # -sudo apt-get purge -y kubeadm --allow-change-held-packages +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 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 4c2789fa..73259ef3 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 @@ -110,7 +110,7 @@ touch $LOG_FILE # echo "" echo "######################################################################################" -echo "Starting installing packages..." +echo "Starting installing packages..." # Install docker. # @@ -163,7 +163,7 @@ echo "Azdata has been successfully installed." # Load all pre-requisites for Kubernetes. # echo "###########################################################################" -echo "Starting to setup pre-requisites for kubernetes..." +echo "Starting to setup pre-requisites for kubernetes..." # Setup the kubernetes preprequisites. # @@ -244,13 +244,13 @@ for i in $(seq 1 $PV_COUNT); do mount --bind /mnt/local-storage/$vol /mnt/local-storage/$vol done -echo "Kubernetes pre-requisites have been completed." +echo "Kubernetes pre-requisites have been completed." # Setup kubernetes cluster including remove taint on master. # echo "" echo "#############################################################################" -echo "Starting to setup Kubernetes master..." +echo "Starting to setup Kubernetes master..." # Initialize a kubernetes cluster on the current node. # @@ -314,7 +314,7 @@ echo "Kubernetes master setup done." # echo "" echo "############################################################################" -echo "Starting to pull docker images..." +echo "Starting to pull docker images..." echo "Pulling images from repository: " $DOCKER_REGISTRY"/"$DOCKER_REPOSITORY for image in "${IMAGES[@]}"; @@ -322,13 +322,13 @@ do docker pull $DOCKER_REGISTRY/$DOCKER_REPOSITORY/$image:$DOCKER_TAG echo "Docker image" $image " pulled." done -echo "Docker images pulled." +echo "Docker images pulled." # Deploy azdata bdc create cluster. # echo "" echo "############################################################################" -echo "Starting to deploy azdata cluster..." +echo "Starting to deploy azdata cluster..." # Command to create cluster for single node cluster. # @@ -343,7 +343,7 @@ azdata bdc config patch -c kubeadm-custom/control.json -p $STARTUP_PATH/security azdata bdc config patch -c kubeadm-custom/bdc.json -p $STARTUP_PATH/endpoint-patch.json azdata bdc create -c kubeadm-custom --accept-eula $ACCEPT_EULA -echo "Big data cluster being created..." +echo "Big data cluster being created..." # Setting context to cluster. # 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 24c5cfbc..5a2242a0 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 @@ -81,7 +81,7 @@ done # Reset kube # -sudo apt-get purge -y kubeadm --allow-change-held-packages +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 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 48b82e2e..854a8116 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 @@ -94,7 +94,7 @@ touch $LOG_FILE # echo "" echo "######################################################################################" -echo "Starting installing packages..." +echo "Starting installing packages..." # Install docker. # @@ -153,7 +153,7 @@ echo "Azdata has been successfully installed." # Load all pre-requisites for Kubernetes. # echo "###########################################################################" -echo "Starting to setup pre-requisites for kubernetes..." +echo "Starting to setup pre-requisites for kubernetes..." # Setup the kubernetes preprequisites. # @@ -236,13 +236,13 @@ for i in $(seq 1 $PV_COUNT); do mount --bind /mnt/local-storage/$vol /mnt/local-storage/$vol done -echo "Kubernetes pre-requisites have been completed." +echo "Kubernetes pre-requisites have been completed." # Setup kubernetes cluster including remove taint on master. # echo "" echo "#############################################################################" -echo "Starting to setup Kubernetes master..." +echo "Starting to setup Kubernetes master..." # Initialize a kubernetes cluster on the current node. # @@ -306,7 +306,7 @@ echo "Kubernetes master setup done." # echo "" echo "############################################################################" -echo "Starting to pull docker images..." +echo "Starting to pull docker images..." echo "Pulling images from repository: " $DOCKER_REGISTRY"/"$DOCKER_REPOSITORY for image in "${IMAGES[@]}"; @@ -314,13 +314,13 @@ do docker pull $DOCKER_REGISTRY/$DOCKER_REPOSITORY/$image:$DOCKER_TAG echo "Docker image" $image " pulled." done -echo "Docker images pulled." +echo "Docker images pulled." # Deploy azdata bdc create cluster. # echo "" echo "############################################################################" -echo "Starting to deploy azdata cluster..." +echo "Starting to deploy azdata cluster..." # Command to create cluster for single node cluster. # @@ -332,7 +332,7 @@ azdata bdc config replace -c kubeadm-custom/bdc.json -j "$.spec.resources.data-0 azdata bdc config replace -c kubeadm-custom/control.json -j "spec.storage.data.className=$STORAGE_CLASS" azdata bdc config replace -c kubeadm-custom/control.json -j "spec.storage.logs.className=$STORAGE_CLASS" azdata bdc create -c kubeadm-custom --accept-eula $ACCEPT_EULA -echo "Big data cluster created." +echo "Big data cluster created." # Setting context to cluster. # 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 1eef64d7..055c7eef 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 @@ -8,7 +8,7 @@ In this example, we will deploy Kubernetes over multiple Linux machines (physica 1. Designate one machine as the Kubernetes master 1. Rest of the machines will be used as the Kubernetes agents -* The memory requirement listed here is for testing and development scenarios. Production environments require 64 GB memory minimum. Actual limit depends on workload. +* The memory requirement listed here is for testing and development scenarios. Production environments require 64 GB memory minimum. Actual limit depends on workload. **NOTE: Ensure there is sufficient local storage on your agents. Each volume will use up to 10GB by default. The script creates 25 volumes. Not all of the volumes will be used since it depends on the number of pods being deployed on each agent node. It is recommended to have at least 200 GB of storage on the agent nodes** @@ -27,7 +27,7 @@ In this example, we will deploy Kubernetes over multiple Linux machines (physica 1. After successful initialization of the Kubernetes master, follow the kubeadm join commands output by the setup script on each agent machine 1. Execute [setup-volumes-agent.sh](setup-volumes-agent.sh/) script on each agent machine to create volumes for local storage 1. Execute ***kubectl apply -f local-storage-provisioner.yaml*** against the Kubernetes cluster to create the local storage provisioner. This will create a Storage Class named "local-storage". -1. Now, you can deploy the SQL Server 2019 big data cluster following instructions [here](https://docs.microsoft.com/en-us/sql/big-data-cluster/deployment-guidance?view=sqlallproducts-allversions). +1. Now, you can deploy the SQL Server 2019 big data cluster following instructions [here](https://docs.microsoft.com/en-us/sql/big-data-cluster/deployment-guidance?view=sqlallproducts-allversions). 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:` @@ -42,11 +42,11 @@ to clean the storage you need to follow these steps 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. +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 +run the following command to create the script ```sh cat > clean-volumes-agents.sh < CREDENTIAL is not required if a blob storage is public! ); diff --git a/samples/features/sql-bulk-load/load-from-azure-blob-storage/LoadFromAzureBlobStorage.sql b/samples/features/sql-bulk-load/load-from-azure-blob-storage/LoadFromAzureBlobStorage.sql index b957fea2..a62911c2 100644 --- a/samples/features/sql-bulk-load/load-from-azure-blob-storage/LoadFromAzureBlobStorage.sql +++ b/samples/features/sql-bulk-load/load-from-azure-blob-storage/LoadFromAzureBlobStorage.sql @@ -22,7 +22,7 @@ -- 1.1.2. (optional) Create credential with Azure Blob SAS -- --- CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential +-- CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential -- WITH IDENTITY = 'SHARED ACCESS SIGNATURE', -- SECRET = 'sv=2015-12-11&ss=b&srt=sco&sp=rwac&se=2017-02-01T00:55:34Z&st=2016-12-29T16:55:34Z&spr=https&sig=copyFromAzurePortal'; -- NOTE: DO NOT PUT FIRST CHARACTER '?'' IN SECRET!!! @@ -36,8 +36,8 @@ -- Create external data source with the URL of the Blob storage Account and associated credential (if it is not public). CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage -WITH ( TYPE = BLOB_STORAGE, - LOCATION = 'https://sqlchoice.blob.core.windows.net/sqlchoice/samples/load-from-azure-blob-storage', +WITH ( TYPE = BLOB_STORAGE, + LOCATION = 'https://sqlchoice.blob.core.windows.net/sqlchoice/samples/load-from-azure-blob-storage', -- CREDENTIAL= MyAzureBlobStorageCredential --> CREDENTIAL is not required if a blob storage is public! ); @@ -72,7 +72,7 @@ WITH ( DATA_SOURCE = 'MyAzureBlobStorage', FORMAT='CSV', CODEPAGE = 65001, --UTF-8 encoding FIRSTROW=2, ROWTERMINATOR = '0x0a', - TABLOCK); + TABLOCK); -- 2.2. INSERT file exported using bcp.exe into Product table BULK INSERT Product @@ -80,17 +80,17 @@ FROM 'product.bcp' WITH ( DATA_SOURCE = 'MyAzureBlobStorage', FORMATFILE='product.fmt', FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage', - TABLOCK); + TABLOCK); -- 2.3. Read rows from product.dat file using format file and insert it into Product table -INSERT INTO Product WITH (TABLOCK) (Name, Color, Price, Size, Quantity, Data, Tags) +INSERT INTO Product WITH (TABLOCK) (Name, Color, Price, Size, Quantity, Data, Tags) SELECT Name, Color, Price, Size, Quantity, Data, Tags FROM OPENROWSET(BULK 'product.bcp', DATA_SOURCE = 'MyAzureBlobStorage', FORMATFILE='product.fmt', - FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage') as products; + FORMATFILE_DATA_SOURCE = 'MyAzureBlobStorage') as products; --- 2.4. Query remote file +-- 2.4. Query remote file SELECT Color, count(*) FROM OPENROWSET(BULK 'product.bcp', DATA_SOURCE = 'MyAzureBlobStorage', diff --git a/samples/features/sql-clr/Curl/README.md b/samples/features/sql-clr/Curl/README.md index 7692b513..f99d4104 100644 --- a/samples/features/sql-clr/Curl/README.md +++ b/samples/features/sql-clr/Curl/README.md @@ -1,4 +1,4 @@ -# CURL in SQL Server using CLR +# CURL in SQL Server using CLR SQL Server Database Engine doesn't have built-in functions that would enable you to send information to some API using `http://` protocol. If you need to call some REST endpoint or a web hook from the T-SQL code, you will need to use `WebClient` or `WebRequest` classes from .Net framework and expose them as a T-SQL function or procedure. One of the most popular tools for calling an API on `http:` endpoints is [curl](https://curl.haxx.se). This code sample demonstrates how to create CLR User-Defined function/procedure that provides CURL-like functionalities in T-SQL. @@ -16,7 +16,7 @@ One of the most popular tools for calling an API on `http:` endpoints is [curl]( -## About this sample +## About this sample 1. **Applies to:** SQL Server 2005+ Enterprise / Developer / Evaluation Edition, Azure SQL Database (Managed Instance) 2. **Key features:** - CLR @@ -109,7 +109,7 @@ exec curl.XPOST @H = @hkey, @d = @body, @url = @endpoint; ## Disclaimers -The code included in this sample is not intended to be a set of best practices on how to build scalable enterprise grade applications. This is beyond the scope of this sample. +The code included in this sample is not intended to be a set of best practices on how to build scalable enterprise grade applications. This is beyond the scope of this sample. ## Appendix diff --git a/samples/features/sql-clr/Curl/SqlClrCurl.sql b/samples/features/sql-clr/Curl/SqlClrCurl.sql index fb24a454..38d08762 100644 --- a/samples/features/sql-clr/Curl/SqlClrCurl.sql +++ b/samples/features/sql-clr/Curl/SqlClrCurl.sql @@ -14,7 +14,7 @@ GO DROP SCHEMA IF EXISTS CURL; GO ---Drop "trusted assembly flag" if it is set +--Drop "trusted assembly flag" if it is set DECLARE @hash VARBINARY(64); diff --git a/samples/features/sql-clr/Curl/SqlClrCurl.tt b/samples/features/sql-clr/Curl/SqlClrCurl.tt index 94166667..245cdadc 100644 --- a/samples/features/sql-clr/Curl/SqlClrCurl.tt +++ b/samples/features/sql-clr/Curl/SqlClrCurl.tt @@ -16,7 +16,7 @@ GO DROP SCHEMA IF EXISTS CURL; GO ---Drop "trusted assembly flag" if it is set +--Drop "trusted assembly flag" if it is set DECLARE @hash VARBINARY(64); diff --git a/samples/features/sql-clr/RegEx/README.md b/samples/features/sql-clr/RegEx/README.md index 350e6c7e..cc310ad6 100644 --- a/samples/features/sql-clr/RegEx/README.md +++ b/samples/features/sql-clr/RegEx/README.md @@ -1,4 +1,4 @@ -# Implementing Regular Expressions in SQL Server using CLR UDF +# Implementing Regular Expressions in SQL Server using CLR UDF SQL Database don't have built-in support for regular expressions, so the only workaround is to use Regular Expressions that exist in .Net framework and expose them as T-SQL functions. This code sample demonstrates how to create CLR User-Defined functions that expose regular expression functionalities that exist in .Net framework. @@ -12,7 +12,7 @@ This code sample demonstrates how to create CLR User-Defined functions that expo -## About this sample +## About this sample 1. **Applies to:** SQL Server 2005+ Enterprise / Developer / Evaluation Edition 2. **Key features:** - CLR diff --git a/samples/features/sql-clr/TransitiveClosure/README.md b/samples/features/sql-clr/TransitiveClosure/README.md index 945ff5d9..120f8235 100644 --- a/samples/features/sql-clr/TransitiveClosure/README.md +++ b/samples/features/sql-clr/TransitiveClosure/README.md @@ -1,6 +1,6 @@ -# Implementing Transitive Closure Clustering in SQL Server using CLR UDF +# Implementing Transitive Closure Clustering in SQL Server using CLR UDF SQL Database don't have built-in support for transitive closure clustering, so the only workaround is to implement this algorithm in .Net framework and expose it as T-SQL function. -A discussion on the problem, the algorithm and a pure T-SQL based solution can be found here: +A discussion on the problem, the algorithm and a pure T-SQL based solution can be found here: - [Transitive Closure Clustering with SQL Server, UDA and JSON](https://medium.com/@mauridb/transitive-closure-clustering-with-sql-server-uda-and-json-dade18953fd2) - [T-SQL Puzzle Challenge Grouping Connected Items](http://www.itprotoday.com/microsoft-sql-server/t-sql-puzzle-challenge-grouping-connected-items) @@ -16,7 +16,7 @@ This code sample demonstrates how to create CLR User-Defined aggregate that impl -## About this sample +## About this sample 1. **Applies to:** SQL Server 2016+ Enterprise / Developer / Evaluation Edition 2. **Key features:** - CLR, JSON @@ -52,9 +52,9 @@ GO CREATE SCHEMA TC; GO -CREATE AGGREGATE TC.CLUSTERING(@id1 INT, @id2 INT) -RETURNS NVARCHAR(MAX) -EXTERNAL NAME TransitiveClosure.[TransitiveClosure.Aggregate]; +CREATE AGGREGATE TC.CLUSTERING(@id1 INT, @id2 INT) +RETURNS NVARCHAR(MAX) +EXTERNAL NAME TransitiveClosure.[TransitiveClosure.Aggregate]; ``` This code will import assembly in SQL Database and add an aggregate that provides clustering functionalities. @@ -69,7 +69,7 @@ Once you create the assembly and expose the aggregate, you can use it to cluster declare @edges table(n1 int, n2 int); insert into @edges -values +values (1,2),(2,3),(3,4),(4,5),(2,21),(2,22), (7,8),(8,9),(9,10); diff --git a/samples/features/sql-clr/TransitiveClosure/TransitiveClosure.tt b/samples/features/sql-clr/TransitiveClosure/TransitiveClosure.tt index 2216864e..794752ea 100644 --- a/samples/features/sql-clr/TransitiveClosure/TransitiveClosure.tt +++ b/samples/features/sql-clr/TransitiveClosure/TransitiveClosure.tt @@ -18,6 +18,6 @@ GO CREATE SCHEMA TC; GO -CREATE AGGREGATE TC.CLUSTERING(@id1 INT, @id2 INT) -RETURNS NVARCHAR(MAX) +CREATE AGGREGATE TC.CLUSTERING(@id1 INT, @id2 INT) +RETURNS NVARCHAR(MAX) EXTERNAL NAME TransitiveClosure.[TransitiveClosure.Aggregate]; \ No newline at end of file diff --git a/samples/features/sql-clr/TransitiveClosure/TransitiveClosureAggregate.cs b/samples/features/sql-clr/TransitiveClosure/TransitiveClosureAggregate.cs index 2969b22a..1af4bc26 100644 --- a/samples/features/sql-clr/TransitiveClosure/TransitiveClosureAggregate.cs +++ b/samples/features/sql-clr/TransitiveClosure/TransitiveClosureAggregate.cs @@ -14,7 +14,7 @@ namespace TransitiveClosure public class Group: IEnumerable { private int? _groupRoot = null; - + private Dictionary _group = new Dictionary(); public Dictionary.KeyCollection Elements => _group.Keys; public int Count => _group.Keys.Count; @@ -31,12 +31,12 @@ namespace TransitiveClosure /// public void AddUnique(int from, int to) { - if (_groupRoot == null) _groupRoot = from; + if (_groupRoot == null) _groupRoot = from; this.AddIfNotExists(from); this.AddIfNotExists(to); } /// - /// Adds the element into the current group. + /// Adds the element into the current group. /// /// The number that should be added. public void Add(int element) @@ -46,7 +46,7 @@ namespace TransitiveClosure } /// - /// Adds the element to a group if it is not already there. + /// Adds the element to a group if it is not already there. /// /// public void AddIfNotExists(int element) @@ -111,11 +111,11 @@ namespace TransitiveClosure public List FindInGroups(int from, int to) { var result = new List(); - + if (_numbers.ContainsKey(from)) result.Add(_numbers[from]); if (_numbers.ContainsKey(to)) result.Add(_numbers[to]); - return result; + return result; } public void AddPair(int from, int to) @@ -123,7 +123,7 @@ namespace TransitiveClosure //Find if the inputValue is already in a group var foundInGroups = FindInGroups(from, to); - // no item matches: create a new group and add both the values to it + // no item matches: create a new group and add both the values to it if (foundInGroups.Count == 0) { var ng = new Group(); @@ -166,7 +166,7 @@ namespace TransitiveClosure if (!_numbers.ContainsKey(from)) _numbers.Add(from, g1); else _numbers[from] = g1; if (!_numbers.ContainsKey(to)) _numbers.Add(to, g1); else _numbers[to] = g1; - g1.MergeWith(g2); + g1.MergeWith(g2); foreach(var e in g2) { @@ -219,7 +219,7 @@ namespace TransitiveClosure public void Accumulate(int inputValue1, int inputValue2) { - _groupSet.AddPair(inputValue1, inputValue2); + _groupSet.AddPair(inputValue1, inputValue2); } public void Merge(Aggregate value) @@ -236,7 +236,7 @@ namespace TransitiveClosure pe = ce; } } - } + } public SqlString Terminate() { @@ -256,7 +256,7 @@ namespace TransitiveClosure g.Elements.CopyTo(ea, 0); sb.Append(string.Join(",", ea)); - + sb.Append("],"); c += 1; @@ -277,7 +277,7 @@ namespace TransitiveClosure // For Each Group for (int j = 0; j < g; j++) { - var l = new Group(); + var l = new Group(); // List Size (or Values Count) int s = r.ReadInt32(); diff --git a/samples/features/sql-data-sync/DataSyncLogPowerShellRunbook.ps1 b/samples/features/sql-data-sync/DataSyncLogPowerShellRunbook.ps1 index b5b0d5d1..e6776728 100644 --- a/samples/features/sql-data-sync/DataSyncLogPowerShellRunbook.ps1 +++ b/samples/features/sql-data-sync/DataSyncLogPowerShellRunbook.ps1 @@ -1,22 +1,22 @@ #Requires -Modules @{ ModuleName="Az.Sql"; ModuleVersion="3.5.1" } #Data Sync OMS Integration Runbook -#To use this script Change all the strings below to reflect your information. +#To use this script Change all the strings below to reflect your information. #Setup a System Managed Identity in the Automation Account, with Reader permissions to the monitored SQL targets #Also allow the managed identity access to the Automation Account itself to read/write the Variable used #Information for Sync Group 1 -#If you want to use all the sync groups in your subscription keep the $DS_xxxx fields empty. -#If you want to use all sync groups in a Resource Group define the $DS_ResourceGroupName. +#If you want to use all the sync groups in your subscription keep the $DS_xxxx fields empty. +#If you want to use all sync groups in a Resource Group define the $DS_ResourceGroupName. #If you want to use all sync groups in a Server define $DS_ResourceGroupName and $DS_ServerName. #If you want to use all sync groups in a Database define $DS_ResourceGroupName, $DS_ServerName and $DS_DatabaseName. #If you want to use a specific sync group define $DS_ResourceGroupName, $DS_ServerName, $DS_DatabaseName and $DS_SyncGroupName. -$SubscriptionId = "SubscriptionId" +$SubscriptionId = "SubscriptionId" $DS_ResourceGroupName = "" -$DS_ServerName = "" -$DS_DatabaseName = "" -$DS_SyncGroupName = "" +$DS_ServerName = "" +$DS_DatabaseName = "" +$DS_SyncGroupName = "" # Insert your Automation Account ResourceGroup and Account names $AC_ResourceGroupName = "ResourceGroupName" @@ -25,7 +25,7 @@ $AC_AccountName = "AutomationAccountName" $AC_LastUpdatedTimeVariableName = "DataSyncLogLastUpdatedTime" # Replace with your OMS Workspace ID (Log Analytics Workspace ID) -$CustomerId = "OMSCustomerID" +$CustomerId = "OMSCustomerID" # Replace with your OMS Primary Key (Log Analytics Primary Key) $SharedKey = "SharedKey" @@ -41,7 +41,7 @@ Disable-AzContextAutosave -Scope Process # Connect to Azure with system-assigned managed identity $AzureContext = (Connect-AzAccount -Identity).context # set and store context -$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContextficateThumbprint $servicePrincipalConnection.CertificateThumbprint +$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContextficateThumbprint $servicePrincipalConnection.CertificateThumbprint # Create the function to create the authorization signature Function Build-Signature ($customerId, $sharedKey, $date, $contentLength, $method, $contentType, $resource) @@ -166,13 +166,13 @@ foreach ($ResourceGroup in $ResourceGroupName) $Log | Add-Member -Name "ResourceGroupName" -Value $ResourceGroup -MemberType NoteProperty $Log | Add-Member -Name "ServerName" -Value $Server -MemberType NoteProperty $Log | Add-Member -Name "HubDatabaseName" -Value $Database -MemberType NoteProperty - $Log | Add-Member -Name "SyncGroupName" -Value $SyncGroup -MemberType NoteProperty + $Log | Add-Member -Name "SyncGroupName" -Value $SyncGroup -MemberType NoteProperty #Filter out Successes to Reduce Data Volume to OMS #Include the 5 commented out line below to enable the filter #For($i=0; $i -lt $Log.Length; $i++ ) { # if($Log[$i].LogLevel -eq "Success") { - # $Log[$i] ="" + # $Log[$i] ="" # } # } @@ -186,13 +186,13 @@ foreach ($ResourceGroup in $ResourceGroupName) $result = Post-OMSData -customerId $customerId -sharedKey $sharedKey -body ([System.Text.Encoding]::UTF8.GetBytes($json)) -logType $logType - if ($result -eq 200) + if ($result -eq 200) { Write-Host "Success" } - if ($result -ne 200) + if ($result -ne 200) { - throw + throw @" Posting to OMS Failed   Runbook Name: DataSyncOMSIntegration   diff --git a/samples/features/sql-data-sync/UpdateSyncSchema.ps1 b/samples/features/sql-data-sync/UpdateSyncSchema.ps1 index 421c0d7d..212ae9ea 100644 --- a/samples/features/sql-data-sync/UpdateSyncSchema.ps1 +++ b/samples/features/sql-data-sync/UpdateSyncSchema.ps1 @@ -18,7 +18,7 @@ $TablesAndColumnsToRemoveList = [System.Collections.ArrayList]::new($TablesAndCo $TempFile = $env:TEMP+"\syncSchema.json" ##login to Azure account -login-azurermaccount +login-azurermaccount ##select the subscription select-azurermsubscription -SubscriptionId $SubscriptionId @@ -80,7 +80,7 @@ if ($RefreshDatabaseSchema) While ($TimeoutTimeSpan.TotalSeconds -le $TimeoutInSeconds) { Start-Sleep -s 10 - + if ($MemberName -eq "") { $DatabaseSchema = Get-AzureRmSqlSyncSchema -SyncGroupName $SyncGroupName ` diff --git a/samples/features/sql-data-sync/clean_up_data_sync_objects.sql b/samples/features/sql-data-sync/clean_up_data_sync_objects.sql index 0a411663..c51fa3da 100644 --- a/samples/features/sql-data-sync/clean_up_data_sync_objects.sql +++ b/samples/features/sql-data-sync/clean_up_data_sync_objects.sql @@ -4,11 +4,11 @@ set @TableName = 'yourTableName' --set @TableName = '' -- Generate the script to drop Data Sync tables -select 'drop table [DataSync].['+ st.name+ '];' from sys.tables as st join sys.schemas as ss on ss.schema_id = st.schema_id +select 'drop table [DataSync].['+ st.name+ '];' from sys.tables as st join sys.schemas as ss on ss.schema_id = st.schema_id where ss.name = 'DataSync' and st.name like '%' + @TableName + '_dss_%' -- Generate the script to drop Data Sync stored procedures -select 'drop procedure [DataSync].['+ sp.name+ '];' from sys.procedures as sp join sys.schemas as ss on ss.schema_id = sp.schema_id +select 'drop procedure [DataSync].['+ sp.name+ '];' from sys.procedures as sp join sys.schemas as ss on ss.schema_id = sp.schema_id where ss.name = 'DataSync' and sp.name like '%' + @TableName + '_dss_%' -- Generate the script to delete Data Sync triggers @@ -16,5 +16,5 @@ select 'drop trigger [' + schema_name(schema_id) + '].[' + name + ']' from sys.objects where type = 'TR' and name like '%' + @TableName + '_dss_%' -- Generate the script to delete Data Sync-related udtt -select 'drop type [DataSync].['+ st.name+ '];' from sys.types as st join sys.schemas as ss on st.schema_id = ss.schema_id +select 'drop type [DataSync].['+ st.name+ '];' from sys.types as st join sys.schemas as ss on st.schema_id = ss.schema_id where ss.name = 'DataSync' and st.name like '%' + @TableName + '_dss_%' \ No newline at end of file diff --git a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql index 0b8a58fb..4929aa26 100644 --- a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql +++ b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/DerivedTablesAndViewsInGraphMatch.sql @@ -4,7 +4,7 @@ go ---------------------------------------------------------------------------- -- Querying heterogeneous edges ---------------------------------------------------------------------------- -CREATE VIEW OperatesIn AS +CREATE VIEW OperatesIn AS SELECT *, 'located' AS relation FROM locatedIn UNION ALL SELECT *, 'delivery' FROM deliveryIn @@ -22,13 +22,13 @@ SELECT SupplierID, SupplierName, PhoneNumber, relation ---------------------------------------------------------------------------- CREATE VIEW Customer AS -SELECT SupplierID AS ID, - SupplierName AS NAME, +SELECT SupplierID AS ID, + SupplierName AS NAME, SupplierCategory AS CATEGORY FROM Supplier UNION ALL -SELECT CustomerID, - CustomerName, +SELECT CustomerID, + CustomerName, CustomerCategory FROM Customers GO @@ -40,10 +40,10 @@ SELECT Customer.ID, Customer.NAME, Customer.CATEGORY locatedIn WHERE MATCH(Customer-(locatedIn)->City) AND City.CityName = 'San Francisco' - + SELECT Customer.ID, Customer.NAME, Customer.CATEGORY - FROM Customer, - City, + FROM Customer, + City, OperatesIn WHERE MATCH(Customer-(OperatesIn)->City) AND City.CityName = 'San Francisco' @@ -55,8 +55,8 @@ SELECT Customer.ID, Customer.NAME, Customer.CATEGORY CREATE VIEW Novelty_Supplier AS -SELECT SupplierID, - SupplierName , +SELECT SupplierID, + SupplierName , SupplierCategory , ValidTo FROM Supplier @@ -64,25 +64,25 @@ SELECT SupplierID, GO CREATE VIEW Novelty_Customer AS - SELECT CustomerID, - CustomerName, + SELECT CustomerID, + CustomerName, CustomerCategory, ValidTo FROM Customers - WHERE CustomerCategory LIKE '%Novelty%' OR CustomerCategory LIKE '%Gift%' + WHERE CustomerCategory LIKE '%Novelty%' OR CustomerCategory LIKE '%Gift%' GO SELECT Name, ID, Category - FROM -(SELECT SupplierID AS ID, SupplierName AS Name, - SupplierCategory AS Category, ValidTo + FROM +(SELECT SupplierID AS ID, SupplierName AS Name, + SupplierCategory AS Category, ValidTo FROM Novelty_Supplier WHERE ValidTo > getdate() UNION ALL - SELECT CustomerID, CustomerName, CustomerCategory, ValidTo - FROM Novelty_Customer WHERE ValidTo > getdate()) AS NoveltyCust, -StockItems, -bought, -OperatesIn, + SELECT CustomerID, CustomerName, CustomerCategory, ValidTo + FROM Novelty_Customer WHERE ValidTo > getdate()) AS NoveltyCust, +StockItems, +bought, +OperatesIn, City WHERE MATCH(City<-(OperatesIn)-NoveltyCust-(bought)->Stockitems) AND StockItemName = 'White chocolate snow balls 250g' diff --git a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md index eab2f721..63463cf3 100644 --- a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md +++ b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/README.md @@ -1,8 +1,8 @@ # Derived Tables and Views in Graph Match Queries SQL Server (starting with SQL Server 2017) and Azure SQL Database now let you create a graph database, to hold your entities and complex many to many relationships. There are several examples on github which demonstrate how the new graph features work. This example shows how you can use derived tables and views created on graph node or edge tables in graph match queries. This feature is in public preview on Azure SQL Database and SQL Server 2019 CTP2.1. - -To demonstrate the functionality, we will be using WideWorldImporters as our sample database. + +To demonstrate the functionality, we will be using WideWorldImporters as our sample database. ## Contents [About this sample](#about-this-sample)
    @@ -16,7 +16,7 @@ To demonstrate the functionality, we will be using WideWorldImporters as our sam - SQL Server 2019 CTP2.1 (or higher) 2. **Demos:** - Build and populate graph node and edge tables - - Use derived tables and views in graph match queries. + - Use derived tables and views in graph match queries. 3. **Workload:** Queries executed on [WideWorldImporters](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0) 4. **Programming Language:** T-SQL 5. **Author:** Shreya Verma @@ -34,7 +34,7 @@ To run these demo scripts, you need the following prerequisites. **Azure prerequisites:** 1. An Azure subscription. If you don't already have an Azure subscription, you can get one for free here: [get Azure free trial](https://azure.microsoft.com/en-us/free/) - + 2. When your Azure subscription is ready to use, you have to create an Azure SQL Database, to do that, you must have completed the first three steps explained in [Design your first Azure SQL database](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-design-first-database) ## Run This Sample @@ -43,17 +43,17 @@ To run these demo scripts, you need the following prerequisites. #### Azure SQL Database Setup 1. Download the **WideWorldImporters-Standard.bacpac** from the WideWorldImporters database [page](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0) - + 2. Import the **WideWorldImporters-Standard.bacpac** bacpac file to your Azure subscription. [This document](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-import) describes how you can restore a bacpac file to your Azure SQL Database. - + 3. Launch SQL Server Management Studio and connect to the newly created WideWorldImporters database - + #### SQL Server Setup 1. Download [**WideWorldImporters-Full.bak**](https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0) - -2. Launch SQL Server Management Studio, connect to your SQL Server instance (2017) and restore **WideWorldImporters-Full.bak**. This document describes how to [Restore a Database Backup Using SSMS](https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/restore-a-database-backup-using-ssms). + +2. Launch SQL Server Management Studio, connect to your SQL Server instance (2017) and restore **WideWorldImporters-Full.bak**. This document describes how to [Restore a Database Backup Using SSMS](https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/restore-a-database-backup-using-ssms). #### Running the Sample Scripts @@ -66,16 +66,16 @@ To run these demo scripts, you need the following prerequisites. 1. How to query heterogeneous edges in match query. 2. How to query heterogeneous nodes in match query. - 3. How to query heterogeneous nodes and edges in match query. - + 3. How to query heterogeneous nodes and edges in match query. + ## Related Links For more information about Graph DB in SQL Server 2017, see these articles: 1. [Graph processing with SQL Server and Azure SQL Database](https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-overview) - + 2. [SQL Graph Architecture](https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-architecture) - + 3. [Using MATCH in MERGE DML](https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/07/16/match-support-in-merge-dml-for-graph-tables/) 4. [Edge Constraints on graph tables](https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/09/28/public-preview-of-graph-edge-constraints-on-sql-server-2019/) diff --git a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/setup-wwi-graph.sql b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/setup-wwi-graph.sql index 317ba54c..7243d1f0 100644 --- a/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/setup-wwi-graph.sql +++ b/samples/features/sql-graph/DerivedTablesAndViewsInGraphMatch/setup-wwi-graph.sql @@ -43,7 +43,7 @@ AS EDGE; GO --- Create FriendOf edge, which connects each customer +-- Create FriendOf edge, which connects each customer -- to 3 other customers as 'friends' CREATE TABLE FriendOf AS EDGE GO @@ -51,7 +51,7 @@ GO ------------------------------------------------------------------------------------- ----- Populate StockItems table. +---- Populate StockItems table. ------------------------------------------------------------------------------------- SET IDENTITY_INSERT StockItems ON; GO @@ -72,7 +72,7 @@ GO ------------------------------------------------------------------------------------- ----- Populate Customers table. +---- Populate Customers table. ------------------------------------------------------------------------------------- INSERT INTO Customers ( @@ -130,7 +130,7 @@ GO ------------------------------------------------------------------------------------- ----- Populate Supplier table. +---- Populate Supplier table. ------------------------------------------------------------------------------------- INSERT INTO Supplier ( @@ -155,7 +155,7 @@ WHERE GO ------------------------------------------------------------------------------------- ----- Populate City table. +---- Populate City table. ------------------------------------------------------------------------------------- INSERT INTO City ( @@ -169,13 +169,13 @@ INSERT INTO City C.StateProvinceID, S.StateProvinceName FROM - Application.Cities C, + Application.Cities C, Application.StateProvinces S WHERE C.StateProvinceID = S.StateProvinceID; GO ------------------------------------------------------------------------------------- ----- Populate Bought edge table. +---- Populate Bought edge table. ------------------------------------------------------------------------------------- -- Insert Customers-bought->StockItems data in the bought edge. INSERT INTO Bought @@ -225,7 +225,7 @@ GO ------------------------------------------------------------------------------------- ----- Populate FriendOf edge table. +---- Populate FriendOf edge table. ------------------------------------------------------------------------------------- DECLARE @j INTEGER; DECLARE @lower INTEGER; @@ -241,7 +241,7 @@ BEGIN WHILE (@j < 3) BEGIN SELECT @random = ROUND(((@Upper - @i) * RAND() + @j), 0) - + INSERT FriendOf($from_id, $to_id) SELECT C1.$node_id, C2.$node_id FROM Customers AS C1, Customers AS C2 @@ -288,7 +288,7 @@ GO ------------------------------------------------------------------------------------- ----- Populate locatedIn edge table. +---- Populate locatedIn edge table. ------------------------------------------------------------------------------------- INSERT INTO locatedIn ( @@ -301,14 +301,14 @@ SELECT FROM Purchasing.Suppliers AS PS JOIN - Application.Cities AS AC ON PS.PostalCityID = AC.CityID + Application.Cities AS AC ON PS.PostalCityID = AC.CityID JOIN Supplier AS S ON S.SupplierID = PS.SupplierID JOIN City AS C ON C.CityID = AC.CityID --- Insert customer - city data +-- Insert customer - city data INSERT INTO locatedIn ( $from_id, @@ -320,14 +320,14 @@ SELECT FROM Sales.Customers AS SC JOIN - Application.Cities AS AC ON SC.PostalCityID = AC.CityID + Application.Cities AS AC ON SC.PostalCityID = AC.CityID JOIN Customers AS CUS ON CUS.CustomerID = SC.CustomerID JOIN City AS C ON C.CityID = AC.CityID --- Insert customer locatedIn San Francisco. +-- Insert customer locatedIn San Francisco. -- We will use this data later in queries. INSERT INTO locatedIn ( @@ -339,7 +339,7 @@ SELECT C.$node_id FROM Customers AS CUS, City AS C -WHERE +WHERE CUS.CustomerID IN (5,1059,1060,1061,908) AND C.cityid = 30378 @@ -350,7 +350,7 @@ INSERT INTO locatedIn $from_id, $to_id ) -SELECT +SELECT S.$node_id, C.$node_id FROM @@ -363,7 +363,7 @@ AND ------------------------------------------------------------------------------------- ----- Populate deliveryIN edge table. +---- Populate deliveryIN edge table. ------------------------------------------------------------------------------------- INSERT INTO deliveryIn ( @@ -376,14 +376,14 @@ SELECT FROM Purchasing.Suppliers AS PS JOIN - Application.Cities AS AC ON PS.DeliveryCityID = AC.CityID + Application.Cities AS AC ON PS.DeliveryCityID = AC.CityID JOIN Supplier AS S ON S.SupplierID = PS.SupplierID JOIN City AS C ON C.CityID = AC.CityID --- Insert customer - city data +-- Insert customer - city data INSERT INTO deliveryIn ( $from_id, @@ -395,14 +395,14 @@ SELECT FROM Sales.Customers AS SC JOIN - Application.Cities AS AC ON SC.DeliveryCityID = AC.CityID + Application.Cities AS AC ON SC.DeliveryCityID = AC.CityID JOIN Customers AS CUS ON CUS.CustomerID = SC.CustomerID JOIN City AS C ON C.CityID = AC.CityID --- Insert customer deliveryIn San Francisco. +-- Insert customer deliveryIn San Francisco. -- We will use this data later in queries. INSERT INTO deliveryIn ( @@ -414,7 +414,7 @@ SELECT C.$node_id FROM Customers AS CUS, City AS C -WHERE +WHERE CUS.CustomerID IN (5,1059,1060,1061,908) AND C.cityid = 30378 @@ -425,7 +425,7 @@ INSERT INTO deliveryIn $from_id, $to_id ) -SELECT +SELECT S.$node_id, C.$node_id FROM diff --git a/samples/features/sql-graph/README.md b/samples/features/sql-graph/README.md index 56e56e7583b6251514c580da73b79a449fb35244..8ba935f6d08d0a13da0b74a8e44385192245925a 100644 GIT binary patch delta 16 Xcmdmyzb$`*5AWmvBZ @@ -15,7 +15,7 @@ To demonstrate the functionality, we will be using AdventureWorks2014 as our sam - SQL Server 2019 CTP3.1 (or higher) 2. **Demos:** - Build and populate graph node and edge tables - - Use SHORTEST_PATH function to compute shortest path + - Use SHORTEST_PATH function to compute shortest path - between 2 given nodes. - starting from a given node to all other nodes in the graph. - starting from a given node to all other nodes, which are 1 to 3 hops away from the start node. @@ -38,12 +38,12 @@ To run these demo scripts, you need the following prerequisites. #### SQL Server Setup 1. Download [**AdventureWorks2014.bak**](https://github.com/Microsoft/sql-server-samples/releases/download/adventureworks/AdventureWorks2014.bak) - -2. Launch SQL Server Management Studio, connect to your SQL Server instance (2019) and restore **AdventureWorks2014.bak**. This document describes how to [Restore a Database Backup Using SSMS](https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/restore-a-database-backup-using-ssms). + +2. Launch SQL Server Management Studio, connect to your SQL Server instance (2019) and restore **AdventureWorks2014.bak**. This document describes how to [Restore a Database Backup Using SSMS](https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/restore-a-database-backup-using-ssms). #### Running the Sample Scripts -1. Once the database is restored, run the *setup-BOMGraph.sql* script to create the necessary graph node and edge tables. We will be using these tables to run our sample queries. The setup file creates Product node table and IsPartOf edge table, which represents the BOM for products in AdventureWorks Cycles manufacturing pipeline. +1. Once the database is restored, run the *setup-BOMGraph.sql* script to create the necessary graph node and edge tables. We will be using these tables to run our sample queries. The setup file creates Product node table and IsPartOf edge table, which represents the BOM for products in AdventureWorks Cycles manufacturing pipeline. ![AdventureWorksBOM](AdventureWorksBOM.png) @@ -52,16 +52,16 @@ To run these demo scripts, you need the following prerequisites. 1. Starting from a given node, find shortest path to all the other nodes in the graph. 2. Starting from a given node, find shortest path to all the other nodes in the graph, which are 1 -3 hops away from the start node. 3. Find shortest path between 2 given nodes (start and end node) - - + + ## Related Links For more information about Graph DB in SQL Server 2017, see these articles: 1. [Graph processing with SQL Server and Azure SQL Database](https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-overview) - + 2. [SQL Graph Architecture](https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-architecture) - + 3. [Using MATCH in MERGE DML](https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/07/16/match-support-in-merge-dml-for-graph-tables/) 4. [Edge Constraints on graph tables](https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/09/28/public-preview-of-graph-edge-constraints-on-sql-server-2019/) diff --git a/samples/features/sql-graph/ShortestPath/ShortestPath.sql b/samples/features/sql-graph/ShortestPath/ShortestPath.sql index 60ac808e..cada6aa2 100644 --- a/samples/features/sql-graph/ShortestPath/ShortestPath.sql +++ b/samples/features/sql-graph/ShortestPath/ShortestPath.sql @@ -3,12 +3,12 @@ GO ------------------------------------------------------------------------------------ -- Find all assemblies that require a Bearing Ball in the bill of materials --- Or, Starting with a given node, find shortest paths to all the others nodes in +-- Or, Starting with a given node, find shortest paths to all the others nodes in -- the graph ------------------------------------------------------------------------------------ -SELECT - P1.ProductID, +SELECT + P1.ProductID, P1.Name, STRING_AGG(P2.Name,'->') WITHIN GROUP (GRAPH PATH) AS [Assembly], LAST_VALUE(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS [Final ProductID] @@ -16,19 +16,19 @@ FROM PRODUCT P1, PRODUCT FOR PATH P2, ISPARTOF FOR PATH IPO -WHERE +WHERE MATCH(SHORTEST_PATH(P1(-(IPO)->P2)+)) AND P1.ProductID = 2 ORDER BY P1.ProductID ------------------------------------------------------------------------------------ -- Find all products which are up to 3 levels away from Bearing Ball in BOM hierarchy --- Or, find shortest path from a given start node to all other nodes in the graph, +-- Or, find shortest path from a given start node to all other nodes in the graph, -- which are 1-3 hops away from the start node. ------------------------------------------------------------------------------------ -SELECT - P1.ProductID, +SELECT + P1.ProductID, P1.Name, STRING_AGG(P2.Name,'->') WITHIN GROUP (GRAPH PATH) AS [Assembly], LAST_VALUE(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS [Final ProductID], @@ -37,7 +37,7 @@ FROM PRODUCT P1, PRODUCT FOR PATH P2, ISPARTOF FOR PATH IPO -WHERE +WHERE MATCH(SHORTEST_PATH(P1(-(IPO)->P2){1,3})) AND P1.ProductID = 2 ORDER BY P1.ProductID @@ -46,15 +46,15 @@ WHERE ------------------------------------------------------------------------------------ -- Find shortest path between 2 given nodes (start node and end node) -- Note that, to apply filter on the end node, we have to use a subquery --- but the filter applied on end node in outer query is pushed down while +-- but the filter applied on end node in outer query is pushed down while -- computing the shortest path. ------------------------------------------------------------------------------------ SELECT ProductID, Name, [Assembly], FinalProductID, Levels FROM ( - SELECT - P1.ProductID, + SELECT + P1.ProductID, P1.Name, STRING_AGG(P2.Name,'->') WITHIN GROUP (GRAPH PATH) AS [Assembly], LAST_VALUE(P2.ProductID) WITHIN GROUP (GRAPH PATH) AS FinalProductID, @@ -63,10 +63,10 @@ FROM ( PRODUCT P1, PRODUCT FOR PATH P2, ISPARTOF FOR PATH IPO - WHERE + WHERE MATCH(SHORTEST_PATH(P1(-(IPO)->P2)+)) AND P1.ProductID = 2 ) AS Q - WHERE Q.FinalProductID = 768 + WHERE Q.FinalProductID = 768 diff --git a/samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql b/samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql index 9e613dae..6d04cbfb 100644 --- a/samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql +++ b/samples/features/sql-graph/ShortestPath/setup-BOMGraph.sql @@ -17,15 +17,15 @@ GO -- populate data into product node from Production.Product table INSERT INTO dbo.Product -SELECT - p.ProductID, - p.Name, - p.ProductNumber, - p.StandardCost, - p.ListPrice, - p.Weight, - p.DaysToManufacture, - p.SellStartDate, +SELECT + p.ProductID, + p.Name, + p.ProductNumber, + p.StandardCost, + p.ListPrice, + p.Weight, + p.DaysToManufacture, + p.SellStartDate, p.SellEndDate FROM Production.Product p; GO @@ -41,7 +41,7 @@ INSERT INTO IsPartOf $to_id, PerAssemblyQty ) -SELECT +SELECT P.$node_id, PP.$node_id, BOM.PerAssemblyQty diff --git a/samples/features/sql-graph/csv_as_node.py b/samples/features/sql-graph/csv_as_node.py index b7bced52..bafde238 100644 --- a/samples/features/sql-graph/csv_as_node.py +++ b/samples/features/sql-graph/csv_as_node.py @@ -7,15 +7,15 @@ def main(input_file_path, schema, table): # create the output file in the same directory as the input file output_file_path = os.path.splitext(input_file_path)[0] + '_as_node' + '.csv' - # you may have to change the encoding + # you may have to change the encoding with open(input_file_path, mode='r', encoding = 'utf-16le', newline='') as input_file, \ open(output_file_path, mode='w', encoding = 'utf-16le', newline='') as output_file: - + line = input_file.readline() line_number = 0 # read each line of the input file, add a $node_id column and write down the result on the output file - while line: + while line: if line_number == 0: newline = '\ufeff' + '{"type":"node","schema":"' + schema + '","table":"' + table + '","id":' + str(line_number) + '}\t' + line[1:] else: @@ -23,15 +23,15 @@ def main(input_file_path, schema, table): output_file.write(newline) line_number += 1 line = input_file.readline() - + if __name__ == '__main__': - + parser = OptionParser() - + parser.add_option("-f", "--file", action="store", type="string", dest="input_file_name") parser.add_option("-s", "--schema", action="store", type="string", dest="schema") parser.add_option("-t", "--table", action="store", type="string", dest="table") - + (options, args) = parser.parse_args() # retrieve options if not provided by the user @@ -41,6 +41,6 @@ if __name__ == '__main__': options.name = input('Please enter the SQL schema of the node table you will populate:') if (options.table == None): options.name = input('Please enter the SQL name of the node table you are populate:') - + main(options.input_file_name, options.schema, options.table) diff --git a/samples/features/sql-graph/openrowset_bulk_insert.sql b/samples/features/sql-graph/openrowset_bulk_insert.sql index 26e1892b..336a8a8f 100644 --- a/samples/features/sql-graph/openrowset_bulk_insert.sql +++ b/samples/features/sql-graph/openrowset_bulk_insert.sql @@ -95,7 +95,7 @@ INSERT INTO Graph.Customers ( ValidFrom, ValidTo ) -SELECT +SELECT CustomerID, CustomerName, BillToCustomerID, @@ -128,7 +128,7 @@ SELECT ValidFrom, ValidTo FROM OPENROWSET ( - bulk 'E:\Graph Examples\Graph.Customers.csv', formatfile = 'E:\Graph Examples\Graph.Customers_format.xml' + bulk 'E:\Graph Examples\Graph.Customers.csv', formatfile = 'E:\Graph Examples\Graph.Customers_format.xml' ) as temp; USE master; diff --git a/samples/features/sql-graph/populate_graph_tables.sql b/samples/features/sql-graph/populate_graph_tables.sql index 4e683113..b378b0a1 100644 --- a/samples/features/sql-graph/populate_graph_tables.sql +++ b/samples/features/sql-graph/populate_graph_tables.sql @@ -1,6 +1,6 @@ /* POPULATE NODE TABLES */ --- for performance purposes, disable default indexes on edge and node tables. +-- for performance purposes, disable default indexes on edge and node tables. ALTER INDEX ALL ON Graph.Customers disable; ALTER INDEX ALL ON Graph.Suppliers disable; ALTER INDEX ALL ON Graph.StockItems disable; @@ -629,7 +629,7 @@ GO /* Rebuild default indexes on node table. We advise against rebuilding default indexes on edge tables unless you eant to create a global view of all edge tables. -Add nonclustered indexes +Add nonclustered indexes */ ALTER INDEX ALL ON Graph.Customers rebuild; ALTER INDEX ALL ON Graph.Suppliers rebuild; diff --git a/samples/features/sql-graph/top_10_buyers.sql b/samples/features/sql-graph/top_10_buyers.sql index 4ef64fbb..aa0e8ab1 100644 --- a/samples/features/sql-graph/top_10_buyers.sql +++ b/samples/features/sql-graph/top_10_buyers.sql @@ -16,7 +16,7 @@ go -- using regular tables SELECT top (10) sum(q2.UnitPrice * q2.Quantity) AS TotalSpendingOnItem, q4.CustomerName, q4.CustomerID FROM (SELECT StockItemID, StockItemName FROM Warehouse.StockItems) AS q1 - join (SELECT StockItemID, OrderID, Quantity, UnitPrice FROM Sales.OrderLines) AS q2 ON q1.StockItemID = q2.StockItemID + join (SELECT StockItemID, OrderID, Quantity, UnitPrice FROM Sales.OrderLines) AS q2 ON q1.StockItemID = q2.StockItemID join (SELECT OrderID, CustomerID FROM Sales.Orders) AS q3 ON q2.OrderID = q3.OrderID join (SELECT CustomerID, CustomerName FROM Sales.Customers) AS q4 ON q3.CustomerID = q4.CustomerID WHERE q1.StockItemName = 'Chocolate frogs 250g' diff --git a/samples/features/sql-management-objects/README.md b/samples/features/sql-management-objects/README.md index e057e5e7..a46bc4e8 100644 --- a/samples/features/sql-management-objects/README.md +++ b/samples/features/sql-management-objects/README.md @@ -39,7 +39,7 @@ To run this sample, you need the following prerequisites. ## Run this sample -If using Docker, use runtests.sh or runtests.cmd as appropriate. If using a separate instance of SQL Server or Azure SQL Database, create a .runsettings file and run the unit tests using Visual Studio or "dotnet vstest". +If using Docker, use runtests.sh or runtests.cmd as appropriate. If using a separate instance of SQL Server or Azure SQL Database, create a .runsettings file and run the unit tests using Visual Studio or "dotnet vstest". diff --git a/samples/features/sql-management-objects/prep/dockerfile b/samples/features/sql-management-objects/prep/dockerfile index 70dcbbd5..67d662f2 100644 --- a/samples/features/sql-management-objects/prep/dockerfile +++ b/samples/features/sql-management-objects/prep/dockerfile @@ -1,6 +1,6 @@ FROM mcr.microsoft.com/mssql/server:2017-latest WORKDIR /tmp/backup -RUN wget -q https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak +RUN wget -q https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak COPY restore.sql . COPY restore.sh . COPY entrypoint.sh . diff --git a/samples/features/sql-management-objects/prep/restore.sh b/samples/features/sql-management-objects/prep/restore.sh index d6d34702..66d087de 100644 --- a/samples/features/sql-management-objects/prep/restore.sh +++ b/samples/features/sql-management-objects/prep/restore.sh @@ -1,5 +1,5 @@ # Wait for SQL Server to start and be ready to accept connections sleep 35s -echo sa_password is $SA_PASSWORD +echo sa_password is $SA_PASSWORD /opt/mssql-tools/bin/sqlcmd -S . -U sa -P $SA_PASSWORD -i /tmp/backup/restore.sql \ No newline at end of file diff --git a/samples/features/sql-management-objects/prep/restore.sql b/samples/features/sql-management-objects/prep/restore.sql index 4e1fddd1..41e79f46 100644 --- a/samples/features/sql-management-objects/prep/restore.sql +++ b/samples/features/sql-management-objects/prep/restore.sql @@ -1,5 +1,5 @@ -RESTORE DATABASE WideWorldImporters FROM DISK = "/tmp/backup/WideWorldImporters-Full.bak" -WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", -MOVE "WWI_Userdata" TO "/var/opt/mssql/data/WideWorldImporters_UserData.ndf", -MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" +RESTORE DATABASE WideWorldImporters FROM DISK = "/tmp/backup/WideWorldImporters-Full.bak" +WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", +MOVE "WWI_Userdata" TO "/var/opt/mssql/data/WideWorldImporters_UserData.ndf", +MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1" \ No newline at end of file diff --git a/samples/features/sql-management-objects/src/CollectionSamples.cs b/samples/features/sql-management-objects/src/CollectionSamples.cs index e8cc35ce..f5a9281b 100644 --- a/samples/features/sql-management-objects/src/CollectionSamples.cs +++ b/samples/features/sql-management-objects/src/CollectionSamples.cs @@ -44,7 +44,7 @@ $"QueryCount:{unoptimizedMetrics.QueryCount}", $"ConnectionCount:{unoptimizedMetrics.ConnectionCount}", $"BytesSent:{unoptimizedMetrics.BytesSent}", $"BytesRead:{unoptimizedMetrics.BytesRead}" })); - + connectionMetrics.Reset(); server.SetDefaultInitFields(typeof(Table), "Name", "Schema", "FileGroup"); database.Tables.Refresh(); diff --git a/samples/features/sql-management-objects/src/GenericSqlProxy.cs b/samples/features/sql-management-objects/src/GenericSqlProxy.cs index eac86266..91b51e01 100644 --- a/samples/features/sql-management-objects/src/GenericSqlProxy.cs +++ b/samples/features/sql-management-objects/src/GenericSqlProxy.cs @@ -65,7 +65,7 @@ namespace Microsoft.SqlServer.SmoSamples private void AsyncInit(TcpListener tcpListener, string hostName, int port) { - + while (!disposed) { var accept = tcpListener.AcceptTcpClientAsync(); @@ -82,8 +82,6 @@ namespace Microsoft.SqlServer.SmoSamples remoteClient.ConnectAsync(hostName, port).Wait(tokenSource.Token); if (!tokenSource.IsCancellationRequested) { - - Task.Factory.StartNew(() => { ForwardToSql(localClient, remoteClient); }); Task.Factory.StartNew(() => { ForwardToClient(localClient, remoteClient); }); } @@ -96,7 +94,7 @@ namespace Microsoft.SqlServer.SmoSamples } /// - /// Fires before the proxy writes a buffer to the host + /// Fires before the proxy writes a buffer to the host /// public event EventHandler OnWriteHost; diff --git a/samples/features/sql-management-objects/src/SmoSamples.csproj b/samples/features/sql-management-objects/src/SmoSamples.csproj index 983c6b2b..f2d36ccc 100644 --- a/samples/features/sql-management-objects/src/SmoSamples.csproj +++ b/samples/features/sql-management-objects/src/SmoSamples.csproj @@ -16,7 +16,7 @@ - + diff --git a/samples/features/sql2019notebooks/README.md b/samples/features/sql2019notebooks/README.md index a5f96723..3c4d65bd 100644 --- a/samples/features/sql2019notebooks/README.md +++ b/samples/features/sql2019notebooks/README.md @@ -14,7 +14,7 @@ The [What's New](https://docs.microsoft.com/sql/sql-server/what-s-new-in-sql-ser * **[Memory_Grant_Feedback.ipynb](https://github.com/microsoft/sql-server-samples/blob/master/samples/features/intelligent-query-processing/notebooks/Memory_Grant_Feedback.ipynb)** - In this notebook, you will learn about how Memory Grant Feedback for Batch mode and Row mode can help execute queries faster on SQL Server 2019. * **[Approximate_QP.ipynb](https://github.com/microsoft/sql-server-samples/blob/master/samples/features/intelligent-query-processing/notebooks/Approximate_QP.ipynb)** - In this notebook, you will learn about the new area of approximate query processing on SQL Server 2019. -### Security +### Security * **[TDE_on_Standard.ipynb](https://github.com/microsoft/sql-server-samples/blob/master/samples/features/security/tde-sql2019-standard/TDE_on_Standard.ipynb)** - This notebook demonstrates the ability to enable TDE on SQL Server 2019 Standard Edition along with Encryption Scan SUSPEND and RESUME. * **[TDE_on_Standard_EKM.ipynb](https://github.com/microsoft/sql-server-samples/blob/master/samples/features/security/tde-sql2019-standard/TDE_on_Standard_EKM.ipynb)** - This notebook demonstrates the ability to enable TDE on a SQL Server 2019 Standard Edition using EKM and Azure Key Vault. @@ -49,14 +49,14 @@ The [What's New](https://docs.microsoft.com/sql/sql-server/what-s-new-in-sql-ser * Configure - Configure a spark session using a notebook * Install - Install 3rd party packages * Restful-Access - Access Spark in BDC via restful Livy APIs - + * **Machine Learning** * **[Powerplant Output Prediction](https://github.com/microsoft/sql-server-samples/blob/master/samples/features/sql-big-data-cluster/machine-learning/spark/h2o/h2o-automl-powerplant.ipynb)** - This sample uses the automated machine learning capabilities of the third party H2O package running in Spark in a SQL Server 2019 Big Data Cluster to build a machine learning model that predicts powerplant output. * **[TensorFlow on GPUs in SQL Server 2019 big data cluster](https://github.com/microsoft/sql-server-samples/tree/master/samples/features/sql-big-data-cluster/machine-learning/spark/tensorflow)** - The notebooks in this directory illustrate fitting TensorFlow image classification models using GPU acceleration. - + ### SQL Server Troubleshooting Notebooks * **[SQL Server Troubleshooting Notebooks](https://github.com/microsoft/tigertoolbox/tree/master/Troubleshooting-Notebooks)** - This repository of notebooks helps you troubleshooting common scenarios that you could encounter with SQL Server including Big Data Clusters. ### SQL Assessment API * **[SQL Assessment API Quick Start and Tutorial Notebooks](https://github.com/microsoft/sql-server-samples/tree/master/samples/manage/sql-assessment-api/notebooks)** - SQL Assessment API provides a mechanism to evaluate the configuration of your SQL Server for best practices. In this repository, you will find two Azure Data Studio notebooks, one is for quick start in two steps and the other is a comprehensive tutorial that will step you through all the features of SQL Assessment API including customizing the existing rules and creating your own ones. - + diff --git a/samples/features/sqlvdi-linux/README.md b/samples/features/sqlvdi-linux/README.md index 63ac8d51..7d34dfd0 100644 --- a/samples/features/sqlvdi-linux/README.md +++ b/samples/features/sqlvdi-linux/README.md @@ -1,5 +1,5 @@ # SQLVDI for Linux -This folder contains the latest files and samples required to build a SQL Server VDI based backup/restore application for Linux. +This folder contains the latest files and samples required to build a SQL Server VDI based backup/restore application for Linux. ## Files available 1. vdi.h @@ -21,14 +21,14 @@ There is a problem with VDF_LikeDisk and VDF_RandomAccess where the backup/resto 1. Install the clang and uuid-dev packages in order to build the sample. Example (for Ubuntu):  - + ```bash sudo apt-get install clang  sudo apt-get install uuid-dev  ``` - + 1. Create a symbolic link to sqlcmd in /usr/bin - + ```bash sudo ln -s /opt/mssql-tools/bin/sqlcmd /usr/bin/sqlcmd ``` diff --git a/samples/features/sqlvdi-linux/vdipipesample.cpp b/samples/features/sqlvdi-linux/vdipipesample.cpp index efbe5fcc..5b071521 100644 --- a/samples/features/sqlvdi-linux/vdipipesample.cpp +++ b/samples/features/sqlvdi-linux/vdipipesample.cpp @@ -133,7 +133,7 @@ int main(int argc, char* argv[]) "Demonstrate a Backup or Restore using the Virtual Device Interface\n"); return 1; } - + umask(0); vds = new ClientVirtualDeviceSet(); diff --git a/samples/features/sqlvdi/README.md b/samples/features/sqlvdi/README.md index b8a76f10..11fbcf1f 100644 --- a/samples/features/sqlvdi/README.md +++ b/samples/features/sqlvdi/README.md @@ -1,5 +1,5 @@ -# SQLVDI -This folder contains the latest files and samples required to build a SQL Server VDI based backup/restore application. +# SQLVDI +This folder contains the latest files and samples required to build a SQL Server VDI based backup/restore application. ### Files available 1. vdi.h @@ -12,9 +12,9 @@ More details about this improvement in the SQLVDI protocol can be found in [KB31 The following implementations have to be applied to your VDI client: -1. Request the new VDI feature VDF_RequestComplete. -2. If SQL Server supports the VDC_Complete command, it will return a not NULL response. -3. Otherwise, it would return a NULL response for the requested feature. +1. Request the new VDI feature VDF_RequestComplete. +2. If SQL Server supports the VDC_Complete command, it will return a not NULL response. +3. Otherwise, it would return a NULL response for the requested feature. The code sample here shows how to request the feature:  ``` @@ -25,7 +25,7 @@ Determine whether the SQL Server supports the new VDC_Complete command by using ``` hr = m_pvdiComponents->m_pvdDeviceSet->GetConfiguration(timeout, m_pvdiComponents->m_pvdConfig); - + if (!(m_pvdiComponents->m_pvdConfig->features & VDF_CompleteEnabled)) { printf("Server does not support VDC_Complete."); diff --git a/samples/features/sqlvdi/vdi.h b/samples/features/sqlvdi/vdi.h index 1c80a7c2..97404b79 100644 --- a/samples/features/sqlvdi/vdi.h +++ b/samples/features/sqlvdi/vdi.h @@ -35,7 +35,7 @@ #pragma once #endif -/* Forward Declarations */ +/* Forward Declarations */ #ifndef __IClientVirtualDevice_FWD_DEFINED__ #define __IClientVirtualDevice_FWD_DEFINED__ @@ -78,11 +78,11 @@ typedef interface IServerVirtualDeviceSet2 IServerVirtualDeviceSet2; #ifdef __cplusplus extern "C"{ -#endif +#endif /* interface __MIDL_itf_vdi_0000_0000 */ -/* [local] */ +/* [local] */ #pragma pack(push, _vdi_h_) @@ -150,7 +150,7 @@ enum VDCommands enum VDWhence { VDC_Beginning = 0, VDC_Current = ( VDC_Beginning + 1 ) , - VDC_End = ( VDC_Current + 1 ) + VDC_End = ( VDC_Current + 1 ) } ; struct VDC_Command { @@ -168,59 +168,59 @@ extern RPC_IF_HANDLE __MIDL_itf_vdi_0000_0000_v0_0_s_ifspec; #define __IClientVirtualDevice_INTERFACE_DEFINED__ /* interface IClientVirtualDevice */ -/* [object][uuid] */ +/* [object][uuid] */ EXTERN_C const IID IID_IClientVirtualDevice; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("40700424-0080-11d2-851f-00c04fc21759") IClientVirtualDevice : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE GetCommand( + virtual HRESULT STDMETHODCALLTYPE GetCommand( /* [in] */ DWORD dwTimeOut, /* [out] */ struct VDC_Command **ppCmd) = 0; - - virtual HRESULT STDMETHODCALLTYPE CompleteCommand( + + virtual HRESULT STDMETHODCALLTYPE CompleteCommand( /* [in] */ struct VDC_Command *pCmd, /* [in] */ DWORD dwCompletionCode, /* [in] */ DWORD dwBytesTransferred, /* [in] */ DWORDLONG dwlPosition) = 0; - + }; - + #else /* C style interface */ typedef struct IClientVirtualDeviceVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IClientVirtualDevice * This, /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ + /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + ULONG ( STDMETHODCALLTYPE *AddRef )( IClientVirtualDevice * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + ULONG ( STDMETHODCALLTYPE *Release )( IClientVirtualDevice * This); - - HRESULT ( STDMETHODCALLTYPE *GetCommand )( + + HRESULT ( STDMETHODCALLTYPE *GetCommand )( IClientVirtualDevice * This, /* [in] */ DWORD dwTimeOut, /* [out] */ struct VDC_Command **ppCmd); - - HRESULT ( STDMETHODCALLTYPE *CompleteCommand )( + + HRESULT ( STDMETHODCALLTYPE *CompleteCommand )( IClientVirtualDevice * This, /* [in] */ struct VDC_Command *pCmd, /* [in] */ DWORD dwCompletionCode, /* [in] */ DWORD dwBytesTransferred, /* [in] */ DWORDLONG dwlPosition); - + END_INTERFACE } IClientVirtualDeviceVtbl; @@ -229,26 +229,26 @@ EXTERN_C const IID IID_IClientVirtualDevice; CONST_VTBL struct IClientVirtualDeviceVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IClientVirtualDevice_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IClientVirtualDevice_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IClientVirtualDevice_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IClientVirtualDevice_GetCommand(This,dwTimeOut,ppCmd) \ - ( (This)->lpVtbl -> GetCommand(This,dwTimeOut,ppCmd) ) + ( (This)->lpVtbl -> GetCommand(This,dwTimeOut,ppCmd) ) #define IClientVirtualDevice_CompleteCommand(This,pCmd,dwCompletionCode,dwBytesTransferred,dwlPosition) \ - ( (This)->lpVtbl -> CompleteCommand(This,pCmd,dwCompletionCode,dwBytesTransferred,dwlPosition) ) + ( (This)->lpVtbl -> CompleteCommand(This,pCmd,dwCompletionCode,dwBytesTransferred,dwlPosition) ) #endif /* COBJMACROS */ @@ -257,7 +257,7 @@ EXTERN_C const IID IID_IClientVirtualDevice; -HRESULT STDMETHODCALLTYPE IClientVirtualDevice_GetCommand_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDevice_GetCommand_Proxy( IClientVirtualDevice * This, /* [in] */ DWORD dwTimeOut, /* [out] */ struct VDC_Command **ppCmd); @@ -270,7 +270,7 @@ void __RPC_STUB IClientVirtualDevice_GetCommand_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDevice_CompleteCommand_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDevice_CompleteCommand_Proxy( IClientVirtualDevice * This, /* [in] */ struct VDC_Command *pCmd, /* [in] */ DWORD dwCompletionCode, @@ -293,99 +293,99 @@ void __RPC_STUB IClientVirtualDevice_CompleteCommand_Stub( #define __IClientVirtualDeviceSet_INTERFACE_DEFINED__ /* interface IClientVirtualDeviceSet */ -/* [object][uuid] */ +/* [object][uuid] */ EXTERN_C const IID IID_IClientVirtualDeviceSet; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("40700425-0080-11d2-851f-00c04fc21759") IClientVirtualDeviceSet : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Create( + virtual HRESULT STDMETHODCALLTYPE Create( /* [in] */ LPCWSTR lpName, /* [in] */ struct VDConfig *pCfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetConfiguration( + + virtual HRESULT STDMETHODCALLTYPE GetConfiguration( /* [in] */ DWORD dwTimeOut, /* [out] */ struct VDConfig *pCfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenDevice( + + virtual HRESULT STDMETHODCALLTYPE OpenDevice( /* [in] */ LPCWSTR lpName, /* [out] */ IClientVirtualDevice **ppVirtualDevice) = 0; - + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE SignalAbort( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenInSecondary( + + virtual HRESULT STDMETHODCALLTYPE OpenInSecondary( /* [in] */ LPCWSTR lpSetName) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetBufferHandle( + + virtual HRESULT STDMETHODCALLTYPE GetBufferHandle( /* [in] */ BYTE *pBuffer, /* [out] */ DWORD *pBufferHandle) = 0; - - virtual HRESULT STDMETHODCALLTYPE MapBufferHandle( + + virtual HRESULT STDMETHODCALLTYPE MapBufferHandle( /* [in] */ DWORD dwBuffer, /* [out] */ BYTE **ppBuffer) = 0; - + }; - + #else /* C style interface */ typedef struct IClientVirtualDeviceSetVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IClientVirtualDeviceSet * This, /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ + /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + ULONG ( STDMETHODCALLTYPE *AddRef )( IClientVirtualDeviceSet * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + ULONG ( STDMETHODCALLTYPE *Release )( IClientVirtualDeviceSet * This); - - HRESULT ( STDMETHODCALLTYPE *Create )( + + HRESULT ( STDMETHODCALLTYPE *Create )( IClientVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName, /* [in] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( + + HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( IClientVirtualDeviceSet * This, /* [in] */ DWORD dwTimeOut, /* [out] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *OpenDevice )( + + HRESULT ( STDMETHODCALLTYPE *OpenDevice )( IClientVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName, /* [out] */ IClientVirtualDevice **ppVirtualDevice); - - HRESULT ( STDMETHODCALLTYPE *Close )( + + HRESULT ( STDMETHODCALLTYPE *Close )( IClientVirtualDeviceSet * This); - - HRESULT ( STDMETHODCALLTYPE *SignalAbort )( + + HRESULT ( STDMETHODCALLTYPE *SignalAbort )( IClientVirtualDeviceSet * This); - - HRESULT ( STDMETHODCALLTYPE *OpenInSecondary )( + + HRESULT ( STDMETHODCALLTYPE *OpenInSecondary )( IClientVirtualDeviceSet * This, /* [in] */ LPCWSTR lpSetName); - - HRESULT ( STDMETHODCALLTYPE *GetBufferHandle )( + + HRESULT ( STDMETHODCALLTYPE *GetBufferHandle )( IClientVirtualDeviceSet * This, /* [in] */ BYTE *pBuffer, /* [out] */ DWORD *pBufferHandle); - - HRESULT ( STDMETHODCALLTYPE *MapBufferHandle )( + + HRESULT ( STDMETHODCALLTYPE *MapBufferHandle )( IClientVirtualDeviceSet * This, /* [in] */ DWORD dwBuffer, /* [out] */ BYTE **ppBuffer); - + END_INTERFACE } IClientVirtualDeviceSetVtbl; @@ -394,44 +394,44 @@ EXTERN_C const IID IID_IClientVirtualDeviceSet; CONST_VTBL struct IClientVirtualDeviceSetVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IClientVirtualDeviceSet_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IClientVirtualDeviceSet_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IClientVirtualDeviceSet_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IClientVirtualDeviceSet_Create(This,lpName,pCfg) \ - ( (This)->lpVtbl -> Create(This,lpName,pCfg) ) + ( (This)->lpVtbl -> Create(This,lpName,pCfg) ) #define IClientVirtualDeviceSet_GetConfiguration(This,dwTimeOut,pCfg) \ - ( (This)->lpVtbl -> GetConfiguration(This,dwTimeOut,pCfg) ) + ( (This)->lpVtbl -> GetConfiguration(This,dwTimeOut,pCfg) ) #define IClientVirtualDeviceSet_OpenDevice(This,lpName,ppVirtualDevice) \ - ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) + ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) #define IClientVirtualDeviceSet_Close(This) \ - ( (This)->lpVtbl -> Close(This) ) + ( (This)->lpVtbl -> Close(This) ) #define IClientVirtualDeviceSet_SignalAbort(This) \ - ( (This)->lpVtbl -> SignalAbort(This) ) + ( (This)->lpVtbl -> SignalAbort(This) ) #define IClientVirtualDeviceSet_OpenInSecondary(This,lpSetName) \ - ( (This)->lpVtbl -> OpenInSecondary(This,lpSetName) ) + ( (This)->lpVtbl -> OpenInSecondary(This,lpSetName) ) #define IClientVirtualDeviceSet_GetBufferHandle(This,pBuffer,pBufferHandle) \ - ( (This)->lpVtbl -> GetBufferHandle(This,pBuffer,pBufferHandle) ) + ( (This)->lpVtbl -> GetBufferHandle(This,pBuffer,pBufferHandle) ) #define IClientVirtualDeviceSet_MapBufferHandle(This,dwBuffer,ppBuffer) \ - ( (This)->lpVtbl -> MapBufferHandle(This,dwBuffer,ppBuffer) ) + ( (This)->lpVtbl -> MapBufferHandle(This,dwBuffer,ppBuffer) ) #endif /* COBJMACROS */ @@ -440,7 +440,7 @@ EXTERN_C const IID IID_IClientVirtualDeviceSet; -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_Create_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_Create_Proxy( IClientVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName, /* [in] */ struct VDConfig *pCfg); @@ -453,7 +453,7 @@ void __RPC_STUB IClientVirtualDeviceSet_Create_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_GetConfiguration_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_GetConfiguration_Proxy( IClientVirtualDeviceSet * This, /* [in] */ DWORD dwTimeOut, /* [out] */ struct VDConfig *pCfg); @@ -466,7 +466,7 @@ void __RPC_STUB IClientVirtualDeviceSet_GetConfiguration_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_OpenDevice_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_OpenDevice_Proxy( IClientVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName, /* [out] */ IClientVirtualDevice **ppVirtualDevice); @@ -479,7 +479,7 @@ void __RPC_STUB IClientVirtualDeviceSet_OpenDevice_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_Close_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_Close_Proxy( IClientVirtualDeviceSet * This); @@ -490,7 +490,7 @@ void __RPC_STUB IClientVirtualDeviceSet_Close_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_SignalAbort_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_SignalAbort_Proxy( IClientVirtualDeviceSet * This); @@ -501,7 +501,7 @@ void __RPC_STUB IClientVirtualDeviceSet_SignalAbort_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_OpenInSecondary_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_OpenInSecondary_Proxy( IClientVirtualDeviceSet * This, /* [in] */ LPCWSTR lpSetName); @@ -513,7 +513,7 @@ void __RPC_STUB IClientVirtualDeviceSet_OpenInSecondary_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_GetBufferHandle_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_GetBufferHandle_Proxy( IClientVirtualDeviceSet * This, /* [in] */ BYTE *pBuffer, /* [out] */ DWORD *pBufferHandle); @@ -526,7 +526,7 @@ void __RPC_STUB IClientVirtualDeviceSet_GetBufferHandle_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_MapBufferHandle_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet_MapBufferHandle_Proxy( IClientVirtualDeviceSet * This, /* [in] */ DWORD dwBuffer, /* [out] */ BYTE **ppBuffer); @@ -547,92 +547,92 @@ void __RPC_STUB IClientVirtualDeviceSet_MapBufferHandle_Stub( #define __IClientVirtualDeviceSet2_INTERFACE_DEFINED__ /* interface IClientVirtualDeviceSet2 */ -/* [object][uuid] */ +/* [object][uuid] */ EXTERN_C const IID IID_IClientVirtualDeviceSet2; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("d0e6eb07-7a62-11d2-8573-00c04fc21759") IClientVirtualDeviceSet2 : public IClientVirtualDeviceSet { public: - virtual HRESULT STDMETHODCALLTYPE CreateEx( + virtual HRESULT STDMETHODCALLTYPE CreateEx( /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpName, /* [in] */ struct VDConfig *pCfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenInSecondaryEx( + + virtual HRESULT STDMETHODCALLTYPE OpenInSecondaryEx( /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpSetName) = 0; - + }; - + #else /* C style interface */ typedef struct IClientVirtualDeviceSet2Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IClientVirtualDeviceSet2 * This, /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ + /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + ULONG ( STDMETHODCALLTYPE *AddRef )( IClientVirtualDeviceSet2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + ULONG ( STDMETHODCALLTYPE *Release )( IClientVirtualDeviceSet2 * This); - - HRESULT ( STDMETHODCALLTYPE *Create )( + + HRESULT ( STDMETHODCALLTYPE *Create )( IClientVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpName, /* [in] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( + + HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( IClientVirtualDeviceSet2 * This, /* [in] */ DWORD dwTimeOut, /* [out] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *OpenDevice )( + + HRESULT ( STDMETHODCALLTYPE *OpenDevice )( IClientVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpName, /* [out] */ IClientVirtualDevice **ppVirtualDevice); - - HRESULT ( STDMETHODCALLTYPE *Close )( + + HRESULT ( STDMETHODCALLTYPE *Close )( IClientVirtualDeviceSet2 * This); - - HRESULT ( STDMETHODCALLTYPE *SignalAbort )( + + HRESULT ( STDMETHODCALLTYPE *SignalAbort )( IClientVirtualDeviceSet2 * This); - - HRESULT ( STDMETHODCALLTYPE *OpenInSecondary )( + + HRESULT ( STDMETHODCALLTYPE *OpenInSecondary )( IClientVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpSetName); - - HRESULT ( STDMETHODCALLTYPE *GetBufferHandle )( + + HRESULT ( STDMETHODCALLTYPE *GetBufferHandle )( IClientVirtualDeviceSet2 * This, /* [in] */ BYTE *pBuffer, /* [out] */ DWORD *pBufferHandle); - - HRESULT ( STDMETHODCALLTYPE *MapBufferHandle )( + + HRESULT ( STDMETHODCALLTYPE *MapBufferHandle )( IClientVirtualDeviceSet2 * This, /* [in] */ DWORD dwBuffer, /* [out] */ BYTE **ppBuffer); - - HRESULT ( STDMETHODCALLTYPE *CreateEx )( + + HRESULT ( STDMETHODCALLTYPE *CreateEx )( IClientVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpName, /* [in] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *OpenInSecondaryEx )( + + HRESULT ( STDMETHODCALLTYPE *OpenInSecondaryEx )( IClientVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpSetName); - + END_INTERFACE } IClientVirtualDeviceSet2Vtbl; @@ -641,51 +641,51 @@ EXTERN_C const IID IID_IClientVirtualDeviceSet2; CONST_VTBL struct IClientVirtualDeviceSet2Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IClientVirtualDeviceSet2_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IClientVirtualDeviceSet2_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IClientVirtualDeviceSet2_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IClientVirtualDeviceSet2_Create(This,lpName,pCfg) \ - ( (This)->lpVtbl -> Create(This,lpName,pCfg) ) + ( (This)->lpVtbl -> Create(This,lpName,pCfg) ) #define IClientVirtualDeviceSet2_GetConfiguration(This,dwTimeOut,pCfg) \ - ( (This)->lpVtbl -> GetConfiguration(This,dwTimeOut,pCfg) ) + ( (This)->lpVtbl -> GetConfiguration(This,dwTimeOut,pCfg) ) #define IClientVirtualDeviceSet2_OpenDevice(This,lpName,ppVirtualDevice) \ - ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) + ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) #define IClientVirtualDeviceSet2_Close(This) \ - ( (This)->lpVtbl -> Close(This) ) + ( (This)->lpVtbl -> Close(This) ) #define IClientVirtualDeviceSet2_SignalAbort(This) \ - ( (This)->lpVtbl -> SignalAbort(This) ) + ( (This)->lpVtbl -> SignalAbort(This) ) #define IClientVirtualDeviceSet2_OpenInSecondary(This,lpSetName) \ - ( (This)->lpVtbl -> OpenInSecondary(This,lpSetName) ) + ( (This)->lpVtbl -> OpenInSecondary(This,lpSetName) ) #define IClientVirtualDeviceSet2_GetBufferHandle(This,pBuffer,pBufferHandle) \ - ( (This)->lpVtbl -> GetBufferHandle(This,pBuffer,pBufferHandle) ) + ( (This)->lpVtbl -> GetBufferHandle(This,pBuffer,pBufferHandle) ) #define IClientVirtualDeviceSet2_MapBufferHandle(This,dwBuffer,ppBuffer) \ - ( (This)->lpVtbl -> MapBufferHandle(This,dwBuffer,ppBuffer) ) + ( (This)->lpVtbl -> MapBufferHandle(This,dwBuffer,ppBuffer) ) #define IClientVirtualDeviceSet2_CreateEx(This,lpInstanceName,lpName,pCfg) \ - ( (This)->lpVtbl -> CreateEx(This,lpInstanceName,lpName,pCfg) ) + ( (This)->lpVtbl -> CreateEx(This,lpInstanceName,lpName,pCfg) ) #define IClientVirtualDeviceSet2_OpenInSecondaryEx(This,lpInstanceName,lpSetName) \ - ( (This)->lpVtbl -> OpenInSecondaryEx(This,lpInstanceName,lpSetName) ) + ( (This)->lpVtbl -> OpenInSecondaryEx(This,lpInstanceName,lpSetName) ) #endif /* COBJMACROS */ @@ -694,7 +694,7 @@ EXTERN_C const IID IID_IClientVirtualDeviceSet2; -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet2_CreateEx_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet2_CreateEx_Proxy( IClientVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpName, @@ -708,7 +708,7 @@ void __RPC_STUB IClientVirtualDeviceSet2_CreateEx_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet2_OpenInSecondaryEx_Proxy( +HRESULT STDMETHODCALLTYPE IClientVirtualDeviceSet2_OpenInSecondaryEx_Proxy( IClientVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpSetName); @@ -726,7 +726,7 @@ void __RPC_STUB IClientVirtualDeviceSet2_OpenInSecondaryEx_Stub( /* interface __MIDL_itf_vdi_0000_0003 */ -/* [local] */ +/* [local] */ struct VDS_Command { @@ -749,49 +749,49 @@ extern RPC_IF_HANDLE __MIDL_itf_vdi_0000_0003_v0_0_s_ifspec; #define __IServerVirtualDevice_INTERFACE_DEFINED__ /* interface IServerVirtualDevice */ -/* [object][uuid] */ +/* [object][uuid] */ EXTERN_C const IID IID_IServerVirtualDevice; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("b5e7a131-a7bd-11d1-84c2-00c04fc21759") IServerVirtualDevice : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE SendCommand( + virtual HRESULT STDMETHODCALLTYPE SendCommand( /* [in] */ struct VDS_Command *pCmd) = 0; - + virtual HRESULT STDMETHODCALLTYPE CloseDevice( void) = 0; - + }; - + #else /* C style interface */ typedef struct IServerVirtualDeviceVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IServerVirtualDevice * This, /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ + /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + ULONG ( STDMETHODCALLTYPE *AddRef )( IServerVirtualDevice * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + ULONG ( STDMETHODCALLTYPE *Release )( IServerVirtualDevice * This); - - HRESULT ( STDMETHODCALLTYPE *SendCommand )( + + HRESULT ( STDMETHODCALLTYPE *SendCommand )( IServerVirtualDevice * This, /* [in] */ struct VDS_Command *pCmd); - - HRESULT ( STDMETHODCALLTYPE *CloseDevice )( + + HRESULT ( STDMETHODCALLTYPE *CloseDevice )( IServerVirtualDevice * This); - + END_INTERFACE } IServerVirtualDeviceVtbl; @@ -800,26 +800,26 @@ EXTERN_C const IID IID_IServerVirtualDevice; CONST_VTBL struct IServerVirtualDeviceVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IServerVirtualDevice_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IServerVirtualDevice_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IServerVirtualDevice_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IServerVirtualDevice_SendCommand(This,pCmd) \ - ( (This)->lpVtbl -> SendCommand(This,pCmd) ) + ( (This)->lpVtbl -> SendCommand(This,pCmd) ) #define IServerVirtualDevice_CloseDevice(This) \ - ( (This)->lpVtbl -> CloseDevice(This) ) + ( (This)->lpVtbl -> CloseDevice(This) ) #endif /* COBJMACROS */ @@ -828,7 +828,7 @@ EXTERN_C const IID IID_IServerVirtualDevice; -HRESULT STDMETHODCALLTYPE IServerVirtualDevice_SendCommand_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDevice_SendCommand_Proxy( IServerVirtualDevice * This, /* [in] */ struct VDS_Command *pCmd); @@ -840,7 +840,7 @@ void __RPC_STUB IServerVirtualDevice_SendCommand_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDevice_CloseDevice_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDevice_CloseDevice_Proxy( IServerVirtualDevice * This); @@ -859,109 +859,109 @@ void __RPC_STUB IServerVirtualDevice_CloseDevice_Stub( #define __IServerVirtualDeviceSet_INTERFACE_DEFINED__ /* interface IServerVirtualDeviceSet */ -/* [object][uuid] */ +/* [object][uuid] */ EXTERN_C const IID IID_IServerVirtualDeviceSet; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("b5e7a132-a7bd-11d1-84c2-00c04fc21759") IServerVirtualDeviceSet : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Open( + virtual HRESULT STDMETHODCALLTYPE Open( /* [in] */ LPCWSTR lpName) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetConfiguration( + + virtual HRESULT STDMETHODCALLTYPE GetConfiguration( /* [out] */ struct VDConfig *pCfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetConfiguration( + + virtual HRESULT STDMETHODCALLTYPE SetConfiguration( /* [in] */ struct VDConfig *pCfg) = 0; - + virtual HRESULT STDMETHODCALLTYPE ExecuteCompletionAgent( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenDevice( + + virtual HRESULT STDMETHODCALLTYPE OpenDevice( /* [in] */ LPCWSTR lpName, /* [out] */ IServerVirtualDevice **ppVirtualDevice) = 0; - - virtual HRESULT STDMETHODCALLTYPE AllocateBuffer( + + virtual HRESULT STDMETHODCALLTYPE AllocateBuffer( /* [out] */ BYTE **ppBuffer, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment) = 0; - - virtual HRESULT STDMETHODCALLTYPE FreeBuffer( + + virtual HRESULT STDMETHODCALLTYPE FreeBuffer( /* [in] */ BYTE *pBuffer, /* [in] */ DWORD dwSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsSharedBuffer( + + virtual HRESULT STDMETHODCALLTYPE IsSharedBuffer( /* [in] */ BYTE *pBuffer) = 0; - + virtual HRESULT STDMETHODCALLTYPE SignalAbort( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; - + }; - + #else /* C style interface */ typedef struct IServerVirtualDeviceSetVtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IServerVirtualDeviceSet * This, /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ + /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + ULONG ( STDMETHODCALLTYPE *AddRef )( IServerVirtualDeviceSet * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + ULONG ( STDMETHODCALLTYPE *Release )( IServerVirtualDeviceSet * This); - - HRESULT ( STDMETHODCALLTYPE *Open )( + + HRESULT ( STDMETHODCALLTYPE *Open )( IServerVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName); - - HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( + + HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( IServerVirtualDeviceSet * This, /* [out] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *SetConfiguration )( + + HRESULT ( STDMETHODCALLTYPE *SetConfiguration )( IServerVirtualDeviceSet * This, /* [in] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *ExecuteCompletionAgent )( + + HRESULT ( STDMETHODCALLTYPE *ExecuteCompletionAgent )( IServerVirtualDeviceSet * This); - - HRESULT ( STDMETHODCALLTYPE *OpenDevice )( + + HRESULT ( STDMETHODCALLTYPE *OpenDevice )( IServerVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName, /* [out] */ IServerVirtualDevice **ppVirtualDevice); - - HRESULT ( STDMETHODCALLTYPE *AllocateBuffer )( + + HRESULT ( STDMETHODCALLTYPE *AllocateBuffer )( IServerVirtualDeviceSet * This, /* [out] */ BYTE **ppBuffer, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment); - - HRESULT ( STDMETHODCALLTYPE *FreeBuffer )( + + HRESULT ( STDMETHODCALLTYPE *FreeBuffer )( IServerVirtualDeviceSet * This, /* [in] */ BYTE *pBuffer, /* [in] */ DWORD dwSize); - - HRESULT ( STDMETHODCALLTYPE *IsSharedBuffer )( + + HRESULT ( STDMETHODCALLTYPE *IsSharedBuffer )( IServerVirtualDeviceSet * This, /* [in] */ BYTE *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *SignalAbort )( + + HRESULT ( STDMETHODCALLTYPE *SignalAbort )( IServerVirtualDeviceSet * This); - - HRESULT ( STDMETHODCALLTYPE *Close )( + + HRESULT ( STDMETHODCALLTYPE *Close )( IServerVirtualDeviceSet * This); - + END_INTERFACE } IServerVirtualDeviceSetVtbl; @@ -970,50 +970,50 @@ EXTERN_C const IID IID_IServerVirtualDeviceSet; CONST_VTBL struct IServerVirtualDeviceSetVtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IServerVirtualDeviceSet_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IServerVirtualDeviceSet_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IServerVirtualDeviceSet_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IServerVirtualDeviceSet_Open(This,lpName) \ - ( (This)->lpVtbl -> Open(This,lpName) ) + ( (This)->lpVtbl -> Open(This,lpName) ) #define IServerVirtualDeviceSet_GetConfiguration(This,pCfg) \ - ( (This)->lpVtbl -> GetConfiguration(This,pCfg) ) + ( (This)->lpVtbl -> GetConfiguration(This,pCfg) ) #define IServerVirtualDeviceSet_SetConfiguration(This,pCfg) \ - ( (This)->lpVtbl -> SetConfiguration(This,pCfg) ) + ( (This)->lpVtbl -> SetConfiguration(This,pCfg) ) #define IServerVirtualDeviceSet_ExecuteCompletionAgent(This) \ - ( (This)->lpVtbl -> ExecuteCompletionAgent(This) ) + ( (This)->lpVtbl -> ExecuteCompletionAgent(This) ) #define IServerVirtualDeviceSet_OpenDevice(This,lpName,ppVirtualDevice) \ - ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) + ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) #define IServerVirtualDeviceSet_AllocateBuffer(This,ppBuffer,dwSize,dwAlignment) \ - ( (This)->lpVtbl -> AllocateBuffer(This,ppBuffer,dwSize,dwAlignment) ) + ( (This)->lpVtbl -> AllocateBuffer(This,ppBuffer,dwSize,dwAlignment) ) #define IServerVirtualDeviceSet_FreeBuffer(This,pBuffer,dwSize) \ - ( (This)->lpVtbl -> FreeBuffer(This,pBuffer,dwSize) ) + ( (This)->lpVtbl -> FreeBuffer(This,pBuffer,dwSize) ) #define IServerVirtualDeviceSet_IsSharedBuffer(This,pBuffer) \ - ( (This)->lpVtbl -> IsSharedBuffer(This,pBuffer) ) + ( (This)->lpVtbl -> IsSharedBuffer(This,pBuffer) ) #define IServerVirtualDeviceSet_SignalAbort(This) \ - ( (This)->lpVtbl -> SignalAbort(This) ) + ( (This)->lpVtbl -> SignalAbort(This) ) #define IServerVirtualDeviceSet_Close(This) \ - ( (This)->lpVtbl -> Close(This) ) + ( (This)->lpVtbl -> Close(This) ) #endif /* COBJMACROS */ @@ -1022,7 +1022,7 @@ EXTERN_C const IID IID_IServerVirtualDeviceSet; -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_Open_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_Open_Proxy( IServerVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName); @@ -1034,7 +1034,7 @@ void __RPC_STUB IServerVirtualDeviceSet_Open_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_GetConfiguration_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_GetConfiguration_Proxy( IServerVirtualDeviceSet * This, /* [out] */ struct VDConfig *pCfg); @@ -1046,7 +1046,7 @@ void __RPC_STUB IServerVirtualDeviceSet_GetConfiguration_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_SetConfiguration_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_SetConfiguration_Proxy( IServerVirtualDeviceSet * This, /* [in] */ struct VDConfig *pCfg); @@ -1058,7 +1058,7 @@ void __RPC_STUB IServerVirtualDeviceSet_SetConfiguration_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_ExecuteCompletionAgent_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_ExecuteCompletionAgent_Proxy( IServerVirtualDeviceSet * This); @@ -1069,7 +1069,7 @@ void __RPC_STUB IServerVirtualDeviceSet_ExecuteCompletionAgent_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_OpenDevice_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_OpenDevice_Proxy( IServerVirtualDeviceSet * This, /* [in] */ LPCWSTR lpName, /* [out] */ IServerVirtualDevice **ppVirtualDevice); @@ -1082,7 +1082,7 @@ void __RPC_STUB IServerVirtualDeviceSet_OpenDevice_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_AllocateBuffer_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_AllocateBuffer_Proxy( IServerVirtualDeviceSet * This, /* [out] */ BYTE **ppBuffer, /* [in] */ DWORD dwSize, @@ -1096,7 +1096,7 @@ void __RPC_STUB IServerVirtualDeviceSet_AllocateBuffer_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_FreeBuffer_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_FreeBuffer_Proxy( IServerVirtualDeviceSet * This, /* [in] */ BYTE *pBuffer, /* [in] */ DWORD dwSize); @@ -1109,7 +1109,7 @@ void __RPC_STUB IServerVirtualDeviceSet_FreeBuffer_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_IsSharedBuffer_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_IsSharedBuffer_Proxy( IServerVirtualDeviceSet * This, /* [in] */ BYTE *pBuffer); @@ -1121,7 +1121,7 @@ void __RPC_STUB IServerVirtualDeviceSet_IsSharedBuffer_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_SignalAbort_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_SignalAbort_Proxy( IServerVirtualDeviceSet * This); @@ -1132,7 +1132,7 @@ void __RPC_STUB IServerVirtualDeviceSet_SignalAbort_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_Close_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet_Close_Proxy( IServerVirtualDeviceSet * This); @@ -1151,146 +1151,146 @@ void __RPC_STUB IServerVirtualDeviceSet_Close_Stub( #define __IServerVirtualDeviceSet2_INTERFACE_DEFINED__ /* interface IServerVirtualDeviceSet2 */ -/* [object][uuid] */ +/* [object][uuid] */ EXTERN_C const IID IID_IServerVirtualDeviceSet2; #if defined(__cplusplus) && !defined(CINTERFACE) - + MIDL_INTERFACE("AECBD0D6-24C6-11d3-85B7-00C04FC21759") IServerVirtualDeviceSet2 : public IUnknown { public: - virtual HRESULT STDMETHODCALLTYPE Open( + virtual HRESULT STDMETHODCALLTYPE Open( /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpSetName) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetConfiguration( + + virtual HRESULT STDMETHODCALLTYPE GetConfiguration( /* [out] */ struct VDConfig *pCfg) = 0; - - virtual HRESULT STDMETHODCALLTYPE BeginConfiguration( + + virtual HRESULT STDMETHODCALLTYPE BeginConfiguration( /* [in] */ DWORD dwFeatures, /* [in] */ DWORD dwBlockSize, /* [in] */ DWORD dwAlignment, /* [in] */ DWORD dwMaxTransferSize, /* [in] */ DWORD dwTimeout) = 0; - + virtual HRESULT STDMETHODCALLTYPE EndConfiguration( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE RequestBuffers( + + virtual HRESULT STDMETHODCALLTYPE RequestBuffers( /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment, /* [in] */ DWORD dwCount) = 0; - - virtual HRESULT STDMETHODCALLTYPE QueryAvailableBuffers( + + virtual HRESULT STDMETHODCALLTYPE QueryAvailableBuffers( /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment, /* [out] */ DWORD *pCount) = 0; - + virtual HRESULT STDMETHODCALLTYPE ExecuteCompletionAgent( void) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenDevice( + + virtual HRESULT STDMETHODCALLTYPE OpenDevice( /* [in] */ LPCWSTR lpName, /* [out] */ IServerVirtualDevice **ppVirtualDevice) = 0; - - virtual HRESULT STDMETHODCALLTYPE AllocateBuffer( + + virtual HRESULT STDMETHODCALLTYPE AllocateBuffer( /* [out] */ BYTE **ppBuffer, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment) = 0; - - virtual HRESULT STDMETHODCALLTYPE FreeBuffer( + + virtual HRESULT STDMETHODCALLTYPE FreeBuffer( /* [in] */ BYTE *pBuffer, /* [in] */ DWORD dwSize) = 0; - - virtual HRESULT STDMETHODCALLTYPE IsSharedBuffer( + + virtual HRESULT STDMETHODCALLTYPE IsSharedBuffer( /* [in] */ BYTE *pBuffer) = 0; - + virtual HRESULT STDMETHODCALLTYPE SignalAbort( void) = 0; - + virtual HRESULT STDMETHODCALLTYPE Close( void) = 0; - + }; - + #else /* C style interface */ typedef struct IServerVirtualDeviceSet2Vtbl { BEGIN_INTERFACE - - HRESULT ( STDMETHODCALLTYPE *QueryInterface )( + + HRESULT ( STDMETHODCALLTYPE *QueryInterface )( IServerVirtualDeviceSet2 * This, /* [in] */ REFIID riid, - /* [annotation][iid_is][out] */ + /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject); - - ULONG ( STDMETHODCALLTYPE *AddRef )( + + ULONG ( STDMETHODCALLTYPE *AddRef )( IServerVirtualDeviceSet2 * This); - - ULONG ( STDMETHODCALLTYPE *Release )( + + ULONG ( STDMETHODCALLTYPE *Release )( IServerVirtualDeviceSet2 * This); - - HRESULT ( STDMETHODCALLTYPE *Open )( + + HRESULT ( STDMETHODCALLTYPE *Open )( IServerVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpSetName); - - HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( + + HRESULT ( STDMETHODCALLTYPE *GetConfiguration )( IServerVirtualDeviceSet2 * This, /* [out] */ struct VDConfig *pCfg); - - HRESULT ( STDMETHODCALLTYPE *BeginConfiguration )( + + HRESULT ( STDMETHODCALLTYPE *BeginConfiguration )( IServerVirtualDeviceSet2 * This, /* [in] */ DWORD dwFeatures, /* [in] */ DWORD dwBlockSize, /* [in] */ DWORD dwAlignment, /* [in] */ DWORD dwMaxTransferSize, /* [in] */ DWORD dwTimeout); - - HRESULT ( STDMETHODCALLTYPE *EndConfiguration )( + + HRESULT ( STDMETHODCALLTYPE *EndConfiguration )( IServerVirtualDeviceSet2 * This); - - HRESULT ( STDMETHODCALLTYPE *RequestBuffers )( + + HRESULT ( STDMETHODCALLTYPE *RequestBuffers )( IServerVirtualDeviceSet2 * This, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment, /* [in] */ DWORD dwCount); - - HRESULT ( STDMETHODCALLTYPE *QueryAvailableBuffers )( + + HRESULT ( STDMETHODCALLTYPE *QueryAvailableBuffers )( IServerVirtualDeviceSet2 * This, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment, /* [out] */ DWORD *pCount); - - HRESULT ( STDMETHODCALLTYPE *ExecuteCompletionAgent )( + + HRESULT ( STDMETHODCALLTYPE *ExecuteCompletionAgent )( IServerVirtualDeviceSet2 * This); - - HRESULT ( STDMETHODCALLTYPE *OpenDevice )( + + HRESULT ( STDMETHODCALLTYPE *OpenDevice )( IServerVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpName, /* [out] */ IServerVirtualDevice **ppVirtualDevice); - - HRESULT ( STDMETHODCALLTYPE *AllocateBuffer )( + + HRESULT ( STDMETHODCALLTYPE *AllocateBuffer )( IServerVirtualDeviceSet2 * This, /* [out] */ BYTE **ppBuffer, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment); - - HRESULT ( STDMETHODCALLTYPE *FreeBuffer )( + + HRESULT ( STDMETHODCALLTYPE *FreeBuffer )( IServerVirtualDeviceSet2 * This, /* [in] */ BYTE *pBuffer, /* [in] */ DWORD dwSize); - - HRESULT ( STDMETHODCALLTYPE *IsSharedBuffer )( + + HRESULT ( STDMETHODCALLTYPE *IsSharedBuffer )( IServerVirtualDeviceSet2 * This, /* [in] */ BYTE *pBuffer); - - HRESULT ( STDMETHODCALLTYPE *SignalAbort )( + + HRESULT ( STDMETHODCALLTYPE *SignalAbort )( IServerVirtualDeviceSet2 * This); - - HRESULT ( STDMETHODCALLTYPE *Close )( + + HRESULT ( STDMETHODCALLTYPE *Close )( IServerVirtualDeviceSet2 * This); - + END_INTERFACE } IServerVirtualDeviceSet2Vtbl; @@ -1299,59 +1299,59 @@ EXTERN_C const IID IID_IServerVirtualDeviceSet2; CONST_VTBL struct IServerVirtualDeviceSet2Vtbl *lpVtbl; }; - + #ifdef COBJMACROS #define IServerVirtualDeviceSet2_QueryInterface(This,riid,ppvObject) \ - ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) + ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) ) #define IServerVirtualDeviceSet2_AddRef(This) \ - ( (This)->lpVtbl -> AddRef(This) ) + ( (This)->lpVtbl -> AddRef(This) ) #define IServerVirtualDeviceSet2_Release(This) \ - ( (This)->lpVtbl -> Release(This) ) + ( (This)->lpVtbl -> Release(This) ) #define IServerVirtualDeviceSet2_Open(This,lpInstanceName,lpSetName) \ - ( (This)->lpVtbl -> Open(This,lpInstanceName,lpSetName) ) + ( (This)->lpVtbl -> Open(This,lpInstanceName,lpSetName) ) #define IServerVirtualDeviceSet2_GetConfiguration(This,pCfg) \ - ( (This)->lpVtbl -> GetConfiguration(This,pCfg) ) + ( (This)->lpVtbl -> GetConfiguration(This,pCfg) ) #define IServerVirtualDeviceSet2_BeginConfiguration(This,dwFeatures,dwBlockSize,dwAlignment,dwMaxTransferSize,dwTimeout) \ - ( (This)->lpVtbl -> BeginConfiguration(This,dwFeatures,dwBlockSize,dwAlignment,dwMaxTransferSize,dwTimeout) ) + ( (This)->lpVtbl -> BeginConfiguration(This,dwFeatures,dwBlockSize,dwAlignment,dwMaxTransferSize,dwTimeout) ) #define IServerVirtualDeviceSet2_EndConfiguration(This) \ - ( (This)->lpVtbl -> EndConfiguration(This) ) + ( (This)->lpVtbl -> EndConfiguration(This) ) #define IServerVirtualDeviceSet2_RequestBuffers(This,dwSize,dwAlignment,dwCount) \ - ( (This)->lpVtbl -> RequestBuffers(This,dwSize,dwAlignment,dwCount) ) + ( (This)->lpVtbl -> RequestBuffers(This,dwSize,dwAlignment,dwCount) ) #define IServerVirtualDeviceSet2_QueryAvailableBuffers(This,dwSize,dwAlignment,pCount) \ - ( (This)->lpVtbl -> QueryAvailableBuffers(This,dwSize,dwAlignment,pCount) ) + ( (This)->lpVtbl -> QueryAvailableBuffers(This,dwSize,dwAlignment,pCount) ) #define IServerVirtualDeviceSet2_ExecuteCompletionAgent(This) \ - ( (This)->lpVtbl -> ExecuteCompletionAgent(This) ) + ( (This)->lpVtbl -> ExecuteCompletionAgent(This) ) #define IServerVirtualDeviceSet2_OpenDevice(This,lpName,ppVirtualDevice) \ - ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) + ( (This)->lpVtbl -> OpenDevice(This,lpName,ppVirtualDevice) ) #define IServerVirtualDeviceSet2_AllocateBuffer(This,ppBuffer,dwSize,dwAlignment) \ - ( (This)->lpVtbl -> AllocateBuffer(This,ppBuffer,dwSize,dwAlignment) ) + ( (This)->lpVtbl -> AllocateBuffer(This,ppBuffer,dwSize,dwAlignment) ) #define IServerVirtualDeviceSet2_FreeBuffer(This,pBuffer,dwSize) \ - ( (This)->lpVtbl -> FreeBuffer(This,pBuffer,dwSize) ) + ( (This)->lpVtbl -> FreeBuffer(This,pBuffer,dwSize) ) #define IServerVirtualDeviceSet2_IsSharedBuffer(This,pBuffer) \ - ( (This)->lpVtbl -> IsSharedBuffer(This,pBuffer) ) + ( (This)->lpVtbl -> IsSharedBuffer(This,pBuffer) ) #define IServerVirtualDeviceSet2_SignalAbort(This) \ - ( (This)->lpVtbl -> SignalAbort(This) ) + ( (This)->lpVtbl -> SignalAbort(This) ) #define IServerVirtualDeviceSet2_Close(This) \ - ( (This)->lpVtbl -> Close(This) ) + ( (This)->lpVtbl -> Close(This) ) #endif /* COBJMACROS */ @@ -1360,7 +1360,7 @@ EXTERN_C const IID IID_IServerVirtualDeviceSet2; -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_Open_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_Open_Proxy( IServerVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpInstanceName, /* [in] */ LPCWSTR lpSetName); @@ -1373,7 +1373,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_Open_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_GetConfiguration_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_GetConfiguration_Proxy( IServerVirtualDeviceSet2 * This, /* [out] */ struct VDConfig *pCfg); @@ -1385,7 +1385,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_GetConfiguration_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_BeginConfiguration_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_BeginConfiguration_Proxy( IServerVirtualDeviceSet2 * This, /* [in] */ DWORD dwFeatures, /* [in] */ DWORD dwBlockSize, @@ -1401,7 +1401,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_BeginConfiguration_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_EndConfiguration_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_EndConfiguration_Proxy( IServerVirtualDeviceSet2 * This); @@ -1412,7 +1412,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_EndConfiguration_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_RequestBuffers_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_RequestBuffers_Proxy( IServerVirtualDeviceSet2 * This, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment, @@ -1426,7 +1426,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_RequestBuffers_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_QueryAvailableBuffers_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_QueryAvailableBuffers_Proxy( IServerVirtualDeviceSet2 * This, /* [in] */ DWORD dwSize, /* [in] */ DWORD dwAlignment, @@ -1440,7 +1440,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_QueryAvailableBuffers_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_ExecuteCompletionAgent_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_ExecuteCompletionAgent_Proxy( IServerVirtualDeviceSet2 * This); @@ -1451,7 +1451,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_ExecuteCompletionAgent_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_OpenDevice_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_OpenDevice_Proxy( IServerVirtualDeviceSet2 * This, /* [in] */ LPCWSTR lpName, /* [out] */ IServerVirtualDevice **ppVirtualDevice); @@ -1464,7 +1464,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_OpenDevice_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_AllocateBuffer_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_AllocateBuffer_Proxy( IServerVirtualDeviceSet2 * This, /* [out] */ BYTE **ppBuffer, /* [in] */ DWORD dwSize, @@ -1478,7 +1478,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_AllocateBuffer_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_FreeBuffer_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_FreeBuffer_Proxy( IServerVirtualDeviceSet2 * This, /* [in] */ BYTE *pBuffer, /* [in] */ DWORD dwSize); @@ -1491,7 +1491,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_FreeBuffer_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_IsSharedBuffer_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_IsSharedBuffer_Proxy( IServerVirtualDeviceSet2 * This, /* [in] */ BYTE *pBuffer); @@ -1503,7 +1503,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_IsSharedBuffer_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_SignalAbort_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_SignalAbort_Proxy( IServerVirtualDeviceSet2 * This); @@ -1514,7 +1514,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_SignalAbort_Stub( DWORD *_pdwStubPhase); -HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_Close_Proxy( +HRESULT STDMETHODCALLTYPE IServerVirtualDeviceSet2_Close_Proxy( IServerVirtualDeviceSet2 * This); @@ -1530,7 +1530,7 @@ void __RPC_STUB IServerVirtualDeviceSet2_Close_Stub( /* interface __MIDL_itf_vdi_0000_0006 */ -/* [local] */ +/* [local] */ const IID CLSID_WINFS_ClientVirtualDeviceSet = {0x50b99b13, 0x7b84, 0x44d3, {0x9c, 0x98, 0x26, 0x52, 0xbf, 0x14, 0x4d, 0x96}}; const IID CLSID_WINFS_ServerVirtualDeviceSet = {0x92e6b26b, 0x57da, 0x47ed, {0x81, 0x53, 0xdf, 0xf1, 0x87, 0xa7, 0x6d, 0xde}}; diff --git a/samples/features/sqlvdi/vdiguid.h b/samples/features/sqlvdi/vdiguid.h index d6b5c432..0a034566 100644 --- a/samples/features/sqlvdi/vdiguid.h +++ b/samples/features/sqlvdi/vdiguid.h @@ -15,7 +15,7 @@ #ifdef __cplusplus extern "C"{ -#endif +#endif #include @@ -99,8 +99,8 @@ MIDL_DEFINE_GUID(IID, IID_IServerVirtualDeviceSet2,0xAECBD0D6,0x24C6,0x11d3,0x85 /* Compiler settings for vdi.idl: Oicf, W1, Zp8, env=Win64 (32b run,appending) protocol : dce , ms_ext, c_ext, robust - error checks: allocation ref bounds_check enum stub_data - VC __declspec() decoration level: + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: __declspec(uuid()), __declspec(selectany), __declspec(novtable) DECLSPEC_UUID(), MIDL_INTERFACE() */ @@ -114,7 +114,7 @@ MIDL_DEFINE_GUID(IID, IID_IServerVirtualDeviceSet2,0xAECBD0D6,0x24C6,0x11d3,0x85 #ifdef __cplusplus extern "C"{ -#endif +#endif #include diff --git a/samples/features/sqlvss/README.md b/samples/features/sqlvss/README.md index 3ed7dcd9..c2f2eeef 100644 --- a/samples/features/sqlvss/README.md +++ b/samples/features/sqlvss/README.md @@ -1,6 +1,6 @@ -SQL Server VSS allows ISVs to develop backup solutions using APIs exposed by VSS framework. One such API method which is commonly used while performing differential backup using SQL VSS is IVssComponent::GetPartialFile. While performing differential backup, IVssComponent::GetPartialFile is used iteratively to obtain the range of changed differential bytes for backup which changed since last full backup. +SQL Server VSS allows ISVs to develop backup solutions using APIs exposed by VSS framework. One such API method which is commonly used while performing differential backup using SQL VSS is IVssComponent::GetPartialFile. While performing differential backup, IVssComponent::GetPartialFile is used iteratively to obtain the range of changed differential bytes for backup which changed since last full backup. -The output for *GetPartialFile* provides the file path, file name and pbstrRange which is a pointer to 64KB string buffer containing the comma-separated list of the form offset1:length1, offset2:length2, where each offset and length is a 64-bit integer specifying a file offset in bytes and length of the range in bytes, respectively. +The output for *GetPartialFile* provides the file path, file name and pbstrRange which is a pointer to 64KB string buffer containing the comma-separated list of the form offset1:length1, offset2:length2, where each offset and length is a 64-bit integer specifying a file offset in bytes and length of the range in bytes, respectively. If the changed pages within a partial file is large enough to fall outside the tracking range limit of the 64 bit string buffer, pbstrRange returns the filename containing those ranges instead of the range and offset within the current partial file. The ISV Backup code should be able to handle both the output for pbstrRange viz offset/length range string for backup range within the current file or filename containing the backup range if the range falls outside the current file. diff --git a/samples/features/sqlvss/sqlvss_generate_backup_filename_ranges_sample.sql b/samples/features/sqlvss/sqlvss_generate_backup_filename_ranges_sample.sql index 9d1e92f1..cad2ef19 100644 --- a/samples/features/sqlvss/sqlvss_generate_backup_filename_ranges_sample.sql +++ b/samples/features/sqlvss/sqlvss_generate_backup_filename_ranges_sample.sql @@ -1,9 +1,9 @@ /* -DISCLAIMER: © 2016 Microsoft Corporation. All rights reserved. Sample scripts in this guide are not supported under any Microsoft standard support program or service. -The sample scripts are provided AS IS without warranty of any kind. Microsoft disclaims all implied warranties including, without limitation, any implied warranties -of merchantability or of fitness for a particular purpose. The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. -In no event shall Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever -(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or +DISCLAIMER: © 2016 Microsoft Corporation. All rights reserved. Sample scripts in this guide are not supported under any Microsoft standard support program or service. +The sample scripts are provided AS IS without warranty of any kind. Microsoft disclaims all implied warranties including, without limitation, any implied warranties +of merchantability or of fitness for a particular purpose. The entire risk arising out of the use or performance of the sample scripts and documentation remains with you. +In no event shall Microsoft, its authors, or anyone else involved in the creation, production, or delivery of the scripts be liable for any damages whatsoever +(including, without limitation, damages for loss of business profits, business interruption, loss of business information, or other pecuniary loss) arising out of the use of or inability to use the sample scripts or documentation, even if Microsoft has been advised of the possibility of such damages. */ @@ -16,7 +16,7 @@ use test; GO -- create a table such that each row is on a page create table tab - (ID INT IDENTITY NOT NULL PRIMARY KEY, + (ID INT IDENTITY NOT NULL PRIMARY KEY, BIGSTRING VARCHAR(7996) ); declare @dml NVARCHAR(300); --for query @@ -60,7 +60,7 @@ begin end --- Take differential backup here. +-- Take differential backup here. -- BETEST.exe /B /E /T DIFFERENTIAL /Pre backupdoc_full.txt /S backupdoc_diff.txt /D c:\tools\sqlbetest\backup\diff /C comp1_file.txt diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Continuous Column Values.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Continuous Column Values.dmx index ed6c1ccd..bea24754 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Continuous Column Values.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Continuous Column Values.dmx @@ -3,12 +3,12 @@ // // Returns the min, max, and // mean of a continuous column, -// or of the buckets of a +// or of the buckets of a // DISCRETIZED column // ========================== -SELECT DISTINCT - RangeMin([]) as [Min], - [] as [Mean], +SELECT DISTINCT + RangeMin([]) as [Min], + [] as [Mean], RangeMax([]) as [Max] FROM [] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Discrete Column Values.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Discrete Column Values.dmx index 89f924dd..e5a70538 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Discrete Column Values.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Discrete Column Values.dmx @@ -1,12 +1,12 @@ // ========================== // Discrete Column Values // -// Returns all values of a -// DISCRETE column. For +// Returns all values of a +// DISCRETE column. For // DISCRETIZED columns, use -// the Continuous Column +// the Continuous Column // Values template. // ========================== -SELECT DISTINCT [] +SELECT DISTINCT [] FROM [] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Drillthrough Query.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Drillthrough Query.dmx index 4ec36305..86a4959d 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Drillthrough Query.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Drillthrough Query.dmx @@ -2,7 +2,7 @@ // Drillthrough Query // ========================== -SELECT FROM MINING MODEL [].CASES WHERE IsTrainingCase() AND IsInNode('') diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Model Attributes.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Model Attributes.dmx index a211f7cd..84aa4f49 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Model Attributes.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Content/Model Attributes.dmx @@ -1,6 +1,6 @@ // ========================== // Model Attributes -// +// // returns the list of attributes // used by a model // ========================== diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Model.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Model.dmx index 09aa517b..24c57853 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Model.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Model.dmx @@ -2,4 +2,4 @@ // Clear Model Content // =============================== -DELETE FROM MINING MODEL [] +DELETE FROM MINING MODEL [] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Structure.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Structure.dmx index d722b1bd..8e71671c 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Structure.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Clear Structure.dmx @@ -1,5 +1,5 @@ // =============================== -// Clear Mining Structure +// Clear Mining Structure // =============================== DELETE FROM MINING STRUCTURE [] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure Nested.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure Nested.dmx index da470e96..fb9ef0d7 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure Nested.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure Nested.dmx @@ -9,7 +9,7 @@ CREATE MINING STRUCTURE []
    Home Country Odds Draw Odds Visiting CountryVisiting Country OddsVisiting Country Odds Game Date
    ( , ) -) -[WITH HOLDOUT ( -[OR ]) +) +[WITH HOLDOUT ( +[OR ]) [REPEATABLE()]] \ No newline at end of file diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure.dmx index 4070a9a6..504e47c2 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create Structure.dmx @@ -6,7 +6,7 @@ CREATE MINING STRUCTURE [] ( , -) -[WITH HOLDOUT ( -[OR ]) +) +[WITH HOLDOUT ( +[OR ]) [REPEATABLE()]] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create from PMML.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create from PMML.dmx index 55256ac8..27e12837 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create from PMML.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Create from PMML.dmx @@ -1,7 +1,7 @@ // =============================== // Create From PMML // -// Replace the string with PMML. +// Replace the string with PMML. // Single quotes embedded in the // PMML string must be doubled. // =============================== diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Model.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Model.dmx index 6c9e61c6..cce4f569 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Model.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Model.dmx @@ -3,5 +3,5 @@ // ========================== EXPORT MINING MODEL [] - TO '' + TO '' WITH DEPENDENCIES, PASSWORD='' diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Structure.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Structure.dmx index de288e09..5a6c2ae4 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Structure.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Export Structure.dmx @@ -3,5 +3,5 @@ // ========================== EXPORT MINING STRUCTURE [] - TO '' + TO '' WITH DEPENDENCIES, PASSWORD='' diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Import.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Import.dmx index 19ab3b17..6d318948 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Import.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Import.dmx @@ -2,5 +2,5 @@ // Import // ========================== -IMPORT FROM '' +IMPORT FROM '' WITH PASSWORD='' diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Model.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Model.dmx index 222e3ef7..d9501951 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Model.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Model.dmx @@ -1,7 +1,7 @@ // ========================== // Train Mining Model // -// Trains a model inside a +// Trains a model inside a // previously trained structure // ========================== diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Nested Structure.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Nested Structure.dmx index 802bcaed..9254df42 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Nested Structure.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Model Management/Train Nested Structure.dmx @@ -11,7 +11,7 @@ INSERT INTO MINING STRUCTURE [] SHAPE { OPENQUERY([],'') } APPEND -( +( {OPENQUERY([],'') } RELATE [] TO [] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Base Prediction.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Base Prediction.dmx index ba8fa520..746560de 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Base Prediction.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Base Prediction.dmx @@ -1,8 +1,8 @@ // ========================== -// Base Prediction +// Base Prediction // ========================== -SELECT FROM [] PREDICTION JOIN OPENQUERY([],'') diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Prediction.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Prediction.dmx index ba3a14cb..77076197 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Prediction.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Prediction.dmx @@ -1,10 +1,10 @@ // ========================== -// Nested Prediction +// Nested Prediction // ========================== -SELECT FROM [] PREDICTION JOIN -SHAPE +SHAPE { OPENQUERY([],'') } APPEND ( {OPENQUERY([],'')} diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Singleton Prediction.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Singleton Prediction.dmx index 45e48146..9dd9e984 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Singleton Prediction.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Nested Singleton Prediction.dmx @@ -1,11 +1,11 @@ // ========================== -// Nested Singleton Prediction +// Nested Singleton Prediction // ========================== SELECT ] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Singleton Prediction.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Singleton Prediction.dmx index c0440b35..3ad6382f 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Singleton Prediction.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Singleton Prediction.dmx @@ -1,8 +1,8 @@ // ========================== -// Singleton Prediction +// Singleton Prediction // ========================== -SELECT FROM [] NATURAL PREDICTION JOIN (SELECT '' AS [], ...) AS [] diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Stored Procedure Call.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Stored Procedure Call.dmx index 7cbc75df..7fc915a9 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Stored Procedure Call.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Prediction Queries/Stored Procedure Call.dmx @@ -1,6 +1,6 @@ // ========================== // Stored Procedure Call -// +// // namespace and class can be // omitted if the method is // unique within the assembly diff --git a/samples/features/ssms-templates/AnalysisServices/DMX/Structure Content/Test Cases.dmx b/samples/features/ssms-templates/AnalysisServices/DMX/Structure Content/Test Cases.dmx index 1312b522..28777595 100644 --- a/samples/features/ssms-templates/AnalysisServices/DMX/Structure Content/Test Cases.dmx +++ b/samples/features/ssms-templates/AnalysisServices/DMX/Structure Content/Test Cases.dmx @@ -2,6 +2,6 @@ // Test Structure Cases // =============================== -SELECT [FLATTENED] +SELECT [FLATTENED] FROM [].CASES WHERE IsTestCase() diff --git a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Fixed.mdx b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Fixed.mdx index 297f47c3..abec09c3 100644 --- a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Fixed.mdx +++ b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Fixed.mdx @@ -2,11 +2,11 @@ -- Moving Average - Fixed -- ============================================= -With - Member [Measures].[Fixed Moving Average] As - 'Avg ( - { ParallelPeriod (, , - .CurrentMember +With + Member [Measures].[Fixed Moving Average] As + 'Avg ( + { ParallelPeriod (, , + .CurrentMember ) : .CurrentMember }, [Measures]. )' Select {[Measures]., [Measures].[Fixed Moving Average]} on Columns, diff --git a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Variable.mdx b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Variable.mdx index ac343227..3d8e53a4 100644 --- a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Variable.mdx +++ b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Moving Average-Variable.mdx @@ -2,16 +2,16 @@ -- Moving Average - Variable -- ============================================= -With - Member [Measures].[Variable Moving Average] As +With + Member [Measures].[Variable Moving Average] As 'Avg( - .CurrentMember.Lag( + .CurrentMember.Lag( Case - When .CurrentMember.Level IS + When .CurrentMember.Level IS Then - When .CurrentMember.Level IS + When .CurrentMember.Level IS Then - When .CurrentMember.Level IS + When .CurrentMember.Level IS Then Else 0 End diff --git a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Periods to Date.mdx b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Periods to Date.mdx index 4ee561a6..df93d34e 100644 --- a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Periods to Date.mdx +++ b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Periods to Date.mdx @@ -2,12 +2,12 @@ -- Periods to Date -- ============================================= -With - Member [Measures].[PeriodsToDate] AS +With + Member [Measures].[PeriodsToDate] AS 'Sum ( PeriodsToDate ( , .CurrentMember ), [Measures]. - )' + )' Select {[Measures]., [Measures].[PeriodsToDate]} on Columns, on Rows diff --git a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Parent.mdx b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Parent.mdx index 3e1a08a7..65fcebb2 100644 --- a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Parent.mdx +++ b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Parent.mdx @@ -2,8 +2,8 @@ -- Ratio to Parent -- ============================================= -With - Member [Measures].[RatioToParent] AS +With + Member [Measures].[RatioToParent] AS '[Measures]. / ( [Measures]., .CurrentMember.Parent )', Format_String = 'Percent' diff --git a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Total.mdx b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Total.mdx index 8097e422..6f86d2d2 100644 --- a/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Total.mdx +++ b/samples/features/ssms-templates/AnalysisServices/MDX/Expressions/Ratio to Total.mdx @@ -2,8 +2,8 @@ -- Ratio to Total -- ============================================= -With - Member [Measures].[RatioToTotal] AS +With + Member [Measures].[RatioToTotal] AS '[Measures]. / ( [Measures]., . )', Format_String = 'Percent' diff --git a/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Calculated Member.mdx b/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Calculated Member.mdx index 621213ed..8fca2717 100644 --- a/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Calculated Member.mdx +++ b/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Calculated Member.mdx @@ -2,8 +2,8 @@ -- With Calculated Member -- ============================================= -With - Member AS +With + Member AS '' Select on Columns, diff --git a/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Named Set.mdx b/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Named Set.mdx index db2c6bb8..c7c3e601 100644 --- a/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Named Set.mdx +++ b/samples/features/ssms-templates/AnalysisServices/MDX/Queries/With Named Set.mdx @@ -2,8 +2,8 @@ -- With Named Set -- ============================================= -With - Set AS +With + Set AS '' Select on Columns, diff --git a/samples/features/ssms-templates/README.md b/samples/features/ssms-templates/README.md index c74de69f..c2793a59 100644 --- a/samples/features/ssms-templates/README.md +++ b/samples/features/ssms-templates/README.md @@ -3,8 +3,8 @@ SQL Server Management Studio supports templatized queries for multiple languages, including T-SQL, DAX, and MDX. The templates contain variables of the form "". SSMS users typically open the templates in one of the following ways: 1. The Template Explorer, which presents the hierarchy as a tree control. Users can drag the query templates to the current editor window or double click to open them in a new window. -2. A "New " menu item in Object Explorer. -3. The File/Open menu to open their own templates. +2. A "New " menu item in Object Explorer. +3. The File/Open menu to open their own templates. The SSMS query editor detects the presence of these variables and offers a menu item to open the dialog to specify values for the template parameters. diff --git a/samples/features/ssms-templates/Sql/Aggregate/Create Aggregate.sql b/samples/features/ssms-templates/Sql/Aggregate/Create Aggregate.sql index 435032ec..6048e2fe 100644 --- a/samples/features/ssms-templates/Sql/Aggregate/Create Aggregate.sql +++ b/samples/features/ssms-templates/Sql/Aggregate/Create Aggregate.sql @@ -2,11 +2,11 @@ -- Create Aggregate Template -- ============================================= IF EXISTS( - SELECT * + SELECT * FROM sys.objects - WHERE name = N'' + WHERE name = N'' AND (type = 'AF') -) +) DROP AGGREGATE GO diff --git a/samples/features/ssms-templates/Sql/Aggregate/Drop Aggregate.sql b/samples/features/ssms-templates/Sql/Aggregate/Drop Aggregate.sql index a3e2de28..6266b9e0 100644 --- a/samples/features/ssms-templates/Sql/Aggregate/Drop Aggregate.sql +++ b/samples/features/ssms-templates/Sql/Aggregate/Drop Aggregate.sql @@ -2,10 +2,10 @@ -- Drop Aggregate Template -- ============================================= IF EXISTS( - SELECT * + SELECT * FROM sys.objects - WHERE name = N'' + WHERE name = N'' AND (type = 'AF') -) +) DROP AGGREGATE GO diff --git a/samples/features/ssms-templates/Sql/Audit/Alter server audit.sql b/samples/features/ssms-templates/Sql/Audit/Alter server audit.sql index 70a0bc54..45712581 100644 --- a/samples/features/ssms-templates/Sql/Audit/Alter server audit.sql +++ b/samples/features/ssms-templates/Sql/Audit/Alter server audit.sql @@ -11,6 +11,6 @@ ALTER SERVER AUDIT TO FILE(FILEPATH = , MAXSIZE=, MAX_ROLLOVER_FILES =, - RESERVE_DISK_SPACE =) - WITH (QUEUE_DELAY = , - ON_FAILURE = ) + RESERVE_DISK_SPACE =) + WITH (QUEUE_DELAY = , + ON_FAILURE = ) diff --git a/samples/features/ssms-templates/Sql/Audit/Create server audit.sql b/samples/features/ssms-templates/Sql/Audit/Create server audit.sql index 700c4536..9f8cb266 100644 --- a/samples/features/ssms-templates/Sql/Audit/Create server audit.sql +++ b/samples/features/ssms-templates/Sql/Audit/Create server audit.sql @@ -11,6 +11,6 @@ CREATE SERVER AUDIT audit_name TO FILE (FILEPATH = , MAXSIZE=, MAX_ROLLOVER_FILES =, - RESERVE_DISK_SPACE =) - WITH (QUEUE_DELAY = , - ON_FAILURE = ) + RESERVE_DISK_SPACE =) + WITH (QUEUE_DELAY = , + ON_FAILURE = ) diff --git a/samples/features/ssms-templates/Sql/Certificate/Create Certificate.sql b/samples/features/ssms-templates/Sql/Certificate/Create Certificate.sql index 337f3f02..3c1071c1 100644 --- a/samples/features/ssms-templates/Sql/Certificate/Create Certificate.sql +++ b/samples/features/ssms-templates/Sql/Certificate/Create Certificate.sql @@ -2,14 +2,14 @@ -- Create certificate template --================================= IF EXISTS( - SELECT * - FROM sys.certificates + SELECT * + FROM sys.certificates WHERE name = N'' ) DROP CERTIFICATE GO -CREATE CERTIFICATE +CREATE CERTIFICATE ENCRYPTION BY PASSWORD = WITH SUBJECT = ; GO diff --git a/samples/features/ssms-templates/Sql/Certificate/Drop Certificate.sql b/samples/features/ssms-templates/Sql/Certificate/Drop Certificate.sql index 4396f38a..57bb4725 100644 --- a/samples/features/ssms-templates/Sql/Certificate/Drop Certificate.sql +++ b/samples/features/ssms-templates/Sql/Certificate/Drop Certificate.sql @@ -2,8 +2,8 @@ -- Drop certificate template --================================= IF EXISTS( - SELECT * - FROM sys.certificates + SELECT * + FROM sys.certificates WHERE name = N'' ) DROP CERTIFICATE diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Backup CDC Enabled Database.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Backup CDC Enabled Database.sql index ab22d66f..f12311e2 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Backup CDC Enabled Database.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Backup CDC Enabled Database.sql @@ -4,13 +4,13 @@ USE master GO -BACKUP DATABASE - TO DISK = N'.bak' -WITH +BACKUP DATABASE + TO DISK = N'.bak' +WITH NOFORMAT, - NOINIT, - NAME = N'-Full Database Backup', - SKIP, + NOINIT, + NAME = N'-Full Database Backup', + SKIP, STATS = 10; GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Capture Job Polling Interval.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Capture Job Polling Interval.sql index 3a4b60af..8b9dda82 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Capture Job Polling Interval.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Capture Job Polling Interval.sql @@ -7,5 +7,5 @@ GO EXEC [sys].[sp_cdc_change_job] @job_type = N'capture', @pollinginterval = -GO +GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Cleanup Job Retention.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Cleanup Job Retention.sql index 87cfeb23..9dab1f97 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Cleanup Job Retention.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Change CDC Cleanup Job Retention.sql @@ -7,5 +7,5 @@ GO EXEC [sys].[sp_cdc_change_job] @job_type = N'cleanup', @retention = -GO +GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Compute CPS for Recent Log Scan Sessions.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Compute CPS for Recent Log Scan Sessions.sql index 573cfd90..4747434b 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Compute CPS for Recent Log Scan Sessions.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Compute CPS for Recent Log Scan Sessions.sql @@ -42,9 +42,9 @@ SET @total_duration = 0 DECLARE #session CURSOR LOCAL fast_forward FOR - SELECT command_count, duration + SELECT command_count, duration FROM @log_scan_sessions - + OPEN #session FETCH #session INTO @command_count, @duration diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Restore CDC Enabled Database.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Restore CDC Enabled Database.sql index c38fe92c..243323b2 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Restore CDC Enabled Database.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Restore CDC Enabled Database.sql @@ -5,10 +5,10 @@ USE master GO RESTORE DATABASE - FROM DISK = N'.bak' -WITH - FILE = 1, - NOUNLOAD, + FROM DISK = N'.bak' +WITH + FILE = 1, + NOUNLOAD, REPLACE, STATS = 10, KEEP_CDC @@ -22,5 +22,5 @@ GO EXEC sys.sp_cdc_add_job @job_type = N'capture' GO - + diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Capture Job Parameters.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Capture Job Parameters.sql index 2d7f5c24..02865896 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Capture Job Parameters.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Capture Job Parameters.sql @@ -20,5 +20,5 @@ EXEC [sys].[sp_cdc_help_jobs] SELECT maxtrans, maxscans, continuous, pollinginterval FROM @cdc_jobs -WHERE job_type = N'capture' +WHERE job_type = N'capture' GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Cleanup Job Parameters.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Cleanup Job Parameters.sql index 18883a81..b2762d4c 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Cleanup Job Parameters.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Return Cleanup Job Parameters.sql @@ -20,5 +20,5 @@ EXEC [sys].[sp_cdc_help_jobs] SELECT retention, threshold FROM @cdc_jobs -WHERE job_type = N'cleanup' +WHERE job_type = N'cleanup' GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Capture Job.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Capture Job.sql index 09646279..8cb1e26f 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Capture Job.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Capture Job.sql @@ -6,5 +6,5 @@ GO EXEC [sys].[sp_cdc_start_job] @job_type = N'capture' -GO +GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Cleanup Job.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Cleanup Job.sql index 08486368..c5e41311 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Cleanup Job.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Start CDC Cleanup Job.sql @@ -6,5 +6,5 @@ GO EXEC [sys].[sp_cdc_start_job] @job_type = N'cleanup' -GO +GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Capture Job.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Capture Job.sql index 81119117..55b6b0a8 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Capture Job.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Capture Job.sql @@ -6,5 +6,5 @@ GO EXEC [sys].[sp_cdc_stop_job] @job_type = N'capture' -GO +GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Cleanup Job.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Cleanup Job.sql index 2bd173d1..e96969c6 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Cleanup Job.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Administration/Stop CDC Cleanup Job.sql @@ -6,5 +6,5 @@ GO EXEC [sys].[sp_cdc_stop_job] @job_type = N'cleanup' -GO +GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Disable All Capture Instances for Schema.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Disable All Capture Instances for Schema.sql index ead6654f..92126e07 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Disable All Capture Instances for Schema.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Disable All Capture Instances for Schema.sql @@ -5,8 +5,8 @@ USE GO DECLARE @capture_instances table ( - source_schema sysname, - source_table sysname, + source_schema sysname, + source_table sysname, capture_instance sysname, object_id int, source_object_id int, @@ -16,10 +16,10 @@ DECLARE @capture_instances table ( has_drop_pending bit NULL, role_name sysname NULL, index_name sysname NULL, - filegroup_name sysname NULL, + filegroup_name sysname NULL, create_date datetime, - index_column_list nvarchar(max) NULL, - captured_column_list nvarchar(max)) + index_column_list nvarchar(max) NULL, + captured_column_list nvarchar(max)) DECLARE @source_schema sysname, @source_name sysname, @@ -32,10 +32,10 @@ EXEC [sys].[sp_cdc_help_change_data_capture] DECLARE #hinstance CURSOR LOCAL fast_forward FOR - SELECT source_table, capture_instance + SELECT source_table, capture_instance FROM @capture_instances WHERE source_schema = @source_schema - + OPEN #hinstance FETCH #hinstance INTO @source_name, @capture_instance diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable All Tables of Database Schema.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable All Tables of Database Schema.sql index e9ba1e6d..e50caf81 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable All Tables of Database Schema.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable All Tables of Database Schema.sql @@ -8,11 +8,11 @@ DECLARE @source_schema sysname, @source_name sysname SET @source_schema = N'' DECLARE #hinstance CURSOR LOCAL fast_forward FOR - SELECT name + SELECT name FROM [sys].[tables] WHERE SCHEMA_NAME(schema_id) = @source_schema AND is_ms_shipped = 0 - + OPEN #hinstance FETCH #hinstance INTO @source_name diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable Table for All and Net Changes Queries.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable Table for All and Net Changes Queries.sql index 5c81e24c..deb700f5 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable Table for All and Net Changes Queries.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Enable Table for All and Net Changes Queries.sql @@ -1,5 +1,5 @@ -- ======================================================= --- Enable a Table for All and Net Changes Queries Template +-- Enable a Table for All and Net Changes Queries Template -- ======================================================= USE GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate CDC Wrapper TVFs for Schema.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate CDC Wrapper TVFs for Schema.sql index c7e1ebb9..51155c06 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate CDC Wrapper TVFs for Schema.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate CDC Wrapper TVFs for Schema.sql @@ -5,8 +5,8 @@ USE GO DECLARE @capture_instances table ( - source_schema sysname, - source_table sysname, + source_schema sysname, + source_table sysname, capture_instance sysname, object_id int, source_object_id int, @@ -16,14 +16,14 @@ DECLARE @capture_instances table ( has_drop_pending bit NULL, role_name sysname NULL, index_name sysname NULL, - filegroup_name sysname NULL, + filegroup_name sysname NULL, create_date datetime, - index_column_list nvarchar(max) NULL, + index_column_list nvarchar(max) NULL, captured_column_list nvarchar(max)) DECLARE @wrapper_functions table ( function_name sysname, - create_script nvarchar(max)) + create_script nvarchar(max)) DECLARE @source_schema sysname, @source_name sysname, @@ -37,10 +37,10 @@ EXEC [sys].[sp_cdc_help_change_data_capture] DECLARE #hinstance CURSOR LOCAL fast_forward FOR - SELECT capture_instance + SELECT capture_instance FROM @capture_instances WHERE source_schema = @source_schema - + OPEN #hinstance FETCH #hinstance INTO @capture_instance @@ -57,7 +57,7 @@ DEALLOCATE #hinstance DECLARE #hscript CURSOR LOCAL fast_forward FOR - SELECT create_script + SELECT create_script FROM @wrapper_functions OPEN #hscript diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate Wrapper TVF With Update Flag.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate Wrapper TVF With Update Flag.sql index 59cd2202..f37128c5 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate Wrapper TVF With Update Flag.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Configuration/Instantiate Wrapper TVF With Update Flag.sql @@ -6,7 +6,7 @@ GO DECLARE @wrapper_functions table ( function_name sysname, - create_script nvarchar(max)) + create_script nvarchar(max)) DECLARE @create_script nvarchar(max), @capture_instance sysname, @@ -20,7 +20,7 @@ EXEC [sys].[sp_cdc_generate_wrapper_function] @capture_instance = @capture_instance, @update_flag_list = @update_flag_list -SELECT @create_script = create_script +SELECT @create_script = create_script FROM @wrapper_functions WHERE function_name like N'fn_net_changes%' diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Append Commit Time to All Changes Result Set.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Append Commit Time to All Changes Result Set.sql index e3d1baab..14bfefd7 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Append Commit Time to All Changes Result Set.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Append Commit Time to All Changes Result Set.sql @@ -14,5 +14,5 @@ SELECT q.*, m.tran_end_time AS COMMIT_TIME FROM cdc.fn_cdc_get_all_changes_ (@from_lsn, @to_lsn, N'all') q INNER JOIN cdc.lsn_time_mapping m - ON q.__$start_lsn = m.start_lsn + ON q.__$start_lsn = m.start_lsn GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Enumerate Net Changes Using TRY CATCH.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Enumerate Net Changes Using TRY CATCH.sql index 90da5437..397b5c4e 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Enumerate Net Changes Using TRY CATCH.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Enumerate Net Changes Using TRY CATCH.sql @@ -9,7 +9,7 @@ SET @from_lsn = sys.fn_cdc_get_min_lsn('') SET @to_lsn = sys.fn_cdc_get_max_lsn() -BEGIN TRY +BEGIN TRY SELECT * FROM cdc.fn_cdc_get_all_changes_ (@from_lsn, @to_lsn, N'all') END TRY @@ -21,26 +21,26 @@ BEGIN CATCH @ERROR_NUMBER INT, @ERROR_LINE INT, @ERROR_MESSAGE VARCHAR(245) - + SELECT @ERROR_SEVERITY = ERROR_SEVERITY(), @ERROR_STATE = ERROR_STATE(), @ERROR_NUMBER = ERROR_NUMBER(), @ERROR_LINE = ERROR_LINE(), @ERROR_MESSAGE = ERROR_MESSAGE() - + IF @ERROR_NUMBER = 313 RAISERROR( - 'Either a range parameter or the row filter option is not valid.', + 'Either a range parameter or the row filter option is not valid.', @ERROR_SEVERITY, @ERROR_STATE) ELSE IF @ERROR_NUMBER = 229 RAISERROR( - 'The caller is not authorized to perform the query.', + 'The caller is not authorized to perform the query.', @ERROR_SEVERITY, @ERROR_STATE) ELSE RAISERROR('Msg %d, Line %d: %s', @ERROR_SEVERITY, @ERROR_STATE, @ERROR_NUMBER, - @ERROR_LINE, @ERROR_MESSAGE) -END CATCH + @ERROR_LINE, @ERROR_MESSAGE) +END CATCH GO diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Return All Changes With Given tran_begin_lsn.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Return All Changes With Given tran_begin_lsn.sql index 0fd9ff79..1a4e174e 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Return All Changes With Given tran_begin_lsn.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Enumeration/Return All Changes With Given tran_begin_lsn.sql @@ -13,7 +13,7 @@ SET @from_lsn = SET @to_lsn = sys.fn_cdc_get_max_lsn() SET @database_transaction_begin_lsn = -SELECT q.* +SELECT q.* FROM cdc.fn_cdc_get_all_changes_ (@from_lsn, @to_lsn, N'all') q INNER JOIN cdc.lsn_time_mapping m diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return All Accessible Database Capture Instances.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return All Accessible Database Capture Instances.sql index e62da180..879c0faf 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return All Accessible Database Capture Instances.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return All Accessible Database Capture Instances.sql @@ -5,8 +5,8 @@ USE GO DECLARE @capture_instances table ( - source_schema sysname, - source_table sysname, + source_schema sysname, + source_table sysname, capture_instance sysname, object_id int, source_object_id int, @@ -16,10 +16,10 @@ DECLARE @capture_instances table ( has_drop_pending bit NULL, role_name sysname NULL, index_name sysname NULL, - filegroup_name sysname NULL, + filegroup_name sysname NULL, create_date datetime, - index_column_list nvarchar(max) NULL, - captured_column_list nvarchar(max)) + index_column_list nvarchar(max) NULL, + captured_column_list nvarchar(max)) INSERT INTO @capture_instances EXEC [sys].[sp_cdc_help_change_data_capture] diff --git a/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return DDL Changes to All Enabled Tables.sql b/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return DDL Changes to All Enabled Tables.sql index c252a526..0ed68e43 100644 --- a/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return DDL Changes to All Enabled Tables.sql +++ b/samples/features/ssms-templates/Sql/Change Data Capture/Metadata Queries/Return DDL Changes to All Enabled Tables.sql @@ -7,8 +7,8 @@ GO DECLARE @capture_instance sysname DECLARE @capture_instances table ( - source_schema sysname, - source_table sysname, + source_schema sysname, + source_table sysname, capture_instance sysname, object_id int, source_object_id int, @@ -18,9 +18,9 @@ DECLARE @capture_instances table ( has_drop_pending bit NULL, role_name sysname NULL, index_name sysname NULL, - filegroup_name sysname NULL, + filegroup_name sysname NULL, create_date datetime, - index_column_list nvarchar(max) NULL, + index_column_list nvarchar(max) NULL, captured_column_list nvarchar(max)) DECLARE @ddl_history table ( @@ -37,9 +37,9 @@ EXEC [sys].[sp_cdc_help_change_data_capture] DECLARE #hinstance CURSOR LOCAL fast_forward FOR - SELECT capture_instance + SELECT capture_instance FROM @capture_instances - + OPEN #hinstance FETCH #hinstance INTO @capture_instance diff --git a/samples/features/ssms-templates/Sql/Change Tracking/Alter Change Tracking on Database.sql b/samples/features/ssms-templates/Sql/Change Tracking/Alter Change Tracking on Database.sql index d2c702cd..e0c9182a 100644 --- a/samples/features/ssms-templates/Sql/Change Tracking/Alter Change Tracking on Database.sql +++ b/samples/features/ssms-templates/Sql/Change Tracking/Alter Change Tracking on Database.sql @@ -4,7 +4,7 @@ USE master GO -ALTER DATABASE SET CHANGE_TRACKING +ALTER DATABASE SET CHANGE_TRACKING ( CHANGE_RETENTION = , AUTO_CLEANUP = diff --git a/samples/features/ssms-templates/Sql/Change Tracking/Enable Change Tracking on Table.sql b/samples/features/ssms-templates/Sql/Change Tracking/Enable Change Tracking on Table.sql index 44314f85..3733cbdd 100644 --- a/samples/features/ssms-templates/Sql/Change Tracking/Enable Change Tracking on Table.sql +++ b/samples/features/ssms-templates/Sql/Change Tracking/Enable Change Tracking on Table.sql @@ -8,8 +8,8 @@ GO ALTER TABLE . ENABLE CHANGE_TRACKING - WITH + WITH ( - TRACK_COLUMNS_UPDATED = + TRACK_COLUMNS_UPDATED = ) GO diff --git a/samples/features/ssms-templates/Sql/Credential/Create Credential.sql b/samples/features/ssms-templates/Sql/Credential/Create Credential.sql index 84f00c1e..bf804074 100644 --- a/samples/features/ssms-templates/Sql/Credential/Create Credential.sql +++ b/samples/features/ssms-templates/Sql/Credential/Create Credential.sql @@ -2,14 +2,14 @@ -- Create credential template --================================= IF EXISTS( - SELECT * - FROM sys.credentials + SELECT * + FROM sys.credentials WHERE name = N'' ) DROP CREDENTIAL GO -CREATE CREDENTIAL +CREATE CREDENTIAL WITH IDENTITY = FOR CRYPTOGRAPHIC_PROVIDER GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Credential/Drop Credential.sql b/samples/features/ssms-templates/Sql/Credential/Drop Credential.sql index 5a5ddee7..fe53ef23 100644 --- a/samples/features/ssms-templates/Sql/Credential/Drop Credential.sql +++ b/samples/features/ssms-templates/Sql/Credential/Drop Credential.sql @@ -2,8 +2,8 @@ -- Drop credential template --================================= IF EXISTS( - SELECT * - FROM sys.credentials + SELECT * + FROM sys.credentials WHERE name = N'' ) DROP CREDENTIAL diff --git a/samples/features/ssms-templates/Sql/Database Role/Create Database Role.sql b/samples/features/ssms-templates/Sql/Database Role/Create Database Role.sql index 5698f44d..bc6bad3d 100644 --- a/samples/features/ssms-templates/Sql/Database Role/Create Database Role.sql +++ b/samples/features/ssms-templates/Sql/Database Role/Create Database Role.sql @@ -9,17 +9,17 @@ CREATE ROLE AUTHORIZATION [dbo] GO -- Grant access rights to a specific schema in the database -GRANT - ALTER, - CONTROL, - DELETE, - EXECUTE, - INSERT, - REFERENCES, - SELECT, - TAKE OWNERSHIP, - UPDATE, - VIEW DEFINITION +GRANT + ALTER, + CONTROL, + DELETE, + EXECUTE, + INSERT, + REFERENCES, + SELECT, + TAKE OWNERSHIP, + UPDATE, + VIEW DEFINITION ON SCHEMA:: TO GO diff --git a/samples/features/ssms-templates/Sql/Database Role/Drop Role Member.sql b/samples/features/ssms-templates/Sql/Database Role/Drop Role Member.sql index 4796f454..874dae3e 100644 --- a/samples/features/ssms-templates/Sql/Database Role/Drop Role Member.sql +++ b/samples/features/ssms-templates/Sql/Database Role/Drop Role Member.sql @@ -10,17 +10,17 @@ CREATE ROLE AUTHORIZATION [dbo] GO -- Grant access rights to a specific schema in the database -GRANT - ALTER, - CONTROL, - DELETE, - EXECUTE, - INSERT, - REFERENCES, - SELECT, - TAKE OWNERSHIP, - UPDATE, - VIEW DEFINITION +GRANT + ALTER, + CONTROL, + DELETE, + EXECUTE, + INSERT, + REFERENCES, + SELECT, + TAKE OWNERSHIP, + UPDATE, + VIEW DEFINITION ON SCHEMA:: TO GO diff --git a/samples/features/ssms-templates/Sql/Database Trigger/Alter Database Trigger.sql b/samples/features/ssms-templates/Sql/Database Trigger/Alter Database Trigger.sql index 44a0cc38..e53dd1d9 100644 --- a/samples/features/ssms-templates/Sql/Database Trigger/Alter Database Trigger.sql +++ b/samples/features/ssms-templates/Sql/Database Trigger/Alter Database Trigger.sql @@ -1,15 +1,15 @@ --==================================== --- Alter database trigger template +-- Alter database trigger template --==================================== USE GO -ALTER TRIGGER ON DATABASE - FOR -AS +ALTER TRIGGER ON DATABASE + FOR +AS IF IS_MEMBER ('db_owner') = 0 BEGIN - PRINT 'You must ask your DBA to drop or alter tables!' + PRINT 'You must ask your DBA to drop or alter tables!' ROLLBACK TRANSACTION END GO diff --git a/samples/features/ssms-templates/Sql/Database Trigger/Create Database Trigger.sql b/samples/features/ssms-templates/Sql/Database Trigger/Create Database Trigger.sql index 466acc7b..4b8e9de2 100644 --- a/samples/features/ssms-templates/Sql/Database Trigger/Create Database Trigger.sql +++ b/samples/features/ssms-templates/Sql/Database Trigger/Create Database Trigger.sql @@ -1,5 +1,5 @@ --==================================== --- Create database trigger template +-- Create database trigger template --==================================== USE GO @@ -13,12 +13,12 @@ IF EXISTS( DROP TRIGGER ON DATABASE GO -CREATE TRIGGER ON DATABASE - FOR -AS +CREATE TRIGGER ON DATABASE + FOR +AS IF IS_MEMBER ('db_owner') = 0 BEGIN - PRINT 'You must ask your DBA to drop or alter tables!' + PRINT 'You must ask your DBA to drop or alter tables!' ROLLBACK TRANSACTION END GO diff --git a/samples/features/ssms-templates/Sql/Database Trigger/Drop Database Trigger.sql b/samples/features/ssms-templates/Sql/Database Trigger/Drop Database Trigger.sql index 46865743..6375d213 100644 --- a/samples/features/ssms-templates/Sql/Database Trigger/Drop Database Trigger.sql +++ b/samples/features/ssms-templates/Sql/Database Trigger/Drop Database Trigger.sql @@ -1,5 +1,5 @@ --==================================== --- Drop database trigger template +-- Drop database trigger template --==================================== IF EXISTS( SELECT * @@ -8,4 +8,4 @@ IF EXISTS( AND parent_class_desc = N'DATABASE' ) DROP TRIGGER ON DATABASE -GO +GO diff --git a/samples/features/ssms-templates/Sql/Database/Create Database Snapshot.sql b/samples/features/ssms-templates/Sql/Database/Create Database Snapshot.sql index ca6ca989..916e0594 100644 --- a/samples/features/ssms-templates/Sql/Database/Create Database Snapshot.sql +++ b/samples/features/ssms-templates/Sql/Database/Create Database Snapshot.sql @@ -6,8 +6,8 @@ GO -- Drop database snapshot if it already exists IF EXISTS ( - SELECT name - FROM sys.databases + SELECT name + FROM sys.databases WHERE name = N'_' ) DROP DATABASE _ @@ -15,7 +15,7 @@ GO -- Create the database snapshot CREATE DATABASE _ ON -( NAME = , FILENAME = +( NAME = , FILENAME = 'C:\Program Files\Microsoft SQL Server\%INST_PRE%.MSSQLSERVER\MSSQL\Data\_.ss' ) AS SNAPSHOT OF ; GO diff --git a/samples/features/ssms-templates/Sql/Database/Create Database on Multiple Filegroups.sql b/samples/features/ssms-templates/Sql/Database/Create Database on Multiple Filegroups.sql index 93e34f38..93db104b 100644 --- a/samples/features/ssms-templates/Sql/Database/Create Database on Multiple Filegroups.sql +++ b/samples/features/ssms-templates/Sql/Database/Create Database on Multiple Filegroups.sql @@ -2,8 +2,8 @@ -- Create database on multiple filegroups -- ============================================= IF EXISTS ( - SELECT * - FROM sys.databases + SELECT * + FROM sys.databases WHERE name = N'' ) DROP DATABASE diff --git a/samples/features/ssms-templates/Sql/Database/Create Database with Filestream Filegroups.sql b/samples/features/ssms-templates/Sql/Database/Create Database with Filestream Filegroups.sql index 890476df..f8f6cd81 100644 --- a/samples/features/ssms-templates/Sql/Database/Create Database with Filestream Filegroups.sql +++ b/samples/features/ssms-templates/Sql/Database/Create Database with Filestream Filegroups.sql @@ -2,8 +2,8 @@ -- Create database with filestream filegroups -- ============================================= IF EXISTS ( - SELECT * - FROM sys.databases + SELECT * + FROM sys.databases WHERE name = N'' ) DROP DATABASE diff --git a/samples/features/ssms-templates/Sql/Database/Create Database with Memory Optimized Data Filegroup.sql b/samples/features/ssms-templates/Sql/Database/Create Database with Memory Optimized Data Filegroup.sql index 9735c56f..a3b5e29a 100644 --- a/samples/features/ssms-templates/Sql/Database/Create Database with Memory Optimized Data Filegroup.sql +++ b/samples/features/ssms-templates/Sql/Database/Create Database with Memory Optimized Data Filegroup.sql @@ -3,8 +3,8 @@ -- ============================================= IF EXISTS ( - SELECT * - FROM sys.databases + SELECT * + FROM sys.databases WHERE name = N'' ) DROP DATABASE diff --git a/samples/features/ssms-templates/Sql/Database/create database.sql b/samples/features/ssms-templates/Sql/Database/create database.sql index eb8be7c6..27c6efc8 100644 --- a/samples/features/ssms-templates/Sql/Database/create database.sql +++ b/samples/features/ssms-templates/Sql/Database/create database.sql @@ -6,8 +6,8 @@ GO -- Drop the database if it already exists IF EXISTS ( - SELECT name - FROM sys.databases + SELECT name + FROM sys.databases WHERE name = N'' ) DROP DATABASE diff --git a/samples/features/ssms-templates/Sql/Database/drop database.sql b/samples/features/ssms-templates/Sql/Database/drop database.sql index 4a1eb213..7eca891a 100644 --- a/samples/features/ssms-templates/Sql/Database/drop database.sql +++ b/samples/features/ssms-templates/Sql/Database/drop database.sql @@ -5,8 +5,8 @@ USE master GO IF EXISTS ( - SELECT name - FROM sys.databases + SELECT name + FROM sys.databases WHERE name = N'' ) DROP DATABASE diff --git a/samples/features/ssms-templates/Sql/Default/Create Default.sql b/samples/features/ssms-templates/Sql/Default/Create Default.sql index 33e1e458..bfbef7bd 100644 --- a/samples/features/ssms-templates/Sql/Default/Create Default.sql +++ b/samples/features/ssms-templates/Sql/Default/Create Default.sql @@ -12,7 +12,7 @@ AS GO -- Bind the default to a column -EXEC sp_bindefault - N'.', +EXEC sp_bindefault + N'.', N'..' GO diff --git a/samples/features/ssms-templates/Sql/Default/Default Constraint.sql b/samples/features/ssms-templates/Sql/Default/Default Constraint.sql index bf8fc0a2..78a263ba 100644 --- a/samples/features/ssms-templates/Sql/Default/Default Constraint.sql +++ b/samples/features/ssms-templates/Sql/Default/Default Constraint.sql @@ -1,6 +1,6 @@ --- ============================ +-- ============================ -- Create default constraint --- ============================ +-- ============================ ALTER TABLE . ADD CONSTRAINT df_ diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Database Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Database Template.sql index d11ec9ee..a0d39e05 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Database Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Database Template.sql @@ -1,7 +1,7 @@ -- ============================================= -- Attach database via sp_attach_db -- ============================================= -EXECUTE sp_attach_db @dbname = N'', +EXECUTE sp_attach_db @dbname = N'', @filename1 = N'', @filename2 = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Single File Database.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Single File Database.sql index 37d4e5d6..fea598d0 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Single File Database.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Attach Single File Database.sql @@ -1,9 +1,9 @@ -- ============================================= -- Attach database via sp_attach_single_file_db -- ============================================= --- note: it builds a new log file and performs additional cleanup work +-- note: it builds a new log file and performs additional cleanup work -- to remove replication from the newly attached database -EXECUTE sp_attach_single_file_db @dbname = N'', +EXECUTE sp_attach_single_file_db @dbname = N'', @physname = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Detach Database Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Detach Database Template.sql index 3a1e2d3d..2a6ba240 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Detach Database Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Attach and Detach Database/Detach Database Template.sql @@ -1,7 +1,7 @@ -- ============================================= -- Detach database via sp_detach_db -- ============================================= -EXECUTE sp_detach_db @dbname = N'', +EXECUTE sp_detach_db @dbname = N'', @skipchecks = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Basic Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Basic Template.sql index 0a963372..a670a246 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Basic Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Basic Template.sql @@ -1,8 +1,8 @@ -- ============================================= -- Basic Create Database Template -- ============================================= -IF EXISTS (SELECT * - FROM master..sysdatabases +IF EXISTS (SELECT * + FROM master..sysdatabases WHERE name = N'') DROP DATABASE GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Multiple Filegroups.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Multiple Filegroups.sql index 6aec290d..a7e4b6a5 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Multiple Filegroups.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Multiple Filegroups.sql @@ -1,8 +1,8 @@ -- ============================================= -- Create database on mulitple file groups -- ============================================= -IF EXISTS (SELECT * - FROM master..sysdatabases +IF EXISTS (SELECT * + FROM master..sysdatabases WHERE name = N'') DROP DATABASE GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Specifying Collation.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Specifying Collation.sql index 9aeb0614..d9f07601 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Specifying Collation.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database Specifying Collation.sql @@ -1,8 +1,8 @@ -- ============================================= -- Create database specifying collation -- ============================================= -IF EXISTS (SELECT * - FROM master..sysdatabases +IF EXISTS (SELECT * + FROM master..sysdatabases WHERE name = N'') DROP DATABASE GO @@ -14,7 +14,7 @@ GO -- ========================================================== -- sample query to retrieve all types of collations available -- ========================================================== --- SELECT * +-- SELECT * -- FROM ::fn_helpcollations() -- GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database for Attach.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database for Attach.sql index 079eea70..102fc81e 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database for Attach.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database for Attach.sql @@ -1,14 +1,14 @@ -- ============================================= -- Create database for attach -- ============================================= -IF EXISTS (SELECT * - FROM master..sysdatabases +IF EXISTS (SELECT * + FROM master..sysdatabases WHERE name = N'') DROP DATABASE GO CREATE DATABASE -ON PRIMARY +ON PRIMARY (FILENAME = N'') FOR ATTACH GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database on Multiple Files.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database on Multiple Files.sql index 29c07205..0bab8313 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database on Multiple Files.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Database/Create Database on Multiple Files.sql @@ -1,14 +1,14 @@ -- ============================================= -- Create database on multiple data and transaction log files -- ============================================= -IF EXISTS (SELECT * - FROM master..sysdatabases +IF EXISTS (SELECT * + FROM master..sysdatabases WHERE name = N'') DROP DATABASE GO CREATE DATABASE -ON PRIMARY +ON PRIMARY ( NAME = , FILENAME = N'', SIZE = 1MB, @@ -21,7 +21,7 @@ ON PRIMARY MAXSIZE = 200MB, FILEGROWTH = 10%) -LOG ON +LOG ON ( NAME = , FILENAME = N'', SIZE = 512KB, diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Inline Function.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Inline Function.sql index fdc6994d..d6b573e7 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Inline Function.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Inline Function.sql @@ -1,27 +1,27 @@ -- ============================================= -- Create inline function (IF) -- ============================================= -IF EXISTS (SELECT * - FROM sysobjects +IF EXISTS (SELECT * + FROM sysobjects WHERE name = N'') DROP FUNCTION GO -CREATE FUNCTION - (<@param1, sysname, @p1> , +CREATE FUNCTION + (<@param1, sysname, @p1> , <@param2, sysname, @p2> ) -RETURNS TABLE +RETURNS TABLE AS - RETURN SELECT @p1 AS c1, + RETURN SELECT @p1 AS c1, @p2 AS c2 GO -- ============================================= -- Example to execute function -- ============================================= -SELECT * -FROM . - (, +SELECT * +FROM . + (, ) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Scalar Function.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Scalar Function.sql index 4bfa008c..526f28a5 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Scalar Function.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Scalar Function.sql @@ -1,14 +1,14 @@ -- ============================================= -- Create scalar function (FN) -- ============================================= -IF EXISTS (SELECT * - FROM sysobjects +IF EXISTS (SELECT * + FROM sysobjects WHERE name = N'') DROP FUNCTION GO -CREATE FUNCTION - (<@param1, sysname, @p1> , +CREATE FUNCTION + (<@param1, sysname, @p1> , <@param2, sysname, @p2> ) RETURNS AS @@ -24,8 +24,8 @@ GO -- ============================================= -- Example to execute function -- ============================================= -SELECT . - (, +SELECT . + (, ) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Table Function.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Table Function.sql index cdfea07f..9d6fd061 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Table Function.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Function/Create Table Function.sql @@ -1,23 +1,23 @@ -- ============================================= -- Create table function (TF) -- ============================================= -IF EXISTS (SELECT * - FROM sysobjects +IF EXISTS (SELECT * + FROM sysobjects WHERE name = N'') DROP FUNCTION GO -CREATE FUNCTION - (<@param1, sysname, @p1> , +CREATE FUNCTION + (<@param1, sysname, @p1> , <@param2, sysname, @p2> ) -RETURNS <@table_variable_name, sysname, @table_var> TABLE - ( , +RETURNS <@table_variable_name, sysname, @table_var> TABLE + ( , ) AS BEGIN INSERT <@table_variable_name, sysname, @table_var> SELECT 1, 2 - RETURN + RETURN END GO @@ -25,7 +25,7 @@ GO -- Example to execute function -- ============================================= SELECT * FROM . - (, + (, ) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Basic.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Basic.sql index 69e09d03..fddea7c4 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Basic.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Basic.sql @@ -2,8 +2,8 @@ -- Create index basic template -- ============================================= CREATE INDEX -ON .. - (, +ON .. + (, ) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Full Syntax.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Full Syntax.sql index 2ba395d1..3f5802e1 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Full Syntax.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Index/Create Index Full Syntax.sql @@ -2,8 +2,8 @@ -- Create index full syntax template -- ============================================= CREATE UNIQUE CLUSTERED INDEX -ON .. - ( DESC, +ON .. + ( DESC, ) WITH PAD_INDEX, diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure Basic Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure Basic Template.sql index 14df1917..e0c894a4 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure Basic Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure Basic Template.sql @@ -2,16 +2,16 @@ -- Create basic stored procedure template -- ============================================= IF EXISTS ( - SELECT * - FROM sysobjects - WHERE name = N'' + SELECT * + FROM sysobjects + WHERE name = N'' AND type = 'P' ) DROP PROCEDURE GO -CREATE PROCEDURE - <@param1, sysname, @p1> = , +CREATE PROCEDURE + <@param1, sysname, @p1> = , <@param2, sysname, @p2> = AS SELECT @p1, @p2 diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql index 0bfa878b..d5e7ba53 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql @@ -1,19 +1,19 @@ -- ======================================================= --- Create stored procedure with CURSOR OUTPUT parameters +-- Create stored procedure with CURSOR OUTPUT parameters -- ======================================================= -- drop stored procedure if it already exists IF EXISTS ( - SELECT * - FROM sysobjects - WHERE name = N'' + SELECT * + FROM sysobjects + WHERE name = N'' AND type = 'P' ) DROP PROCEDURE GO --- create the specified stored procedure -CREATE PROCEDURE +-- create the specified stored procedure +CREATE PROCEDURE <@proc_cursor_name, , @sample_procedure_cursor> CURSOR VARYING OUTPUT AS SET <@proc_cursor_name, , @sample_procedure_cursor> = CURSOR FOR diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with OUTPUT Parameter.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with OUTPUT Parameter.sql index 15ce04da..33342f24 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with OUTPUT Parameter.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Procedure/Create Procedure with OUTPUT Parameter.sql @@ -2,16 +2,16 @@ -- Create stored procedure with OUTPUT parameters -- =============================================== IF EXISTS ( - SELECT name - FROM sysobjects - WHERE name = N'' + SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'P' ) DROP PROCEDURE GO -CREATE PROCEDURE - <@param1, sysname, @p1> = , +CREATE PROCEDURE + <@param1, sysname, @p1> = , <@param2, sysname, @p2> OUTPUT AS SELECT @p2 = @p2 + @p1 diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Statistics/Create Statistics Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Statistics/Create Statistics Template.sql index 01fe01d3..2099e74c 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Statistics/Create Statistics Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Statistics/Create Statistics Template.sql @@ -1,8 +1,8 @@ -- ============================================= -- Create Statistics Template -- ============================================= -CREATE STATISTICS -ON +CREATE STATISTICS +ON () WITH SAMPLE PERCENT diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Basic Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Basic Template.sql index 6eab2095..6e2befc6 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Basic Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Basic Template.sql @@ -1,15 +1,15 @@ -- ============================================= -- Create table basic template -- ============================================= -IF EXISTS(SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS(SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'U') DROP TABLE GO CREATE TABLE ( - NULL, + NULL, NOT NULL) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Constraints.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Constraints.sql index eff96e29..adbb88b5 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Constraints.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Constraints.sql @@ -1,15 +1,15 @@ -- ============================================= -- Create table specify constraints -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'U') DROP TABLE GO CREATE TABLE ( - NOT NULL, + NOT NULL, NOT NULL CONSTRAINT CHECK(c2 > 0), CONSTRAINT PRIMARY KEY (c1) ) diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Filegroups.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Filegroups.sql index 2af4f312..faf7451c 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Filegroups.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table Specifying Filegroups.sql @@ -1,15 +1,15 @@ -- ============================================= -- Create table specifying filegroups -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'U') DROP TABLE GO CREATE TABLE ( - NOT NULL, + NOT NULL, ) ON TEXTIMAGE_ON diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with Computed Column.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with Computed Column.sql index 83f2ff7d..b3d3cbc8 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with Computed Column.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with Computed Column.sql @@ -1,15 +1,15 @@ -- ============================================= -- Create table with Computed column -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'U') DROP TABLE GO CREATE TABLE ( - NOT NULL, + NOT NULL, AS ) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with IDENTITY Column.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with IDENTITY Column.sql index 306beb30..4f5f45ef 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with IDENTITY Column.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with IDENTITY Column.sql @@ -1,15 +1,15 @@ -- ============================================= -- Create table with IDENTITY column -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'U') DROP TABLE GO create table ( - IDENTITY(, ), + IDENTITY(, ), NOT NULL) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with ROWGUIDCOL Column.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with ROWGUIDCOL Column.sql index 6e91299c..fa695120 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with ROWGUIDCOL Column.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Table with ROWGUIDCOL Column.sql @@ -1,16 +1,16 @@ -- ============================================= -- Create table with ROWGUIDCOL column -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'U') DROP TABLE GO create table ( - uniqueidentifier ROWGUIDCOL - CONSTRAINT DEFAULT NEWID(), + uniqueidentifier ROWGUIDCOL + CONSTRAINT DEFAULT NEWID(), NOT NULL) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Temp Table.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Temp Table.sql index ead08430..182f6021 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Temp Table.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Table/Create Temp Table.sql @@ -2,7 +2,7 @@ -- Create temp table -- ============================================= CREATE TABLE # ( - NULL, + NULL, NOT NULL) GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create INSTEAD OF Trigger Basic Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create INSTEAD OF Trigger Basic Template.sql index 304ed2a3..adf9e460 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create INSTEAD OF Trigger Basic Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create INSTEAD OF Trigger Basic Template.sql @@ -1,9 +1,9 @@ -- ============================================= -- Create basic Instead Of Trigger -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'TR') DROP TRIGGER GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Basic Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Basic Template.sql index b9a69b75..0f08feb7 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Basic Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Basic Template.sql @@ -1,17 +1,17 @@ -- ============================================= -- Create trigger basic template(After trigger) -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'TR') DROP TRIGGER GO CREATE TRIGGER ON -FOR DELETE, INSERT, UPDATE -AS +FOR DELETE, INSERT, UPDATE +AS BEGIN RAISERROR (50009, 16, 10) END diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF COLUMNS_UPDATED.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF COLUMNS_UPDATED.sql index 4af93332..18b29cd0 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF COLUMNS_UPDATED.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF COLUMNS_UPDATED.sql @@ -1,16 +1,16 @@ -- ============================================= --- Create trigger contained If (COLUMNS_UPDATED()) +-- Create trigger contained If (COLUMNS_UPDATED()) -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'TR') DROP TRIGGER GO CREATE TRIGGER ON -FOR INSERT, UPDATE +FOR INSERT, UPDATE AS --eg. check if all of column 2, 3, 4 are updated IF (COLUMNS_UPDATED() & 14) = 14 diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF UPDATE.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF UPDATE.sql index 174edcfc..07f6c690 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF UPDATE.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create Trigger/Create Trigger Contained IF UPDATE.sql @@ -1,17 +1,17 @@ -- ============================================= -- Create trigger contained If UPDATE(column) -- ============================================= -IF EXISTS (SELECT name - FROM sysobjects - WHERE name = N'' +IF EXISTS (SELECT name + FROM sysobjects + WHERE name = N'' AND type = 'TR') DROP TRIGGER GO CREATE TRIGGER ON -FOR INSERT, UPDATE -AS +FOR INSERT, UPDATE +AS If UPDATE() OR UPDATE() BEGIN RAISERROR ('These columns should never be updated', 16, 1) diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View Basic Template.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View Basic Template.sql index c0800b21..c3f23b8a 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View Basic Template.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View Basic Template.sql @@ -1,14 +1,14 @@ -- ============================================= -- Create view basic template -- ============================================= -IF EXISTS (SELECT TABLE_NAME - FROM INFORMATION_SCHEMA.VIEWS +IF EXISTS (SELECT TABLE_NAME + FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'') DROP VIEW GO CREATE VIEW -AS +AS GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with CHECK OPTION.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with CHECK OPTION.sql index 37eb37e2..f6879ffe 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with CHECK OPTION.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with CHECK OPTION.sql @@ -1,14 +1,14 @@ -- ============================================= --- Create view with CHECK OPTION +-- Create view with CHECK OPTION -- ============================================= -IF EXISTS (SELECT TABLE_NAME - FROM INFORMATION_SCHEMA.VIEWS +IF EXISTS (SELECT TABLE_NAME + FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'') DROP VIEW GO CREATE VIEW -AS +AS WITH CHECK OPTION GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with SCHEMABINDING.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with SCHEMABINDING.sql index 54c3bbcc..31ace6fc 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with SCHEMABINDING.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Create View/Create View with SCHEMABINDING.sql @@ -1,16 +1,16 @@ -- ============================================= -- Create schemabinding view -- ============================================= -IF EXISTS (SELECT TABLE_NAME - FROM INFORMATION_SCHEMA.VIEWS +IF EXISTS (SELECT TABLE_NAME + FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = N'') DROP VIEW GO CREATE VIEW WITH SCHEMABINDING -AS +AS ---note: need to specify specific column names and owner of the table +--note: need to specify specific column names and owner of the table --eg. SELECT column_1, column_2 FROM owner.table_or_view_name WHERE search_condition GO - + diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Add Extended Property.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Add Extended Property.sql index ba6224e3..bd368b39 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Add Extended Property.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Add Extended Property.sql @@ -1,9 +1,9 @@ -- ============================================= --- Add extended property +-- Add extended property -- ============================================= -EXEC sp_addextendedproperty N'', , - N'', N'', - N'', N'', +EXEC sp_addextendedproperty N'', , + N'', N'', + N'', N'', N'', N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Drop Extended Property.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Drop Extended Property.sql index f624c11b..94cbb4e1 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Drop Extended Property.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Drop Extended Property.sql @@ -1,9 +1,9 @@ -- ============================================= --- Drop extended property +-- Drop extended property -- ============================================= -EXEC sp_dropextendedproperty N'', - N'', N'', - N'', N'', +EXEC sp_dropextendedproperty N'', + N'', N'', + N'', N'', N'', N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/List Extended Property.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/List Extended Property.sql index e635decc..348870c7 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/List Extended Property.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/List Extended Property.sql @@ -1,10 +1,10 @@ -- ============================================= --- List extended property +-- List extended property -- ============================================= SELECT * FROM ::fn_listextendedproperty( - N'', - N'', N'', - N'', N'', + N'', + N'', N'', + N'', N'', N'', N'') GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Update Extended Property.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Update Extended Property.sql index 50227c43..3020d539 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Update Extended Property.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Extended Property/Update Extended Property.sql @@ -1,9 +1,9 @@ -- ============================================= --- Update extended property +-- Update extended property -- ============================================= -EXEC sp_updateextendedproperty N'', , - N'', N'', - N'', N'', +EXEC sp_updateextendedproperty N'', , + N'', N'', + N'', N'', N'', N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Add non-Sql Server as Linked Server.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Add non-Sql Server as Linked Server.sql index 5e93cd37..2976ec92 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Add non-Sql Server as Linked Server.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Add non-Sql Server as Linked Server.sql @@ -1,11 +1,11 @@ -- ============================================= -- Add another non-Sql Server as linked server -- ============================================= -sp_addlinkedserver @server = N'', +sp_addlinkedserver @server = N'', @srvproduct = N'', @provider = N'', - @datasrc = N'', - @location = , + @datasrc = N'', + @location = , @provstr = , @catalog = GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Configure Linked Server.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Configure Linked Server.sql index 0528f363..878cc2ae 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Configure Linked Server.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Configure Linked Server.sql @@ -1,7 +1,7 @@ -- ============================================= --- Configure linked server +-- Configure linked server -- ============================================= -sp_serveroption @server = N'', +sp_serveroption @server = N'', @optname = '', @optvalue = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server Login.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server Login.sql index 84c41a4e..64217958 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server Login.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server Login.sql @@ -1,7 +1,7 @@ -- ============================================= -- Drop linked server login -- ============================================= -sp_droplinkedsrvlogin @rmtsrvname = N'', +sp_droplinkedsrvlogin @rmtsrvname = N'', @locallogin = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server.sql index da4f1591..eda78f6b 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Linked Server/Drop Linked Server.sql @@ -1,7 +1,7 @@ -- ============================================= -- Drop linked server -- ============================================= -sp_dropserver @server = N'', +sp_dropserver @server = N'', @droplogins = GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add Login to Server Role.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add Login to Server Role.sql index d7a13805..209ed52a 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add Login to Server Role.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add Login to Server Role.sql @@ -1,7 +1,7 @@ -- ============================================= -- Add login to server roles -- ============================================= -sp_addsrvrolemember @loginame = N'', +sp_addsrvrolemember @loginame = N'', @rolename = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add User to Database Role.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add User to Database Role.sql index 4d0fe96b..47b9ebb8 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add User to Database Role.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Add User to Database Role.sql @@ -1,7 +1,7 @@ -- ============================================= -- Add user to database role -- ============================================= -sp_addrolemember @rolename = N'', +sp_addrolemember @rolename = N'', @membername = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop Login from Server Role.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop Login from Server Role.sql index f1af72ca..c707b846 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop Login from Server Role.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop Login from Server Role.sql @@ -1,7 +1,7 @@ -- ============================================= -- Drop login from server role -- ============================================= -sp_dropsrvrolemember @loginame = N'', +sp_dropsrvrolemember @loginame = N'', @rolename = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop User from Database Role.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop User from Database Role.sql index e77a306e..26e60850 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop User from Database Role.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Drop User from Database Role.sql @@ -1,7 +1,7 @@ -- ============================================= -- Drop user from database role -- ============================================= -sp_droprolemember @rolename = N'', +sp_droprolemember @rolename = N'', @membername = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Grant Database Access.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Grant Database Access.sql index 292a1449..e45af028 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Grant Database Access.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Manage Logins, Roles, and Users/Grant Database Access.sql @@ -1,7 +1,7 @@ -- ============================================= -- Grant dbaccess to login (Windows or Sql Server login) -- ============================================= -sp_grantdbaccess @loginame = N'', +sp_grantdbaccess @loginame = N'', @name_in_db = N'' GO diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use KEYSET Cursor.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use KEYSET Cursor.sql index c7130b8a..e4822348 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use KEYSET Cursor.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use KEYSET Cursor.sql @@ -14,10 +14,10 @@ WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN --- PRINT 'add user defined code here' +-- PRINT 'add user defined code here' -- eg. PRINT 'updating record for ' + @name - UPDATE pubs.dbo.authors + UPDATE pubs.dbo.authors SET phone = replace(phone, ' ', '-') WHERE CURRENT OF END diff --git a/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use UPDATE Cursor.sql b/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use UPDATE Cursor.sql index 8dd3ac4a..c30aeb98 100644 --- a/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use UPDATE Cursor.sql +++ b/samples/features/ssms-templates/Sql/Earlier Versions/Using Cursor/Declare and Use UPDATE Cursor.sql @@ -1,10 +1,10 @@ -- ============================================= -- Declare and using an UPDATE cursor -- ============================================= -DECLARE <@variable_1, sysname, @v1> , +DECLARE <@variable_1, sysname, @v1> , <@variable_2, sysname, @v2> -DECLARE CURSOR +DECLARE CURSOR FOR SELECT , FROM FOR UPDATE of diff --git a/samples/features/ssms-templates/Sql/Endpoint/Create Endpoint.sql b/samples/features/ssms-templates/Sql/Endpoint/Create Endpoint.sql index 990e19d3..d6c67fcc 100644 --- a/samples/features/ssms-templates/Sql/Endpoint/Create Endpoint.sql +++ b/samples/features/ssms-templates/Sql/Endpoint/Create Endpoint.sql @@ -4,30 +4,30 @@ USE GO ----------------------------------------------------------------------------- +---------------------------------------------------------------------------- -- First create a stored procedure that will be exposed as a web service ----------------------------------------------------------------------------- +---------------------------------------------------------------------------- IF EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.ROUTINES + SELECT * + FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_SCHEMA = N'' - AND SPECIFIC_NAME = N'' + AND SPECIFIC_NAME = N'' ) DROP PROCEDURE . GO CREATE PROCEDURE . (@msg NVARCHAR(256)) -AS +AS SELECT @msg AS message GO ----------------------------------------------------------------------------- +---------------------------------------------------------------------------- -- Then, create the HTTP endpoint to expose hello_world_proc as a webmethod ----------------------------------------------------------------------------- +---------------------------------------------------------------------------- IF EXISTS ( - SELECT name from sys.http_endpoints + SELECT name from sys.http_endpoints WHERE name = N'' ) DROP ENDPOINT diff --git a/samples/features/ssms-templates/Sql/Event Notification/CREATE DATABASE EVENT NOTIFICATION.sql b/samples/features/ssms-templates/Sql/Event Notification/CREATE DATABASE EVENT NOTIFICATION.sql index b5ff93e8..71757d33 100644 --- a/samples/features/ssms-templates/Sql/Event Notification/CREATE DATABASE EVENT NOTIFICATION.sql +++ b/samples/features/ssms-templates/Sql/Event Notification/CREATE DATABASE EVENT NOTIFICATION.sql @@ -1,7 +1,7 @@ -- ============================================= -- Create Database Event Notification Template -- ============================================= -IF EXISTS (SELECT * +IF EXISTS (SELECT * FROM sys.event_notifications WHERE name = N'') DROP EVENT NOTIFICATION diff --git a/samples/features/ssms-templates/Sql/Event Notification/CREATE SERVER EVENT NOTIFICATION.sql b/samples/features/ssms-templates/Sql/Event Notification/CREATE SERVER EVENT NOTIFICATION.sql index eb569fc3..4c0f3734 100644 --- a/samples/features/ssms-templates/Sql/Event Notification/CREATE SERVER EVENT NOTIFICATION.sql +++ b/samples/features/ssms-templates/Sql/Event Notification/CREATE SERVER EVENT NOTIFICATION.sql @@ -1,7 +1,7 @@ -- ============================================= -- Create Server Event Notification Template -- ============================================= -IF EXISTS (SELECT * +IF EXISTS (SELECT * FROM sys.server_event_notifications WHERE name = N'') DROP EVENT NOTIFICATION diff --git a/samples/features/ssms-templates/Sql/Event Notification/DROP DATABASE EVENT NOTIFICATION.sql b/samples/features/ssms-templates/Sql/Event Notification/DROP DATABASE EVENT NOTIFICATION.sql index 86d554a2..dec64e27 100644 --- a/samples/features/ssms-templates/Sql/Event Notification/DROP DATABASE EVENT NOTIFICATION.sql +++ b/samples/features/ssms-templates/Sql/Event Notification/DROP DATABASE EVENT NOTIFICATION.sql @@ -1,7 +1,7 @@ -- ============================================= -- Drop Database Event Notification Template -- ============================================= -IF EXISTS (SELECT * +IF EXISTS (SELECT * FROM sys.event_notifications WHERE name = N'') DROP EVENT NOTIFICATION diff --git a/samples/features/ssms-templates/Sql/Event Notification/DROP SERVER EVENT NOTIFICATION.sql b/samples/features/ssms-templates/Sql/Event Notification/DROP SERVER EVENT NOTIFICATION.sql index fd111dbf..4a2acb2a 100644 --- a/samples/features/ssms-templates/Sql/Event Notification/DROP SERVER EVENT NOTIFICATION.sql +++ b/samples/features/ssms-templates/Sql/Event Notification/DROP SERVER EVENT NOTIFICATION.sql @@ -1,7 +1,7 @@ -- ============================================= -- Drop Server Event Notification Template -- ============================================= -IF EXISTS (SELECT * +IF EXISTS (SELECT * FROM sys.server_event_notifications WHERE name = N'') DROP EVENT NOTIFICATION diff --git a/samples/features/ssms-templates/Sql/Extended Property/Add Extended Properties to Table.sql b/samples/features/ssms-templates/Sql/Extended Property/Add Extended Properties to Table.sql index a05b1ca2..46248828 100644 --- a/samples/features/ssms-templates/Sql/Extended Property/Add Extended Properties to Table.sql +++ b/samples/features/ssms-templates/Sql/Extended Property/Add Extended Properties to Table.sql @@ -10,27 +10,27 @@ GO CREATE TABLE . ( - , + , CONSTRAINT PRIMARY KEY () ) -- Add description to table object -EXEC sys.sp_addextendedproperty - @name=N'MS_Description', +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', @value=N'' , - @level0type=N'SCHEMA', - @level0name=N'', - @level1type=N'TABLE', + @level0type=N'SCHEMA', + @level0name=N'', + @level1type=N'TABLE', @level1name=N'' GO -- Add description to a specific column -EXEC sys.sp_addextendedproperty - @name=N'MS_Description', +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', @value=N'' , - @level0type=N'SCHEMA', - @level0name=N'', - @level1type=N'TABLE', - @level1name=N'', - @level2type=N'COLUMN', + @level0type=N'SCHEMA', + @level0name=N'', + @level1type=N'TABLE', + @level1name=N'', + @level2type=N'COLUMN', @level2name=N'' GO diff --git a/samples/features/ssms-templates/Sql/Extended Property/Extended Properties on Database.sql b/samples/features/ssms-templates/Sql/Extended Property/Extended Properties on Database.sql index 96aeb4c7..fd3c8f9f 100644 --- a/samples/features/ssms-templates/Sql/Extended Property/Extended Properties on Database.sql +++ b/samples/features/ssms-templates/Sql/Extended Property/Extended Properties on Database.sql @@ -5,15 +5,15 @@ USE GO -- Add an extended property to a database -EXEC sp_addextendedproperty - @name=N'', - @value=N'' +EXEC sp_addextendedproperty + @name=N'', + @value=N'' GO -- Modify an existing extended property on a database -EXEC sp_updateextendedproperty - @name=N'MS_Description', - @value=N'' +EXEC sp_updateextendedproperty + @name=N'MS_Description', + @value=N'' GO -- List the extended properties for the database object @@ -22,5 +22,5 @@ FROM fn_listextendedproperty(default, default, default, default, default, defaul GO -- Drop the new extended property () -EXEC sp_dropextendedproperty @name=N'' +EXEC sp_dropextendedproperty @name=N'' 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 2e83e39c..fbc98925 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 @@ -7,7 +7,7 @@ GO IF EXISTS ( SELECT * FROM sys.external_data_sources - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL DATA SOURCE GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/External File Format/Create External File Format.sql b/samples/features/ssms-templates/Sql/External File Format/Create External File Format.sql index 584510c2..a3cdbc17 100644 --- a/samples/features/ssms-templates/Sql/External File Format/Create External File Format.sql +++ b/samples/features/ssms-templates/Sql/External File Format/Create External File Format.sql @@ -7,7 +7,7 @@ GO IF EXISTS ( SELECT * FROM sys.external_file_formats - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL FILE FORMAT GO @@ -16,7 +16,7 @@ CREATE EXTERNAL FILE FORMAT WITH ( FORMAT_TYPE = , SERDE_METHOD = N'', - FORMAT_OPTIONS + FORMAT_OPTIONS ( FIELD_TERMINATOR = N'', STRING_DELIMITER = N'', diff --git a/samples/features/ssms-templates/Sql/External File Format/Drop External File Format.sql b/samples/features/ssms-templates/Sql/External File Format/Drop External File Format.sql index aa963e28..2bdadcc7 100644 --- a/samples/features/ssms-templates/Sql/External File Format/Drop External File Format.sql +++ b/samples/features/ssms-templates/Sql/External File Format/Drop External File Format.sql @@ -7,7 +7,7 @@ GO IF EXISTS ( SELECT * FROM sys.external_file_formats - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL FILE FORMAT GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Full-text/Create Full-text Catalog.sql b/samples/features/ssms-templates/Sql/Full-text/Create Full-text Catalog.sql index 5f2e5cba..346f7f75 100644 --- a/samples/features/ssms-templates/Sql/Full-text/Create Full-text Catalog.sql +++ b/samples/features/ssms-templates/Sql/Full-text/Create Full-text Catalog.sql @@ -1,14 +1,14 @@ -- ============================================= -- Create Full-text catalog template -- ============================================= -IF EXISTS ( - SELECT * - FROM sys.fulltext_catalogs +IF EXISTS ( + SELECT * + FROM sys.fulltext_catalogs WHERE name = N'' ) DROP FULLTEXT CATALOG GO - + CREATE FULLTEXT CATALOG GO diff --git a/samples/features/ssms-templates/Sql/Full-text/Create Full-text Index.sql b/samples/features/ssms-templates/Sql/Full-text/Create Full-text Index.sql index 39f6f21e..7a6acbf9 100644 --- a/samples/features/ssms-templates/Sql/Full-text/Create Full-text Index.sql +++ b/samples/features/ssms-templates/Sql/Full-text/Create Full-text Index.sql @@ -1,11 +1,11 @@ -- ============================================= -- Basic Create Full-text Index Template -- --- This template assumes there is already a +-- This template assumes there is already a -- full-text catalog in your database -- ============================================= IF EXISTS( - SELECT * + SELECT * FROM sys.fulltext_indexes JOIN sys.tables ON sys.tables.object_id = sys.fulltext_indexes.object_id @@ -14,7 +14,7 @@ IF EXISTS( DROP FULLTEXT INDEX ON GO -CREATE FULLTEXT INDEX ON () +CREATE FULLTEXT INDEX ON () KEY INDEX ON WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM) diff --git a/samples/features/ssms-templates/Sql/Full-text/Create Full-text Stoplist.sql b/samples/features/ssms-templates/Sql/Full-text/Create Full-text Stoplist.sql index b631e6a8..2a934d58 100644 --- a/samples/features/ssms-templates/Sql/Full-text/Create Full-text Stoplist.sql +++ b/samples/features/ssms-templates/Sql/Full-text/Create Full-text Stoplist.sql @@ -1,14 +1,14 @@ -- ============================================= -- Create Full-text stoplist template -- ============================================= -IF EXISTS ( - SELECT * - FROM sys.fulltext_stoplists +IF EXISTS ( + SELECT * + FROM sys.fulltext_stoplists WHERE name = N'' ) DROP FULLTEXT STOPLIST GO - + CREATE FULLTEXT STOPLIST GO diff --git a/samples/features/ssms-templates/Sql/Full-text/Start Full Population.sql b/samples/features/ssms-templates/Sql/Full-text/Start Full Population.sql index 644c693a..1b3b25a2 100644 --- a/samples/features/ssms-templates/Sql/Full-text/Start Full Population.sql +++ b/samples/features/ssms-templates/Sql/Full-text/Start Full Population.sql @@ -2,7 +2,7 @@ -- Full-text start population template -- ============================================= IF EXISTS( - SELECT * + SELECT * FROM sys.fulltext_indexes JOIN sys.tables ON sys.tables.object_id = sys.fulltext_indexes.object_id diff --git a/samples/features/ssms-templates/Sql/Full-text/Stop Population.sql b/samples/features/ssms-templates/Sql/Full-text/Stop Population.sql index 3fc21a37..30c1c9c0 100644 --- a/samples/features/ssms-templates/Sql/Full-text/Stop Population.sql +++ b/samples/features/ssms-templates/Sql/Full-text/Stop Population.sql @@ -2,7 +2,7 @@ -- Full-text stop population template -- ============================================= IF EXISTS( - SELECT * + SELECT * FROM sys.fulltext_indexes JOIN sys.tables ON sys.tables.object_id = sys.fulltext_indexes.object_id diff --git a/samples/features/ssms-templates/Sql/Function/CLR Function.sql b/samples/features/ssms-templates/Sql/Function/CLR Function.sql index 7413d9fd..a313c428 100644 --- a/samples/features/ssms-templates/Sql/Function/CLR Function.sql +++ b/samples/features/ssms-templates/Sql/Function/CLR Function.sql @@ -1,10 +1,10 @@ --============================================================= -- Create CLR Function template -- --- This example creates an assembly named "utf8string" in the --- local database. Then, it creates a CLR function named --- "GetCurrentTimeMs" that references "GetCurrentTimeMs" --- of classutf8.Utils in assembly utf8string. +-- This example creates an assembly named "utf8string" in the +-- local database. Then, it creates a CLR function named +-- "GetCurrentTimeMs" that references "GetCurrentTimeMs" +-- of classutf8.Utils in assembly utf8string. --============================================================= USE AdventureWorks GO diff --git a/samples/features/ssms-templates/Sql/Function/Create Inline Function (New Menu).sql b/samples/features/ssms-templates/Sql/Function/Create Inline Function (New Menu).sql index e7493974..97d24e04 100644 --- a/samples/features/ssms-templates/Sql/Function/Create Inline Function (New Menu).sql +++ b/samples/features/ssms-templates/Sql/Function/Create Inline Function (New Menu).sql @@ -2,8 +2,8 @@ -- Template generated from Template Explorer using: -- Create Inline Function (New Menu).SQL -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in @@ -18,15 +18,15 @@ GO -- Create date: -- Description: -- ============================================= -CREATE FUNCTION +CREATE FUNCTION ( -- Add the parameters for the function here - <@param1, sysname, @p1> , + <@param1, sysname, @p1> , <@param2, sysname, @p2> ) -RETURNS TABLE +RETURNS TABLE AS -RETURN +RETURN ( -- Add the SELECT statement with parameter references here SELECT 0 diff --git a/samples/features/ssms-templates/Sql/Function/Create Multi-statement Function (New Menu).sql b/samples/features/ssms-templates/Sql/Function/Create Multi-statement Function (New Menu).sql index dd67ce60..248acedd 100644 --- a/samples/features/ssms-templates/Sql/Function/Create Multi-statement Function (New Menu).sql +++ b/samples/features/ssms-templates/Sql/Function/Create Multi-statement Function (New Menu).sql @@ -2,8 +2,8 @@ -- Template generated from Template Explorer using: -- Create Multi-Statement Function (New Menu).SQL -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in @@ -18,23 +18,23 @@ GO -- Create date: -- Description: -- ============================================= -CREATE FUNCTION +CREATE FUNCTION ( -- Add the parameters for the function here - <@param1, sysname, @p1> , + <@param1, sysname, @p1> , <@param2, sysname, @p2> ) -RETURNS -<@Table_Variable_Name, sysname, @Table_Var> TABLE +RETURNS +<@Table_Variable_Name, sysname, @Table_Var> TABLE ( -- Add the column definitions for the TABLE variable here - , + , ) AS BEGIN -- Fill the table variable with the rows for your result set - RETURN + RETURN END GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Function/Create Multi-statement Table-valued Function.sql b/samples/features/ssms-templates/Sql/Function/Create Multi-statement Table-valued Function.sql index 4082e8c1..ddd4e886 100644 --- a/samples/features/ssms-templates/Sql/Function/Create Multi-statement Table-valued Function.sql +++ b/samples/features/ssms-templates/Sql/Function/Create Multi-statement Table-valued Function.sql @@ -9,7 +9,7 @@ IF OBJECT_ID (N'..( ) -RETURNS TABLE +RETURNS TABLE ( -- columns returned by the function NOT NULL, @@ -27,7 +27,7 @@ BEGIN 1, CONVERT(varchar(255), c.FirstName + ' ' + c.LastName) FROM HumanResources.Employee AS e - JOIN Person.Contact AS c ON e.ContactID = c.ContactID + JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID = @InEmpID UNION ALL SELECT CONVERT(varchar(255), REPLICATE ('| ' , EmployeeLevel) + @@ -35,17 +35,17 @@ BEGIN e.Title, e.EmployeeID, EmployeeLevel + 1, - CONVERT (varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' + + CONVERT (varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' + LastName) FROM HumanResources.Employee as e JOIN Person.Contact AS c ON e.ContactID = c.ContactID JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID ) - -- copy the required columns to the result of the function + -- copy the required columns to the result of the function INSERT @retFindReports SELECT EmployeeID, Name, Title, EmployeeLevel - FROM DirectReports + FROM DirectReports ORDER BY Sort RETURN END diff --git a/samples/features/ssms-templates/Sql/Function/Create Natively Compiled Scalar Function.sql b/samples/features/ssms-templates/Sql/Function/Create Natively Compiled Scalar Function.sql index db92e1b9..a7b5bb95 100644 --- a/samples/features/ssms-templates/Sql/Function/Create Natively Compiled Scalar Function.sql +++ b/samples/features/ssms-templates/Sql/Function/Create Natively Compiled Scalar Function.sql @@ -2,8 +2,8 @@ -- Template generated from Template Explorer using: -- Create Natively Compiled Scalar Function.SQL -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in @@ -22,7 +22,7 @@ GO -- Create date: -- Description: -- ============================================= -CREATE FUNCTION [] +CREATE FUNCTION [] ( -- Add the parameters for the function here <@Param1, sysname, @p1> diff --git a/samples/features/ssms-templates/Sql/Function/Create Scalar Function (New Menu).sql b/samples/features/ssms-templates/Sql/Function/Create Scalar Function (New Menu).sql index 3261841c..21c54195 100644 --- a/samples/features/ssms-templates/Sql/Function/Create Scalar Function (New Menu).sql +++ b/samples/features/ssms-templates/Sql/Function/Create Scalar Function (New Menu).sql @@ -2,8 +2,8 @@ -- Template generated from Template Explorer using: -- Create Scalar Function (New Menu).SQL -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in @@ -18,7 +18,7 @@ GO -- Create date: -- Description: -- ============================================= -CREATE FUNCTION +CREATE FUNCTION ( -- Add the parameters for the function here <@Param1, sysname, @p1> diff --git a/samples/features/ssms-templates/Sql/Index/Create Clustered Columnstore Index.sql b/samples/features/ssms-templates/Sql/Index/Create Clustered Columnstore Index.sql index b54a9565..752ee179 100644 --- a/samples/features/ssms-templates/Sql/Index/Create Clustered Columnstore Index.sql +++ b/samples/features/ssms-templates/Sql/Index/Create Clustered Columnstore Index.sql @@ -7,6 +7,6 @@ USE GO CREATE CLUSTERED COLUMNSTORE INDEX -ON . +ON . WITH (DATA_COMPRESSION = ) GO diff --git a/samples/features/ssms-templates/Sql/Index/Create Index Basic.sql b/samples/features/ssms-templates/Sql/Index/Create Index Basic.sql index 92e4b057..28e766ba 100644 --- a/samples/features/ssms-templates/Sql/Index/Create Index Basic.sql +++ b/samples/features/ssms-templates/Sql/Index/Create Index Basic.sql @@ -5,7 +5,7 @@ USE GO CREATE INDEX -ON . +ON . ( ) diff --git a/samples/features/ssms-templates/Sql/Index/Create Nonclustered Columnstore Index.sql b/samples/features/ssms-templates/Sql/Index/Create Nonclustered Columnstore Index.sql index 3d75c2c5..18717076 100644 --- a/samples/features/ssms-templates/Sql/Index/Create Nonclustered Columnstore Index.sql +++ b/samples/features/ssms-templates/Sql/Index/Create Nonclustered Columnstore Index.sql @@ -7,7 +7,7 @@ USE GO CREATE NONCLUSTERED COLUMNSTORE INDEX -ON . +ON . ( ) diff --git a/samples/features/ssms-templates/Sql/Index/Create Primary XML Index.sql b/samples/features/ssms-templates/Sql/Index/Create Primary XML Index.sql index 283d60d8..0c247b47 100644 --- a/samples/features/ssms-templates/Sql/Index/Create Primary XML Index.sql +++ b/samples/features/ssms-templates/Sql/Index/Create Primary XML Index.sql @@ -10,8 +10,8 @@ USE GO IF EXISTS ( - SELECT * - FROM sys.xml_indexes + SELECT * + FROM sys.xml_indexes WHERE name = '' AND object_id = OBJECT_ID ('.') ) @@ -20,7 +20,7 @@ DROP INDEX GO CREATE PRIMARY XML INDEX -ON . +ON . ( ) diff --git a/samples/features/ssms-templates/Sql/Index/Create Unique Nonclustered Index.sql b/samples/features/ssms-templates/Sql/Index/Create Unique Nonclustered Index.sql index 99f0814e..208dacfa 100644 --- a/samples/features/ssms-templates/Sql/Index/Create Unique Nonclustered Index.sql +++ b/samples/features/ssms-templates/Sql/Index/Create Unique Nonclustered Index.sql @@ -4,26 +4,26 @@ USE GO -CREATE UNIQUE NONCLUSTERED INDEX -ON . +CREATE UNIQUE NONCLUSTERED INDEX +ON . ( ASC ) -WITH +WITH ( - SORT_IN_TEMPDB = OFF, + SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF -) +) ON GO -EXEC sys.sp_addextendedproperty - @name=N'MS_Description', +EXEC sys.sp_addextendedproperty + @name=N'MS_Description', @value=N'' , - @level0type=N'SCHEMA', - @level0name=N'', - @level1type=N'TABLE', - @level1name=N'', - @level2type=N'INDEX', + @level0type=N'SCHEMA', + @level0name=N'', + @level1type=N'TABLE', + @level1name=N'', + @level2type=N'INDEX', @level2name=N'' GO diff --git a/samples/features/ssms-templates/Sql/Index/Create XML Index Type Path.sql b/samples/features/ssms-templates/Sql/Index/Create XML Index Type Path.sql index 1c467cb9..3097cb38 100644 --- a/samples/features/ssms-templates/Sql/Index/Create XML Index Type Path.sql +++ b/samples/features/ssms-templates/Sql/Index/Create XML Index Type Path.sql @@ -2,15 +2,15 @@ -- Create XML Index Type PATH Template -- ============================================= -- Creates a secondary XML index of type PATH on --- an XML column using a primary XML index on the +-- an XML column using a primary XML index on the -- XML column USE GO IF EXISTS ( - SELECT * - FROM sys.xml_indexes + SELECT * + FROM sys.xml_indexes WHERE name = '' AND object_id = OBJECT_ID ('.') ) @@ -19,7 +19,7 @@ DROP INDEX GO CREATE XML INDEX -ON . +ON . ( ) diff --git a/samples/features/ssms-templates/Sql/Index/Create XML Index Type Property.sql b/samples/features/ssms-templates/Sql/Index/Create XML Index Type Property.sql index 92f03a15..2e0e158f 100644 --- a/samples/features/ssms-templates/Sql/Index/Create XML Index Type Property.sql +++ b/samples/features/ssms-templates/Sql/Index/Create XML Index Type Property.sql @@ -2,15 +2,15 @@ -- Create XML Index Type PROPERTY Template -- ============================================= -- Creates a secondary XML index of type PROPERTY --- on an XML column using a primary XML index on +-- on an XML column using a primary XML index on -- the XML column USE GO IF EXISTS ( - SELECT * - FROM sys.xml_indexes + SELECT * + FROM sys.xml_indexes WHERE name = '' AND object_id = OBJECT_ID ('.') ) @@ -19,7 +19,7 @@ DROP INDEX GO CREATE XML INDEX -ON . +ON . ( ) diff --git a/samples/features/ssms-templates/Sql/Index/Create XML Index Type Value.sql b/samples/features/ssms-templates/Sql/Index/Create XML Index Type Value.sql index f5a0ff42..b2cbcc0f 100644 --- a/samples/features/ssms-templates/Sql/Index/Create XML Index Type Value.sql +++ b/samples/features/ssms-templates/Sql/Index/Create XML Index Type Value.sql @@ -2,15 +2,15 @@ -- Create XML Index Type VALUE Template -- ============================================= -- Creates a secondary XML index of type VALUE on --- an XML column using a primary XML index on the +-- an XML column using a primary XML index on the -- XML column USE GO IF EXISTS ( - SELECT * - FROM sys.xml_indexes + SELECT * + FROM sys.xml_indexes WHERE name = '' AND object_id = OBJECT_ID ('.') ) @@ -19,7 +19,7 @@ DROP INDEX GO CREATE XML INDEX -ON . +ON . ( ) diff --git a/samples/features/ssms-templates/Sql/Linked Server/Add Linked Server Access MDB.sql b/samples/features/ssms-templates/Sql/Linked Server/Add Linked Server Access MDB.sql index 25ab663d..5922c1a6 100644 --- a/samples/features/ssms-templates/Sql/Linked Server/Add Linked Server Access MDB.sql +++ b/samples/features/ssms-templates/Sql/Linked Server/Add Linked Server Access MDB.sql @@ -2,19 +2,19 @@ -- Add Linked Server Access MDB template -- ======================================== -EXEC sp_addlinkedserver - @server = N'', - @provider = N'Microsoft.Jet.OLEDB.4.0', +EXEC sp_addlinkedserver + @server = N'', + @provider = N'Microsoft.Jet.OLEDB.4.0', @srvproduct = N'OLE DB Provider for Jet', @datasrc = N'' GO -- Set up login mapping using current user's security context -EXEC sp_addlinkedsrvlogin +EXEC sp_addlinkedsrvlogin @rmtsrvname = N'', @useself = N'TRUE', - @locallogin = NULL, - @rmtuser = N'', + @locallogin = NULL, + @rmtuser = N'', @rmtpassword = GO diff --git a/samples/features/ssms-templates/Sql/Login/Create Login For SysAdmin User.sql b/samples/features/ssms-templates/Sql/Login/Create Login For SysAdmin User.sql index e9210582..dddac078 100644 --- a/samples/features/ssms-templates/Sql/Login/Create Login For SysAdmin User.sql +++ b/samples/features/ssms-templates/Sql/Login/Create Login For SysAdmin User.sql @@ -4,7 +4,7 @@ CREATE LOGIN [\] FROM WINDOWS WITH DEFAULT_DATABASE= GO -ALTER SERVER ROLE [sysadmin] +ALTER SERVER ROLE [sysadmin] ADD MEMBER [\] GO diff --git a/samples/features/ssms-templates/Sql/Login/Create SQL Login Must Change Password.sql b/samples/features/ssms-templates/Sql/Login/Create SQL Login Must Change Password.sql index 2fc76725..4c899fff 100644 --- a/samples/features/ssms-templates/Sql/Login/Create SQL Login Must Change Password.sql +++ b/samples/features/ssms-templates/Sql/Login/Create SQL Login Must Change Password.sql @@ -2,8 +2,8 @@ -- Create SQL Login Must Change Password template -- ================================================= -CREATE LOGIN - WITH PASSWORD = N'' +CREATE LOGIN + WITH PASSWORD = N'' MUST_CHANGE, CHECK_POLICY = ; GO diff --git a/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Merge.sql b/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Merge.sql index 4fba5be8..f5e78413 100644 --- a/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Merge.sql +++ b/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Merge.sql @@ -16,4 +16,4 @@ ALTER PARTITION FUNCTION () MERGE RANGE (); GO - + diff --git a/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Split.sql b/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Split.sql index 1b2153d2..33a0de07 100644 --- a/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Split.sql +++ b/samples/features/ssms-templates/Sql/Partition Function/Alter Partition Function Split.sql @@ -16,4 +16,4 @@ ALTER PARTITION FUNCTION () SPLIT RANGE (); GO - + diff --git a/samples/features/ssms-templates/Sql/Partition Function/Create Partitioned Table.sql b/samples/features/ssms-templates/Sql/Partition Function/Create Partitioned Table.sql index 93abef1e..09339810 100644 --- a/samples/features/ssms-templates/Sql/Partition Function/Create Partitioned Table.sql +++ b/samples/features/ssms-templates/Sql/Partition Function/Create Partitioned Table.sql @@ -1,7 +1,7 @@ --==================================================== -- Create partitioned table template -- --- This template assumes AdventureWorks database +-- This template assumes AdventureWorks database -- has three filegroups named, -- PRIMARY -- TransactionHistoryGroup @@ -15,16 +15,16 @@ IF OBJECT_ID('.. GO -IF EXISTS( - SELECT * +IF EXISTS( + SELECT * FROM sys.partition_schemes WHERE name = N'' ) DROP PARTITION SCHEME GO -IF EXISTS( - SELECT * +IF EXISTS( + SELECT * FROM sys.partition_functions WHERE name = N'' ) @@ -33,21 +33,21 @@ GO -- Create partition function CREATE PARTITION FUNCTION () -AS +AS RANGE LEFT FOR VALUES (1, 1000) GO -- Create partition scheme CREATE PARTITION SCHEME -AS +AS PARTITION TO ([PRIMARY], TransactionHistoryGroup, WorkOrderGroup) GO -- Create table on partition scheme -CREATE TABLE . +CREATE TABLE . ( - col1 int, + col1 int, col2 char(10) ) - ON (col1) + ON (col1) GO diff --git a/samples/features/ssms-templates/Sql/Partition Function/Drop Partition Function.sql b/samples/features/ssms-templates/Sql/Partition Function/Drop Partition Function.sql index ce4b1ca6..0b049417 100644 --- a/samples/features/ssms-templates/Sql/Partition Function/Drop Partition Function.sql +++ b/samples/features/ssms-templates/Sql/Partition Function/Drop Partition Function.sql @@ -2,7 +2,7 @@ -- Drop Partition Function -- ========================== --- A partition function can be dropped only if there are no partition +-- A partition function can be dropped only if there are no partition -- schemes currently using the partition function. DROP PARTITION FUNCTION ; GO diff --git a/samples/features/ssms-templates/Sql/Partition Scheme/Alter Partition Scheme Mark Next Used.sql b/samples/features/ssms-templates/Sql/Partition Scheme/Alter Partition Scheme Mark Next Used.sql index 45430d7a..f740d439 100644 --- a/samples/features/ssms-templates/Sql/Partition Scheme/Alter Partition Scheme Mark Next Used.sql +++ b/samples/features/ssms-templates/Sql/Partition Scheme/Alter Partition Scheme Mark Next Used.sql @@ -4,11 +4,11 @@ USE ; GO --- Adds a filegroup to a partition scheme or alters the designation of the +-- Adds a filegroup to a partition scheme or alters the designation of the -- NEXT USED filegroup for the partition scheme ALTER PARTITION SCHEME NEXT USED ; --- Filegroup filegroup_name, sysname, test5fg> will receive any additional partition of a --- partitioned table or index as a result of +-- Filegroup filegroup_name, sysname, test5fg> will receive any additional partition of a +-- partitioned table or index as a result of -- an ALTER PARTITION FUNCTION statement diff --git a/samples/features/ssms-templates/Sql/Partition Scheme/Create Partition Scheme.sql b/samples/features/ssms-templates/Sql/Partition Scheme/Create Partition Scheme.sql index 7cb5124a..6bb6ca27 100644 --- a/samples/features/ssms-templates/Sql/Partition Scheme/Create Partition Scheme.sql +++ b/samples/features/ssms-templates/Sql/Partition Scheme/Create Partition Scheme.sql @@ -12,7 +12,7 @@ GO -- Step 2. Create a partition scheme that references the function CREATE PARTITION SCHEME -AS - PARTITION +AS + PARTITION TO (, , ) GO diff --git a/samples/features/ssms-templates/Sql/Partition Scheme/Create Partitioned Nonclustered Index.sql b/samples/features/ssms-templates/Sql/Partition Scheme/Create Partitioned Nonclustered Index.sql index 6d613755..4fe2c63b 100644 --- a/samples/features/ssms-templates/Sql/Partition Scheme/Create Partitioned Nonclustered Index.sql +++ b/samples/features/ssms-templates/Sql/Partition Scheme/Create Partitioned Nonclustered Index.sql @@ -1,7 +1,7 @@ -- =================================================== -- Create Partitioned Non-Clustered Index template -- =================================================== --- This template assumes AdventureWorks database +-- This template assumes AdventureWorks database -- has three filegroups named, -- PRIMARY -- TransactionHistoryGroup @@ -15,16 +15,16 @@ IF OBJECT_ID('.. GO -IF EXISTS( - SELECT * +IF EXISTS( + SELECT * FROM sys.partition_schemes WHERE name = N'' ) DROP PARTITION SCHEME GO -IF EXISTS( - SELECT * +IF EXISTS( + SELECT * FROM sys.partition_functions WHERE name = N'' ) @@ -33,23 +33,23 @@ GO -- Create partition function CREATE PARTITION FUNCTION () -AS +AS RANGE LEFT FOR VALUES (1, 1000) GO -- Create partition scheme CREATE PARTITION SCHEME -AS +AS PARTITION TO ([PRIMARY], TransactionHistoryGroup, WorkOrderGroup) GO -- Create table on partition scheme -CREATE TABLE . +CREATE TABLE . ( - , + , col2 char(10) ) - ON () + ON () GO -- Create the index on the partition column () diff --git a/samples/features/ssms-templates/Sql/Partition Scheme/Drop Partition Scheme.sql b/samples/features/ssms-templates/Sql/Partition Scheme/Drop Partition Scheme.sql index 7864c07b..d287297a 100644 --- a/samples/features/ssms-templates/Sql/Partition Scheme/Drop Partition Scheme.sql +++ b/samples/features/ssms-templates/Sql/Partition Scheme/Drop Partition Scheme.sql @@ -6,5 +6,5 @@ GO DROP PARTITION SCHEME ; --- A partition scheme can be dropped only if there are no +-- A partition scheme can be dropped only if there are no -- tables or indexes currently using the partition scheme. diff --git a/samples/features/ssms-templates/Sql/Recursive Queries/Common Table Expression With Averages.sql b/samples/features/ssms-templates/Sql/Recursive Queries/Common Table Expression With Averages.sql index 92cb3105..5ade0785 100644 --- a/samples/features/ssms-templates/Sql/Recursive Queries/Common Table Expression With Averages.sql +++ b/samples/features/ssms-templates/Sql/Recursive Queries/Common Table Expression With Averages.sql @@ -2,20 +2,20 @@ -- Common Table Expression With Averages template -- ================================================= -- Using a common table expression to limit counts and report averages --- The following example shows the average number of employees reporting +-- The following example shows the average number of employees reporting -- to managers with Adventure Works database. USE ; GO -WITH (, ) AS +WITH (, ) AS ( SELECT , COUNT(*) AS FROM . GROUP BY -) +) SELECT AVG() AS [Average Number of Direct Reports] -FROM +FROM WHERE >= 2 ; GO diff --git a/samples/features/ssms-templates/Sql/Recursive Queries/Direct Reports Recursion Example.sql b/samples/features/ssms-templates/Sql/Recursive Queries/Direct Reports Recursion Example.sql index 45f05386..a2413561 100644 --- a/samples/features/ssms-templates/Sql/Recursive Queries/Direct Reports Recursion Example.sql +++ b/samples/features/ssms-templates/Sql/Recursive Queries/Direct Reports Recursion Example.sql @@ -1,10 +1,10 @@ -- =================================== -- Direct Reports Recursion Example -- =================================== --- The following example shows the semantics of the recursive CTE structure by returning a --- hierarchical list of employees, starting with the highest ranking employee, in the --- Adventure Works Cycles company. The statement that executes the CTE limits the result --- set to employees in the Research and Development Group. A walkthrough of the code execution +-- The following example shows the semantics of the recursive CTE structure by returning a +-- hierarchical list of employees, starting with the highest ranking employee, in the +-- Adventure Works Cycles company. The statement that executes the CTE limits the result +-- set to employees in the Research and Development Group. A walkthrough of the code execution -- follows the example. USE ; @@ -14,7 +14,7 @@ WITH (, , e., e.Title, edh.DepartmentID, + SELECT e., e., e.Title, edh.DepartmentID, 0 AS FROM . AS e INNER JOIN .EmployeeDepartmentHistory AS edh diff --git a/samples/features/ssms-templates/Sql/Recursive Queries/Product Assemblies Recursion Example.sql b/samples/features/ssms-templates/Sql/Recursive Queries/Product Assemblies Recursion Example.sql index 01efbe5b..76c06126 100644 --- a/samples/features/ssms-templates/Sql/Recursive Queries/Product Assemblies Recursion Example.sql +++ b/samples/features/ssms-templates/Sql/Recursive Queries/Product Assemblies Recursion Example.sql @@ -1,9 +1,9 @@ -- ================================================ -- Product Assemblies Recursion Example template -- ================================================ --- Uses a common table expression to selectively step through a recursive +-- Uses a common table expression to selectively step through a recursive -- relationship in a SELECT statement. --- The following example shows the hierarchy of product assemblies and +-- The following example shows the hierarchy of product assemblies and -- components that are required to build the bicycle for ProductAssemblyID = 800. USE ; @@ -19,13 +19,13 @@ WITH (, + 1 - FROM Production.BillOfMaterials AS bom + FROM Production.BillOfMaterials AS bom INNER JOIN AS p ON bom.ProductAssemblyID = p. AND bom.EndDate IS NULL ) SELECT , , Name, PerAssemblyQty, EndDate, - + FROM AS p INNER JOIN Production.Product AS pr ON p. = pr.ProductID diff --git a/samples/features/ssms-templates/Sql/Resource Governor/Configure Resource Governor.sql b/samples/features/ssms-templates/Sql/Resource Governor/Configure Resource Governor.sql index f88f0a0e..8ea218fa 100644 --- a/samples/features/ssms-templates/Sql/Resource Governor/Configure Resource Governor.sql +++ b/samples/features/ssms-templates/Sql/Resource Governor/Configure Resource Governor.sql @@ -2,13 +2,13 @@ -- Template generated from Template Explorer using: -- Configure Resource Governor.sql -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- --- This template creates "admin" workload group +-- This template creates "admin" workload group -- which uses "admin" resource pool and creates --- corresponding classifier function which puts +-- corresponding classifier function which puts -- sysadmins in such group -- ================================================ -- Classifier functions for the Resource Governor must @@ -55,8 +55,8 @@ GO -- TODO -- Create additional workload groups here -CREATE FUNCTION () -RETURNS sysname +CREATE FUNCTION () +RETURNS sysname WITH SCHEMABINDING AS BEGIN @@ -76,8 +76,8 @@ END GO -- Set the classifier function for Resource Governor -ALTER RESOURCE GOVERNOR -WITH ( +ALTER RESOURCE GOVERNOR +WITH ( CLASSIFIER_FUNCTION = ) GO diff --git a/samples/features/ssms-templates/Sql/Restore/Restore Database.sql b/samples/features/ssms-templates/Sql/Restore/Restore Database.sql index df82d4fb..af306491 100644 --- a/samples/features/ssms-templates/Sql/Restore/Restore Database.sql +++ b/samples/features/ssms-templates/Sql/Restore/Restore Database.sql @@ -5,10 +5,10 @@ USE master GO RESTORE DATABASE - FROM DISK = N'.bak' -WITH - FILE = 1, - NOUNLOAD, + FROM DISK = N'.bak' +WITH + FILE = 1, + NOUNLOAD, REPLACE, STATS = 10 GO diff --git a/samples/features/ssms-templates/Sql/Restore/Restore Files and Filegroups.sql b/samples/features/ssms-templates/Sql/Restore/Restore Files and Filegroups.sql index 5bb2209f..1d56be13 100644 --- a/samples/features/ssms-templates/Sql/Restore/Restore Files and Filegroups.sql +++ b/samples/features/ssms-templates/Sql/Restore/Restore Files and Filegroups.sql @@ -3,77 +3,77 @@ -- ======================================= -- Create database using three file groups, including PRIMARY -CREATE DATABASE [] ON +CREATE DATABASE [] ON PRIMARY ( - Name= N'_data', + Name= N'_data', FILENAME= N'_data.mdf'), FILEGROUP [] ( - NAME=N' _', + NAME=N' _', FILENAME =N'_.ndf'), FILEGROUP [] ( - NAME=N' _', + NAME=N' _', FILENAME =N'_.ndf') LOG ON ( - NAME =N'_log', + NAME =N'_log', FILENAME =N'_log.ldf'); GO -- Backup database -BACKUP DATABASE [] +BACKUP DATABASE [] FILEGROUP=N'PRIMARY', FILEGROUP=N'', - FILEGROUP=N'' + FILEGROUP=N'' TO DISK = N'.bak' -- Backup log -BACKUP LOG [] - TO DISK = '.bak' - WITH +BACKUP LOG [] + TO DISK = '.bak' + WITH NO_TRUNCATE , - NORECOVERY, - NOFORMAT, - NOINIT, - NAME = ' backup', - SKIP, - NOREWIND, - NOUNLOAD, + NORECOVERY, + NOFORMAT, + NOINIT, + NAME = ' backup', + SKIP, + NOREWIND, + NOUNLOAD, STATS = 10 -- Restore filegroups - one at a time -RESTORE DATABASE [] - FILE = N'_data' - FROM DISK = N'.bak' - WITH - FILE = 1, - NORECOVERY, - NOUNLOAD, +RESTORE DATABASE [] + FILE = N'_data' + FROM DISK = N'.bak' + WITH + FILE = 1, + NORECOVERY, + NOUNLOAD, STATS = 10 GO -RESTORE DATABASE [] - FILE = N' _' - FROM DISK = N'.bak' - WITH - FILE = 1, - NORECOVERY, - NOUNLOAD, +RESTORE DATABASE [] + FILE = N' _' + FROM DISK = N'.bak' + WITH + FILE = 1, + NORECOVERY, + NOUNLOAD, STATS = 10 GO -RESTORE DATABASE [] - FILE = N' _' - FROM DISK = N'.bak' - WITH - FILE = 1, - NORECOVERY, - NOUNLOAD, +RESTORE DATABASE [] + FILE = N' _' + FROM DISK = N'.bak' + WITH + FILE = 1, + NORECOVERY, + NOUNLOAD, STATS = 10 -- Restore log -RESTORE LOG [] - FROM DISK = N'.bak' - WITH - FILE = 2, - NOUNLOAD, +RESTORE LOG [] + FROM DISK = N'.bak' + WITH + FILE = 2, + NOUNLOAD, STATS = 10 GO diff --git a/samples/features/ssms-templates/Sql/Rule/Create Bound Rule.sql b/samples/features/ssms-templates/Sql/Rule/Create Bound Rule.sql index 5035f436..52973dd9 100644 --- a/samples/features/ssms-templates/Sql/Rule/Create Bound Rule.sql +++ b/samples/features/ssms-templates/Sql/Rule/Create Bound Rule.sql @@ -13,7 +13,7 @@ AS GO -- Bind the rule to a specific column in a table -EXEC sp_bindrule +EXEC sp_bindrule '.', '..' GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Create Database Trigger.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Create Database Trigger.sql index 709ca5b6..7f5f6436 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Create Database Trigger.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Create Database Trigger.sql @@ -1,6 +1,6 @@ -- =========================================================== -- Create database ddl trigger template for Azure SQL Database --- =========================================================== +-- =========================================================== -- Drop the database ddl trigger if it already exists IF EXISTS( SELECT * @@ -11,12 +11,12 @@ IF EXISTS( DROP TRIGGER ON DATABASE GO -CREATE TRIGGER ON DATABASE - FOR -AS +CREATE TRIGGER ON DATABASE + FOR +AS IF IS_MEMBER ('db_owner') = 0 BEGIN - PRINT 'You must ask your DBA to drop or alter tables!' + PRINT 'You must ask your DBA to drop or alter tables!' ROLLBACK TRANSACTION END GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Drop Database Trigger.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Drop Database Trigger.sql index 73838141..9564fd82 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Drop Database Trigger.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Database Trigger/Drop Database Trigger.sql @@ -8,4 +8,4 @@ IF EXISTS( AND parent_class_desc = N'DATABASE' ) DROP TRIGGER ON DATABASE -GO +GO 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 eeb19c1e..cc208e3a 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,25 +1,25 @@ -- =================================================================================================================================== -- 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 +-- 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. -- --- SQL Database is a relational database-as-a-service that makes tier-1 capabilities easily accessible --- for cloud architects and developers by delivering predictable performance, scalability, business --- continuity, data protection and security, and near-zero administration — all backed by the power +-- SQL Database is a relational database-as-a-service that makes tier-1 capabilities easily accessible +-- for cloud architects and developers by delivering predictable performance, scalability, business +-- continuity, data protection and security, and near-zero administration � all backed by the pow -- and reach of Microsoft Azure. -- --- SQL Database is available in the following service tiers: GeneralPurpose, 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 +-- 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 +-- 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 https://go.microsoft.com/fwlink/p/?LinkId=306622 for more information about Azure SQL Database. --- +-- -- See https://go.microsoft.com/fwlink/?LinkId=787140 for more information about Azure Synapse Analytics. -- -- See https://go.microsoft.com/fwlink/p/?LinkId=402063 for more information about CREATE DATABASE for Azure SQL Database. @@ -27,8 +27,8 @@ -- See https://go.microsoft.com/fwlink/?LinkId=787139 for more information about CREATE DATABASE for Azure Synapse Analytics Database. -- =================================================================================================================================== - -CREATE DATABASE COLLATE + +CREATE DATABASE COLLATE ( EDITION = '', SERVICE_OBJECTIVE='', 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 c8923004..3a1400d7 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,5 +1,5 @@ -- ======================================================================== --- Alter external data source template for Azure Synapse Analytics Database +-- Alter external data source template for Azure Synapse Analytics Database -- ======================================================================== ALTER EXTERNAL DATA SOURCE SET 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 1f7b36b3..59ea529b 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,11 +1,11 @@ -- ========================================================================= --- Create external data source template for Azure Synapse Analytics Database +-- Create external data source template for Azure Synapse Analytics Database -- ========================================================================= 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 1072e9f9..b07aa20d 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 @@ -5,7 +5,7 @@ IF EXISTS ( SELECT * FROM sys.external_data_sources - WHERE name = N'' + 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 1772c506..801239a9 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,11 +1,11 @@ -- ========================================================================= --- Create external file format template for Azure Synapse Analytics Database +-- Create external file format template for Azure Synapse Analytics Database -- ========================================================================= IF EXISTS ( SELECT * FROM sys.external_file_formats - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL FILE FORMAT GO @@ -14,7 +14,7 @@ CREATE EXTERNAL FILE FORMAT WITH ( FORMAT_TYPE = , SERDE_METHOD = N'', - FORMAT_OPTIONS + FORMAT_OPTIONS ( FIELD_TERMINATOR = N'', STRING_DELIMITER = N'', 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 352a5617..f819fdb3 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 @@ -5,7 +5,7 @@ IF EXISTS ( SELECT * FROM sys.external_file_formats - WHERE name = N'' + WHERE name = N'' ) DROP EXTERNAL FILE FORMAT GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Inline Function (New Menu).sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Inline Function (New Menu).sql index ee90a137..b72e1612 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Inline Function (New Menu).sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Inline Function (New Menu).sql @@ -10,15 +10,15 @@ GO -- Create date: -- Description: -- ============================================= -CREATE FUNCTION +CREATE FUNCTION ( -- Add the parameters for the function here - <@param1, sysname, @p1> , + <@param1, sysname, @p1> , <@param2, sysname, @p2> ) -RETURNS TABLE +RETURNS TABLE AS -RETURN +RETURN ( -- Add the SELECT statement with parameter references here SELECT 0 AS diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Function (New Menu).sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Function (New Menu).sql index 1d06c025..7c0061c4 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Function (New Menu).sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Function (New Menu).sql @@ -10,23 +10,23 @@ GO -- Create date: -- Description: -- ============================================= -CREATE FUNCTION +CREATE FUNCTION ( -- Add the parameters for the function here - <@param1, sysname, @p1> , + <@param1, sysname, @p1> , <@param2, sysname, @p2> ) -RETURNS -<@Table_Variable_Name, sysname, @Table_Var> TABLE +RETURNS +<@Table_Variable_Name, sysname, @Table_Var> TABLE ( -- Add the column definitions for the TABLE variable here - , + , ) AS BEGIN -- Fill the table variable with the rows for your result set - RETURN + RETURN END GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Table-valued Function.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Table-valued Function.sql index b52b79de..c42cce68 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Table-valued Function.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Multi-statement Table-valued Function.sql @@ -6,7 +6,7 @@ IF OBJECT_ID (N'..( ) -RETURNS TABLE +RETURNS TABLE ( -- columns returned by the function NOT NULL, @@ -24,7 +24,7 @@ BEGIN 1, CONVERT(varchar(255), c.FirstName + ' ' + c.LastName) FROM HumanResources.Employee AS e - JOIN Person.Contact AS c ON e.ContactID = c.ContactID + JOIN Person.Contact AS c ON e.ContactID = c.ContactID WHERE e.EmployeeID = @InEmpID UNION ALL SELECT CONVERT(varchar(255), REPLICATE ('| ' , EmployeeLevel) + @@ -32,17 +32,17 @@ BEGIN e.Title, e.EmployeeID, EmployeeLevel + 1, - CONVERT (varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' + + CONVERT (varchar(255), RTRIM(Sort) + '| ' + FirstName + ' ' + LastName) FROM HumanResources.Employee as e JOIN Person.Contact AS c ON e.ContactID = c.ContactID JOIN DirectReports AS d ON e.ManagerID = d.EmployeeID ) - -- copy the required columns to the result of the function + -- copy the required columns to the result of the function INSERT @retFindReports SELECT EmployeeID, Name, Title, EmployeeLevel - FROM DirectReports + FROM DirectReports ORDER BY Sort RETURN END diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Natively Compiled Scalar Function.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Natively Compiled Scalar Function.sql index ff118fab..475e28da 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Natively Compiled Scalar Function.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Function/Create Natively Compiled Scalar Function.sql @@ -2,8 +2,8 @@ -- Template generated from Template Explorer using: -- Create Natively Compiled Scalar Function.SQL -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in @@ -19,7 +19,7 @@ GO -- Create date: -- Description: -- ============================================= -CREATE FUNCTION [] +CREATE FUNCTION [] ( -- Add the parameters for the function here <@Param1, sysname, @p1> 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 b37b8b6f..55b41e81 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,9 +1,9 @@ -- ================================================================================= --- Create index template for Azure SQL Database and Azure Synapse Analytics Database +-- Create index template for Azure SQL Database and Azure Synapse Analytics Database -- ================================================================================= CREATE INDEX -ON . +ON . ( ) diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Unique Clustered Index.Sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Unique Clustered Index.Sql index 02bd1d14..89d1271f 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Unique Clustered Index.Sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Index/Create Unique Clustered Index.Sql @@ -2,14 +2,14 @@ -- Create Unique Clustered Index template for Azure SQL Database -- =============================================================== -CREATE UNIQUE CLUSTERED INDEX -ON . +CREATE UNIQUE CLUSTERED INDEX +ON . ( ASC ) -WITH +WITH ( DROP_EXISTING = OFF -) +) GO 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 519f58f2..8bd4821c 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 @@ -2,6 +2,6 @@ -- Create SQL Login template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand -- ============================================================================================================================= -CREATE LOGIN - WITH PASSWORD = '' +CREATE LOGIN + WITH PASSWORD = '' 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 174dd2bb..cd7fbab2 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 @@ -6,17 +6,17 @@ CREATE ROLE AUTHORIZATION [dbo] GO -- Grant access rights to a specific schema in the database -GRANT - ALTER, - CONTROL, - DELETE, - EXECUTE, - INSERT, - REFERENCES, - SELECT, - TAKE OWNERSHIP, - UPDATE, - VIEW DEFINITION +GRANT + ALTER, + CONTROL, + DELETE, + EXECUTE, + INSERT, + REFERENCES, + SELECT, + TAKE OWNERSHIP, + UPDATE, + VIEW DEFINITION ON SCHEMA:: TO GO @@ -26,4 +26,4 @@ EXEC sp_addrolemember N'', N' -- Add the filter predicates here - ADD FILTER PREDICATE .() + ADD FILTER PREDICATE .() ON . --Set the state on or off WITH (STATE = ) 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 61e49403..da3b424a 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,12 +1,12 @@ -- ====================================================================================================================================== -- Create Sampled Statistics Template for Azure SQL Database, Azure Synapse Analytics Database, and Azure Synapse SQL Analytics on-demand -- ====================================================================================================================================== -CREATE STATISTICS +CREATE STATISTICS ON . -( +( , -) +) WITH SAMPLE PERCENT; GO -- Instead of PERCENT, you can say ROWS to specify the number of rows to sample. diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Natively Compiled Stored Procedure.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Natively Compiled Stored Procedure.sql index 0d966e5b..3def5291 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Natively Compiled Stored Procedure.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Stored Procedure/Create Natively Compiled Stored Procedure.sql @@ -9,7 +9,7 @@ GO CREATE PROCEDURE . -- Add the parameters for the stored procedure here - <@param1, sysname, @p1> = , + <@param1, sysname, @p1> = , <@param2, sysname, @p2> = WITH NATIVE_COMPILATION, SCHEMABINDING AS BEGIN ATOMIC WITH 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 7af30c9e..1b9f96fe 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 @@ -4,10 +4,10 @@ -- Drop stored procedure if it already exists IF EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.ROUTINES + SELECT * + FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_SCHEMA = N'' - AND SPECIFIC_NAME = N'' + AND SPECIFIC_NAME = N'' ) DROP PROCEDURE . GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Append-Only Ledger Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Append-Only Ledger Table.sql index f35bd318..ad585fcf 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Append-Only Ledger Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Append-Only Ledger Table.sql @@ -1,10 +1,10 @@ -- ============================== -- Create Append-Only Ledger Table Template -- Use the Specify Values for Template Parameters command (Ctrl-Shift-M) to fill in the parameter values below. --- +-- -- For more details on ledger tables please refer to MSDN documentation: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-overview --- +-- -- To learn more how to use append-only ledger tables in your applications: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-append-only-ledger-tables -- ============================== diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Memory Optimized Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Memory Optimized Table.sql index 2157552e..e7f2390e 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Memory Optimized Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Memory Optimized Table.sql @@ -12,9 +12,9 @@ GO CREATE TABLE . ( - , + , , - INDEX NONCLUSTERED (), + INDEX NONCLUSTERED (), CONSTRAINT PRIMARY KEY NONCLUSTERED (), -- See SQL Server Books Online for guidelines on determining appropriate bucket count for the index 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 2496fbf9..5471ad08 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 @@ -1,18 +1,18 @@ -- ========================================= -- Create system-versioned temporal table template -- Use the Specify Values for Template Parameters command (Ctrl-Shift-M) to fill in the parameter values below. --- +-- -- This template creates a system-versioned temporal table. --- +-- -- For more details on system-versioned temporal tables please refer to MSDN documentation: -- https://msdn.microsoft.com/en-IN/library/dn935015.aspx#Anchor_0 --- +-- -- To learn more how to use system-versioned tables in your applications, take a look at "Getting Started with System-Versioned Temporal Tables": -- https://msdn.microsoft.com/en-US/library/mt604462.aspx -- ========================================= BEGIN - --If table is system-versioned, SYSTEM_VERSIONING must be set to OFF first + --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) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) @@ -38,8 +38,8 @@ CREATE TABLE [].[].[], diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Table.sql index 2b9751dc..12dd0978 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Table.sql @@ -1,5 +1,5 @@ -- ======================================== --- Create table template Azure SQL Database +-- Create table template Azure SQL Database -- ======================================== IF OBJECT_ID('.', 'U') IS NOT NULL @@ -8,9 +8,9 @@ GO CREATE TABLE . ( - , - , - , + , + , + , CONSTRAINT PRIMARY KEY () ) GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Updatable Ledger Table.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Updatable Ledger Table.sql index d5be9622..3eaa6ea9 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Updatable Ledger Table.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Table/Create Updatable Ledger Table.sql @@ -1,10 +1,10 @@ -- ============================== -- Create Updatable Ledger Table Template -- Use the Specify Values for Template Parameters command (Ctrl-Shift-M) to fill in the parameter values below. --- +-- -- For more details on ledger tables please refer to MSDN documentation: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-overview --- +-- -- To learn more how to use updatable ledger tables in your applications: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-updatable-ledger-tables -- ============================== @@ -30,7 +30,7 @@ WITH --Set SYSTEM_VERSIONING to ON SYSTEM_VERSIONING = ON ( - --Option to specify the name of the ledger history table. If not supplied, the history table will be created with the + --Option to specify the name of the ledger history table. If not supplied, the history table will be created with the --default name format: [].[MSSQL_LedgerHistoryFor_] HISTORY_TABLE = [].[] ), 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 8bca0fcf..6f7d3d81 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,5 +1,5 @@ --================================================================================ --- Drop Table template for Azure SQL Database and Azure Synapse Analytics Database +-- Drop Table template for Azure SQL Database and Azure Synapse Analytics Database --================================================================================ IF EXISTS ( SELECT * diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Create T-SQL Trigger (New Menu).sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Create T-SQL Trigger (New Menu).sql index 5fde55b0..d644a8a3 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Create T-SQL Trigger (New Menu).sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Create T-SQL Trigger (New Menu).sql @@ -1,5 +1,5 @@ -- ============================================== --- Create dml trigger template Azure SQL Database +-- Create dml trigger template Azure SQL Database -- ============================================== -- Drop the dml trigger if it already exists IF EXISTS( @@ -11,10 +11,10 @@ IF EXISTS( DROP TRIGGER . GO -CREATE TRIGGER . - ON . +CREATE TRIGGER . + ON . AFTER -AS +AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Drop Trigger.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Drop Trigger.sql index ae6262a6..58ca571c 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Drop Trigger.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/Trigger/Drop Trigger.sql @@ -1,5 +1,5 @@ -- ============================================ --- Drop dml trigger template Azure SQL Database +-- Drop dml trigger template Azure SQL Database -- ============================================ IF EXISTS( diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Data Type/Create User-defined Data Type.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Data Type/Create User-defined Data Type.sql index 4c66f32c..d0788245 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Data Type/Create User-defined Data Type.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Data Type/Create User-defined Data Type.sql @@ -2,7 +2,7 @@ -- Create User-defined Data Type template for Azure SQL Database -- ============================================================= -CREATE TYPE . +CREATE TYPE . FROM () GO diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql index 3625602e..464f5ecd 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql @@ -11,9 +11,9 @@ GO CREATE TYPE . AS TABLE ( - , + , , - INDEX NONCLUSTERED (), + INDEX NONCLUSTERED (), PRIMARY KEY NONCLUSTERED (), -- See SQL Server Books Online for guidelines on determining appropriate bucket count for the index diff --git a/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Table Type.sql b/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Table Type.sql index baf3febb..41450f35 100644 --- a/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Table Type.sql +++ b/samples/features/ssms-templates/Sql/SQL Azure Database/User-defined Table Type/Create User-defined Table Type.sql @@ -2,11 +2,11 @@ -- Create User-defined Table Type template for Azure SQL Database -- ============================================================== -CREATE TYPE . AS TABLE +CREATE TYPE . AS TABLE ( - , - , - , + , + , + , PRIMARY KEY () ) GO diff --git a/samples/features/ssms-templates/Sql/SQL Mail/Simple Database Mail Configuration.sql b/samples/features/ssms-templates/Sql/SQL Mail/Simple Database Mail Configuration.sql index 1876fb84..fb04ac42 100644 --- a/samples/features/ssms-templates/Sql/SQL Mail/Simple Database Mail Configuration.sql +++ b/samples/features/ssms-templates/Sql/SQL Mail/Simple Database Mail Configuration.sql @@ -1,7 +1,7 @@ ------------------------------------------------------------- -- Database Mail Simple Configuration Template. -- --- This template creates a Database Mail profile, an SMTP account and +-- This template creates a Database Mail profile, an SMTP account and -- associates the account to the profile. -- The template does not grant access to the new profile for -- any database principals. Use msdb.dbo.sysmail_add_principalprofile diff --git a/samples/features/ssms-templates/Sql/SQL Trace/Default Profiler Trace.sql b/samples/features/ssms-templates/Sql/SQL Trace/Default Profiler Trace.sql index 0880e5cb..e40bb4f8 100644 --- a/samples/features/ssms-templates/Sql/SQL Trace/Default Profiler Trace.sql +++ b/samples/features/ssms-templates/Sql/SQL Trace/Default Profiler Trace.sql @@ -9,11 +9,11 @@ declare @maxfilesize bigint declare @traceoptions int declare @stoptime datetime set @traceoptions = -set @maxfilesize = +set @maxfilesize = set @stoptime = -- Create the trace with the name of the output file - .trc extension is added to filename -exec @rc = sp_trace_create @TraceID output, , N'', @maxfilesize, +exec @rc = sp_trace_create @TraceID output, , N'', @maxfilesize, if (@rc != 0) goto error -- Set the events @@ -93,8 +93,8 @@ exec sp_trace_setstatus @TraceID, 1 select TraceID=@TraceID goto finish -error: +error: select ErrorCode=@rc -finish: +finish: go diff --git a/samples/features/ssms-templates/Sql/SQLiMail/Simple Configuration.sql b/samples/features/ssms-templates/Sql/SQLiMail/Simple Configuration.sql index ada4e7dc..f97e6d6a 100644 --- a/samples/features/ssms-templates/Sql/SQLiMail/Simple Configuration.sql +++ b/samples/features/ssms-templates/Sql/SQLiMail/Simple Configuration.sql @@ -1,7 +1,7 @@ ------------------------------------------------------------- -- SQLiMail Simple Configuration Template. -- --- This template creates a SQLiMail profile, an SMTP account and +-- This template creates a SQLiMail profile, an SMTP account and -- associates the account to the profile. -- The template does not grant access to the new profile for -- any database principals. Use msdb.dbo.sysmail_add_principalprofile diff --git a/samples/features/ssms-templates/Sql/Security Policy/Create Security Policy.sql b/samples/features/ssms-templates/Sql/Security Policy/Create Security Policy.sql index 8c974739..79ae0c8a 100644 --- a/samples/features/ssms-templates/Sql/Security Policy/Create Security Policy.sql +++ b/samples/features/ssms-templates/Sql/Security Policy/Create Security Policy.sql @@ -4,8 +4,8 @@ -- This template assumes that the inline function -- and table for the policy exist in the database. -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in @@ -22,7 +22,7 @@ GO -- ============================================= CREATE SECURITY POLICY -- Add the filter predicates here - ADD FILTER PREDICATE .() + ADD FILTER PREDICATE .() ON . --Set the state on or off WITH (STATE = ) diff --git a/samples/features/ssms-templates/Sql/Server Role/Add Server Role Member.sql b/samples/features/ssms-templates/Sql/Server Role/Add Server Role Member.sql index e4de8b20..47d0ea3d 100644 --- a/samples/features/ssms-templates/Sql/Server Role/Add Server Role Member.sql +++ b/samples/features/ssms-templates/Sql/Server Role/Add Server Role Member.sql @@ -5,6 +5,6 @@ USE [master] GO -- Add an existing principal as a role member -ALTER SERVER ROLE [] +ALTER SERVER ROLE [] ADD MEMBER [] GO diff --git a/samples/features/ssms-templates/Sql/Server Role/Create Server Role.sql b/samples/features/ssms-templates/Sql/Server Role/Create Server Role.sql index 0a9fd1d9..d0b8f7cd 100644 --- a/samples/features/ssms-templates/Sql/Server Role/Create Server Role.sql +++ b/samples/features/ssms-templates/Sql/Server Role/Create Server Role.sql @@ -6,8 +6,8 @@ GO -- Drop the server role if it already exists IF EXISTS ( - SELECT name - FROM sys.server_principals + SELECT name + FROM sys.server_principals WHERE name = N'' ) DROP SERVER ROLE [] diff --git a/samples/features/ssms-templates/Sql/Server Role/Drop Server Role Member.sql b/samples/features/ssms-templates/Sql/Server Role/Drop Server Role Member.sql index d191b049..92872051 100644 --- a/samples/features/ssms-templates/Sql/Server Role/Drop Server Role Member.sql +++ b/samples/features/ssms-templates/Sql/Server Role/Drop Server Role Member.sql @@ -5,6 +5,6 @@ USE [master] GO -- Revoke membership of an existing principal from a server role -ALTER SERVER ROLE [] +ALTER SERVER ROLE [] DROP MEMBER [] GO diff --git a/samples/features/ssms-templates/Sql/Server Role/Drop Server Role.sql b/samples/features/ssms-templates/Sql/Server Role/Drop Server Role.sql index 1842b4e4..dc8e0941 100644 --- a/samples/features/ssms-templates/Sql/Server Role/Drop Server Role.sql +++ b/samples/features/ssms-templates/Sql/Server Role/Drop Server Role.sql @@ -6,11 +6,11 @@ GO -- Drop the server role if it exists IF EXISTS ( - SELECT name - FROM sys.server_principals + SELECT name + FROM sys.server_principals WHERE name = N'' ) -- Drop an existing server role -DROP SERVER ROLE [] +DROP SERVER ROLE [] GO diff --git a/samples/features/ssms-templates/Sql/Server Role/Rename Server Role.sql b/samples/features/ssms-templates/Sql/Server Role/Rename Server Role.sql index b5ab8e0d..014c6660 100644 --- a/samples/features/ssms-templates/Sql/Server Role/Rename Server Role.sql +++ b/samples/features/ssms-templates/Sql/Server Role/Rename Server Role.sql @@ -5,6 +5,6 @@ USE [master] GO -- Rename the server role -ALTER SERVER ROLE [] +ALTER SERVER ROLE [] WITH NAME = [] GO diff --git a/samples/features/ssms-templates/Sql/Server Trigger/Alter Server Trigger.sql b/samples/features/ssms-templates/Sql/Server Trigger/Alter Server Trigger.sql index df62449b..74112534 100644 --- a/samples/features/ssms-templates/Sql/Server Trigger/Alter Server Trigger.sql +++ b/samples/features/ssms-templates/Sql/Server Trigger/Alter Server Trigger.sql @@ -1,12 +1,12 @@ --==================================== --- Alter server trigger template +-- Alter server trigger template --==================================== -ALTER TRIGGER ON ALL SERVER -FOR +ALTER TRIGGER ON ALL SERVER +FOR AS IF IS_MEMBER ('db_owner') = 0 BEGIN - PRINT 'You must ask your DBA to drop or alter databases!' + PRINT 'You must ask your DBA to drop or alter databases!' ROLLBACK TRANSACTION END GO diff --git a/samples/features/ssms-templates/Sql/Server Trigger/Create Server Trigger.sql b/samples/features/ssms-templates/Sql/Server Trigger/Create Server Trigger.sql index 2c529726..d5cdd9d0 100644 --- a/samples/features/ssms-templates/Sql/Server Trigger/Create Server Trigger.sql +++ b/samples/features/ssms-templates/Sql/Server Trigger/Create Server Trigger.sql @@ -1,5 +1,5 @@ --==================================== --- Create server trigger template +-- Create server trigger template --==================================== IF EXISTS( SELECT * @@ -11,12 +11,12 @@ IF EXISTS( GO -CREATE TRIGGER trigger_name ON ALL SERVER -FOR +CREATE TRIGGER trigger_name ON ALL SERVER +FOR AS IF IS_MEMBER ('db_owner') = 0 BEGIN - PRINT 'You must ask your DBA to drop or alter databases!' + PRINT 'You must ask your DBA to drop or alter databases!' ROLLBACK TRANSACTION END GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Server Trigger/Drop Server Trigger.sql b/samples/features/ssms-templates/Sql/Server Trigger/Drop Server Trigger.sql index c3f966a5..506493b8 100644 --- a/samples/features/ssms-templates/Sql/Server Trigger/Drop Server Trigger.sql +++ b/samples/features/ssms-templates/Sql/Server Trigger/Drop Server Trigger.sql @@ -1,5 +1,5 @@ --==================================== --- Drop server trigger template +-- Drop server trigger template --==================================== IF EXISTS( SELECT * diff --git a/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response Contract.sql b/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response Contract.sql index 91a27e61..908e0ba8 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response Contract.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response Contract.sql @@ -15,9 +15,9 @@ go CREATE PROCEDURE [dbo].[] AS declare @message_body varbinary(MAX) - + declare @message_type int - declare @dialog uniqueidentifier + declare @dialog uniqueidentifier @@ -40,7 +40,7 @@ begin BEGIN Rollback Transaction BREAK - END + END -- Check for the End Dialog message. If (@message_type <> 2) -- End dialog message @@ -51,7 +51,7 @@ begin (@message_body); -- the message contents (a varbinary(MAX) blob END --- Commit the transaction. At any point before this, we could roll +-- Commit the transaction. At any point before this, we could roll -- back - the received message would be back on the queue and the response -- wouldn't be sent. commit transaction @@ -61,9 +61,9 @@ go -- Create the required meta-data -CREATE MESSAGE TYPE VALIDATION = NONE +CREATE MESSAGE TYPE VALIDATION = NONE -CREATE MESSAGE TYPE VALIDATION = NONE +CREATE MESSAGE TYPE VALIDATION = NONE CREATE CONTRACT ( SENT BY INITIATOR, @@ -71,9 +71,9 @@ CREATE CONTRACT CREATE QUEUE -CREATE SERVICE [] +CREATE SERVICE [] ON QUEUE -ALTER SERVICE [] +ALTER SERVICE [] ( ADD CONTRACT ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response with Activation.sql b/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response with Activation.sql index 3e9e1387..ee429be8 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response with Activation.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Application/Create Request Response with Activation.sql @@ -17,9 +17,9 @@ go CREATE PROCEDURE [dbo].[] AS declare @message_body varbinary(MAX) - + declare @message_type int - declare @dialog uniqueidentifier + declare @dialog uniqueidentifier @@ -42,7 +42,7 @@ begin BEGIN Rollback Transaction BREAK - END + END -- Check for the End Dialog message. If (@message_type <> 2) -- End dialog message @@ -53,7 +53,7 @@ begin (@message_body); -- the message contents (a varbinary(MAX) blob END --- Commit the transaction. At any point before this, we could roll +-- Commit the transaction. At any point before this, we could roll -- back - the received message would be back on the queue and the response -- wouldn't be sent. commit transaction @@ -64,9 +64,9 @@ go -- Create the required meta-data -CREATE MESSAGE TYPE VALIDATION = NONE +CREATE MESSAGE TYPE VALIDATION = NONE -CREATE MESSAGE TYPE VALIDATION = NONE +CREATE MESSAGE TYPE VALIDATION = NONE CREATE CONTRACT ( SENT BY INITIATOR, @@ -75,11 +75,11 @@ CREATE CONTRACT CREATE QUEUE WITH ACTIVATION ( PROCEDURE_NAME = [] , - MAX_QUEUE_READERS = 5, - EXECUTE AS SELF ) + MAX_QUEUE_READERS = 5, + EXECUTE AS SELF ) -CREATE SERVICE [] +CREATE SERVICE [] ON QUEUE -ALTER SERVICE [] +ALTER SERVICE [] ( ADD CONTRACT ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/Contract/Create Request Response Contract.sql b/samples/features/ssms-templates/Sql/Service Broker/Contract/Create Request Response Contract.sql index 3e0c7a1d..cd622590 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Contract/Create Request Response Contract.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Contract/Create Request Response Contract.sql @@ -8,6 +8,6 @@ -- ============================================= CREATE CONTRACT - AUTHORIZATION - ( SENT BY INITIATOR, + AUTHORIZATION + ( SENT BY INITIATOR, SENT BY TARGET ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/EndPoint/Create Broker Endpoint.sql b/samples/features/ssms-templates/Sql/Service Broker/EndPoint/Create Broker Endpoint.sql index ba6260c0..3cab3acd 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/EndPoint/Create Broker Endpoint.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/EndPoint/Create Broker Endpoint.sql @@ -3,7 +3,7 @@ -- Basic Create Service Broker Endpoint Template -- ============================================= -CREATE ENDPOINT +CREATE ENDPOINT AS TCP ( LISTENER_PORT = ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/MessageType/Add Message Type Validation.sql b/samples/features/ssms-templates/Sql/Service Broker/MessageType/Add Message Type Validation.sql index 3d92d16a..41a256df 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/MessageType/Add Message Type Validation.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/MessageType/Add Message Type Validation.sql @@ -3,6 +3,6 @@ -- Add Validation to Message Type Template -- ============================================= -ALTER MESSAGE TYPE VALIDATION = +ALTER MESSAGE TYPE VALIDATION = VALID_XML WITH SCHEMA COLLECTION diff --git a/samples/features/ssms-templates/Sql/Service Broker/MessageType/Create Message Type.sql b/samples/features/ssms-templates/Sql/Service Broker/MessageType/Create Message Type.sql index fb12b60d..715063f0 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/MessageType/Create Message Type.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/MessageType/Create Message Type.sql @@ -8,7 +8,7 @@ -- Description: -- ============================================= -CREATE MESSAGE TYPE -AUTHORIZATION +CREATE MESSAGE TYPE +AUTHORIZATION VALIDATION = - + diff --git a/samples/features/ssms-templates/Sql/Service Broker/Queue/Create Queue with Activation.sql b/samples/features/ssms-templates/Sql/Service Broker/Queue/Create Queue with Activation.sql index 51409788..273d783b 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Queue/Create Queue with Activation.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Queue/Create Queue with Activation.sql @@ -8,13 +8,13 @@ -- ============================================= CREATE QUEUE - WITH + WITH STATUS = ON, RETENTION = OFF , ACTIVATION ( STATUS = ON, PROCEDURE_NAME = , - MAX_QUEUE_READERS = , + MAX_QUEUE_READERS = , EXECUTE AS ), - POISON_MESSAGE_HANDLING (STATUS = ON) + POISON_MESSAGE_HANDLING (STATUS = ON) ON \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Activation.sql b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Activation.sql index 362bfd78..9bdee0c2 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Activation.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Activation.sql @@ -2,5 +2,5 @@ -- Turn Activation Off Template -- ============================================= -ALTER QUEUE - WITH ACTIVATION ( STATUS = OFF ) +ALTER QUEUE + WITH ACTIVATION ( STATUS = OFF ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Queue.sql b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Queue.sql index fe9089e7..43ac97c8 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Queue.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn Off Queue.sql @@ -2,5 +2,5 @@ -- Turn Queue Off Template -- ============================================= -ALTER QUEUE +ALTER QUEUE WITH STATUS = OFF diff --git a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Activation.sql b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Activation.sql index 354ab917..fe1239e3 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Activation.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Activation.sql @@ -2,5 +2,5 @@ -- Turn Activation ON Template -- ============================================= -ALTER QUEUE - WITH ACTIVATION ( STATUS = ON ) +ALTER QUEUE + WITH ACTIVATION ( STATUS = ON ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Queue.sql b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Queue.sql index 4e024deb..fd8a64d8 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Queue.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Queue/Turn On Queue.sql @@ -2,5 +2,5 @@ -- Turn Queue On Template -- ============================================= -ALTER QUEUE +ALTER QUEUE WITH STATUS = ON diff --git a/samples/features/ssms-templates/Sql/Service Broker/Route/Change Database Mirror Route Address.sql b/samples/features/ssms-templates/Sql/Service Broker/Route/Change Database Mirror Route Address.sql index fff2399a..1c140c0e 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Route/Change Database Mirror Route Address.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Route/Change Database Mirror Route Address.sql @@ -3,7 +3,7 @@ -- Change Mirror Route Address Template -- ============================================= -ALTER ROUTE WITH +ALTER ROUTE WITH MIRROR_ADDRESS = N'' diff --git a/samples/features/ssms-templates/Sql/Service Broker/Route/Change Route Address.sql b/samples/features/ssms-templates/Sql/Service Broker/Route/Change Route Address.sql index 8af16f97..82bc5782 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Route/Change Route Address.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Route/Change Route Address.sql @@ -3,6 +3,6 @@ -- Change Route Address Template -- ============================================= -ALTER ROUTE WITH +ALTER ROUTE WITH ADDRESS = N'' diff --git a/samples/features/ssms-templates/Sql/Service Broker/Route/Create Database Mirror Route.sql b/samples/features/ssms-templates/Sql/Service Broker/Route/Create Database Mirror Route.sql index 4ebd38d9..0d494b79 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Route/Create Database Mirror Route.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Route/Create Database Mirror Route.sql @@ -9,12 +9,12 @@ -- Description: -- ============================================= -CREATE ROUTE -AUTHORIZATION -WITH +CREATE ROUTE +AUTHORIZATION +WITH SERVICE_NAME = N'', - BROKER_INSTANCE = - N'' , + BROKER_INSTANCE = + N'' , LIFETIME = , ADDRESS = N'', MIRROR_ADDRESS = N'' diff --git a/samples/features/ssms-templates/Sql/Service Broker/Route/Create Route.sql b/samples/features/ssms-templates/Sql/Service Broker/Route/Create Route.sql index 80d42e31..ca64760b 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Route/Create Route.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Route/Create Route.sql @@ -2,9 +2,9 @@ -- Basic Create Route Template -- ============================================= -CREATE ROUTE -WITH +CREATE ROUTE +WITH SERVICE_NAME = N'', - BROKER_INSTANCE = - N'' , + BROKER_INSTANCE = + N'' , ADDRESS = N'' diff --git a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Anonymous Remote Service Binding.sql b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Anonymous Remote Service Binding.sql index 70fd6147..72fd7759 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Anonymous Remote Service Binding.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Anonymous Remote Service Binding.sql @@ -3,7 +3,7 @@ -- Create Anonymous Remote Service Binding Template -- ============================================= -CREATE REMOTE SERVICE BINDING [] +CREATE REMOTE SERVICE BINDING [] TO SERVICE N'' WITH USER = [], ANONYMOUS = ON - + diff --git a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Private Key Certificate.sql b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Private Key Certificate.sql index c0e0df7c..049a0f05 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Private Key Certificate.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Private Key Certificate.sql @@ -3,6 +3,6 @@ -- ============================================= CREATE CERTIFICATE - AUTHORIZATION + AUTHORIZATION FROM FILE = '' WITH PRIVATE_KEY (FILE = '', DECRYPTION_PASSWORD = '') diff --git a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Public Key Certificate.sql b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Public Key Certificate.sql index 6fac083b..ef43dde5 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Public Key Certificate.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Public Key Certificate.sql @@ -3,6 +3,6 @@ -- ============================================= CREATE CERTIFICATE - AUTHORIZATION + AUTHORIZATION FROM FILE = '' diff --git a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Remote Service Binding.sql b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Remote Service Binding.sql index c662a703..8246f2dd 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Security/Create Remote Service Binding.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Security/Create Remote Service Binding.sql @@ -8,8 +8,8 @@ -- Description: -- ============================================= -CREATE REMOTE SERVICE BINDING [] - AUTHORIZATION +CREATE REMOTE SERVICE BINDING [] + AUTHORIZATION TO SERVICE N'' WITH USER = [] diff --git a/samples/features/ssms-templates/Sql/Service Broker/Security/Drop Remote Service Binding.sql b/samples/features/ssms-templates/Sql/Service Broker/Security/Drop Remote Service Binding.sql index af069c62..9e1ec68a 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Security/Drop Remote Service Binding.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Security/Drop Remote Service Binding.sql @@ -3,4 +3,4 @@ -- Basic Drop Remote Service Binding Template -- ============================================= -DROP REMOTE SERVICE BINDING [] +DROP REMOTE SERVICE BINDING [] diff --git a/samples/features/ssms-templates/Sql/Service Broker/Security/Grant Receive.sql b/samples/features/ssms-templates/Sql/Service Broker/Security/Grant Receive.sql index ea091a3c..efb7de6d 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Security/Grant Receive.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Security/Grant Receive.sql @@ -2,5 +2,5 @@ -- Grant Receive on Queue Template -- ============================================= -GRANT RECEIVE ON [] +GRANT RECEIVE ON [] TO [] diff --git a/samples/features/ssms-templates/Sql/Service Broker/Service/Add Contract To Service.sql b/samples/features/ssms-templates/Sql/Service Broker/Service/Add Contract To Service.sql index 2715ae8c..6b3a4e88 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Service/Add Contract To Service.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Service/Add Contract To Service.sql @@ -3,7 +3,7 @@ -- Add contract to service Template -- ============================================= -ALTER SERVICE [] +ALTER SERVICE [] ( ADD CONTRACT ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/Service/Create Initiator Service.sql b/samples/features/ssms-templates/Sql/Service Broker/Service/Create Initiator Service.sql index 1cbf4352..445a8d35 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Service/Create Initiator Service.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Service/Create Initiator Service.sql @@ -9,7 +9,7 @@ -- Description: -- ============================================= -CREATE SERVICE [] -AUTHORIZATION +CREATE SERVICE [] +AUTHORIZATION ON QUEUE ([DEFAULT]) diff --git a/samples/features/ssms-templates/Sql/Service Broker/Service/Create Target Service.sql b/samples/features/ssms-templates/Sql/Service Broker/Service/Create Target Service.sql index 6b20d920..9a8860af 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Service/Create Target Service.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Service/Create Target Service.sql @@ -2,7 +2,7 @@ -- Basic Create Target Service Template -- ============================================= -CREATE SERVICE [] +CREATE SERVICE [] ON QUEUE ( ) diff --git a/samples/features/ssms-templates/Sql/Service Broker/Service/Drop Service.sql b/samples/features/ssms-templates/Sql/Service Broker/Service/Drop Service.sql index 2bf31253..cd3ea687 100644 --- a/samples/features/ssms-templates/Sql/Service Broker/Service/Drop Service.sql +++ b/samples/features/ssms-templates/Sql/Service Broker/Service/Drop Service.sql @@ -2,4 +2,4 @@ -- Basic Drop Service Template -- ============================================= -DROP SERVICE [] +DROP SERVICE [] diff --git a/samples/features/ssms-templates/Sql/Statistics/Create Filtered Statistics.sql b/samples/features/ssms-templates/Sql/Statistics/Create Filtered Statistics.sql index 31ce12d4..6667ff5b 100644 --- a/samples/features/ssms-templates/Sql/Statistics/Create Filtered Statistics.sql +++ b/samples/features/ssms-templates/Sql/Statistics/Create Filtered Statistics.sql @@ -2,12 +2,12 @@ -- Create Filtered Statistics Template -- ================================================== -CREATE STATISTICS +CREATE STATISTICS ON . -( +( , -) +) WHERE <@comparison_operator,,@operator> <@value,sysname,@val> GO diff --git a/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Norecompute Statistics.sql b/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Norecompute Statistics.sql index fa7e18e1..c4ad59b9 100644 --- a/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Norecompute Statistics.sql +++ b/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Norecompute Statistics.sql @@ -4,12 +4,12 @@ -- Note: Statistics created with NORECOMPUTE are not updated by SQL Server's -- automatic statistics update feature (auto-stats). Therefore, they many cause -- suboptimal plans. -CREATE STATISTICS +CREATE STATISTICS ON . -( +( , -) +) WITH FULLSCAN, NORECOMPUTE; GO diff --git a/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Statistics.sql b/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Statistics.sql index 3a040a01..31ce1dc9 100644 --- a/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Statistics.sql +++ b/samples/features/ssms-templates/Sql/Statistics/Create Fullscan Statistics.sql @@ -1,11 +1,11 @@ -- ====================================== -- Create Fullscan Statistics Template -- ====================================== -CREATE STATISTICS +CREATE STATISTICS ON . -( +( , -) +) WITH FULLSCAN; GO diff --git a/samples/features/ssms-templates/Sql/Statistics/Create Sampled Statistics.sql b/samples/features/ssms-templates/Sql/Statistics/Create Sampled Statistics.sql index f9cc36a7..043e5871 100644 --- a/samples/features/ssms-templates/Sql/Statistics/Create Sampled Statistics.sql +++ b/samples/features/ssms-templates/Sql/Statistics/Create Sampled Statistics.sql @@ -1,12 +1,12 @@ -- ====================================== -- Create Sampled Statistics Template -- ====================================== -CREATE STATISTICS +CREATE STATISTICS ON . -( +( , -) +) WITH SAMPLE PERCENT; GO -- Instead of PERCENT, you can say ROWS to specify the number of rows to sample. diff --git a/samples/features/ssms-templates/Sql/Statistics/Update All Statistics For Table.sql b/samples/features/ssms-templates/Sql/Statistics/Update All Statistics For Table.sql index 91de0a10..76362206 100644 --- a/samples/features/ssms-templates/Sql/Statistics/Update All Statistics For Table.sql +++ b/samples/features/ssms-templates/Sql/Statistics/Update All Statistics For Table.sql @@ -4,5 +4,5 @@ -- All statistics on the table . -- will be updated. -UPDATE STATISTICS .; +UPDATE STATISTICS .; GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Statistics/Update Statistics One Index.sql b/samples/features/ssms-templates/Sql/Statistics/Update Statistics One Index.sql index cb0128ed..7342d225 100644 --- a/samples/features/ssms-templates/Sql/Statistics/Update Statistics One Index.sql +++ b/samples/features/ssms-templates/Sql/Statistics/Update Statistics One Index.sql @@ -1,5 +1,5 @@ -- ======================================= -- Update Statistics One Index Template -- ======================================= -UPDATE STATISTICS .(); +UPDATE STATISTICS .(); GO diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/Alter Natively Compiled Stored Procedure.sql b/samples/features/ssms-templates/Sql/Stored Procedure/Alter Natively Compiled Stored Procedure.sql index 1187f250..439fade4 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/Alter Natively Compiled Stored Procedure.sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/Alter Natively Compiled Stored Procedure.sql @@ -4,7 +4,7 @@ ALTER PROCEDURE . -- Add the parameters for the stored procedure here - <@param1, sysname, @p1> = , + <@param1, sysname, @p1> = , <@param2, sysname, @p2> = WITH NATIVE_COMPILATION, SCHEMABINDING AS BEGIN ATOMIC WITH diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/Create Natively Compiled Stored Procedure.sql b/samples/features/ssms-templates/Sql/Stored Procedure/Create Natively Compiled Stored Procedure.sql index 2b2654b1..13e866d7 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/Create Natively Compiled Stored Procedure.sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/Create Natively Compiled Stored Procedure.sql @@ -12,7 +12,7 @@ GO CREATE PROCEDURE . -- Add the parameters for the stored procedure here - <@param1, sysname, @p1> = , + <@param1, sysname, @p1> = , <@param2, sysname, @p2> = WITH NATIVE_COMPILATION, SCHEMABINDING AS BEGIN ATOMIC WITH diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure Basic Template.sql b/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure Basic Template.sql index 503a0cf6..ad2d0d46 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure Basic Template.sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure Basic Template.sql @@ -4,16 +4,16 @@ -- Drop stored procedure if it already exists IF EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.ROUTINES + SELECT * + FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_SCHEMA = N'' - AND SPECIFIC_NAME = N'' + AND SPECIFIC_NAME = N'' ) DROP PROCEDURE . GO CREATE PROCEDURE . - <@param1, sysname, @p1> = , + <@param1, sysname, @p1> = , <@param2, sysname, @p2> = AS SELECT @p1, @p2 diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql b/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql index 39d5a241..6461f02d 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with CURSOR OUTPUT Parameter.sql @@ -1,13 +1,13 @@ -- ======================================================= --- Create stored procedure with CURSOR OUTPUT parameters +-- Create stored procedure with CURSOR OUTPUT parameters -- ======================================================= -- Drop stored procedure if it already exists IF EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.ROUTINES + SELECT * + FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_SCHEMA = N'' - AND SPECIFIC_NAME = N'' + AND SPECIFIC_NAME = N'' ) DROP PROCEDURE . GO diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with OUTPUT Parameter.sql b/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with OUTPUT Parameter.sql index da777c61..0f8f66a8 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with OUTPUT Parameter.sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/Create Procedure with OUTPUT Parameter.sql @@ -3,16 +3,16 @@ -- =============================================== -- Drop stored procedure if it already exists IF EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.ROUTINES + SELECT * + FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_SCHEMA = N'' - AND SPECIFIC_NAME = N'' + AND SPECIFIC_NAME = N'' ) DROP PROCEDURE . GO CREATE PROCEDURE . - <@param1, sysname, @p1> = , + <@param1, sysname, @p1> = , <@param2, sysname, @p2> OUTPUT AS SELECT @p2 = @p2 + @p1 diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/Create Stored Procedure (New Menu).sql b/samples/features/ssms-templates/Sql/Stored Procedure/Create Stored Procedure (New Menu).sql index af6446ac..40c259e0 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/Create Stored Procedure (New Menu).sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/Create Stored Procedure (New Menu).sql @@ -2,8 +2,8 @@ -- Template generated from Template Explorer using: -- Create Procedure (New Menu).SQL -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- This block of comments will not be included in @@ -18,9 +18,9 @@ GO -- Create date: -- Description: -- ============================================= -CREATE PROCEDURE +CREATE PROCEDURE -- Add the parameters for the stored procedure here - <@Param1, sysname, @p1> = , + <@Param1, sysname, @p1> = , <@Param2, sysname, @p2> = AS BEGIN diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/alter stored procedure.sql b/samples/features/ssms-templates/Sql/Stored Procedure/alter stored procedure.sql index 4c1fe6f5..c37ef8e7 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/alter stored procedure.sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/alter stored procedure.sql @@ -3,7 +3,7 @@ -- ================================== ALTER PROCEDURE . - <@param1, sysname, @p1> = , + <@param1, sysname, @p1> = , <@param2, sysname, @p2> = AS SELECT @p1, @p2 diff --git a/samples/features/ssms-templates/Sql/Stored Procedure/drop stored procedure.sql b/samples/features/ssms-templates/Sql/Stored Procedure/drop stored procedure.sql index 3fac4892..40a471d2 100644 --- a/samples/features/ssms-templates/Sql/Stored Procedure/drop stored procedure.sql +++ b/samples/features/ssms-templates/Sql/Stored Procedure/drop stored procedure.sql @@ -1,13 +1,13 @@ -- ======================================================= --- Drop Stored Procedure +-- Drop Stored Procedure -- ======================================================= -- Drop stored procedure if it already exists IF EXISTS ( - SELECT * - FROM INFORMATION_SCHEMA.ROUTINES + SELECT * + FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_SCHEMA = N'' - AND SPECIFIC_NAME = N'' + AND SPECIFIC_NAME = N'' ) DROP PROCEDURE . GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table Linux.sql b/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table Linux.sql index 6f3119c9..d48cce3b 100644 --- a/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table Linux.sql +++ b/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table Linux.sql @@ -27,9 +27,9 @@ GO --Create memory optimized table and indexes on the memory optimized table. CREATE TABLE . ( - , + , , - INDEX NONCLUSTERED (), + INDEX NONCLUSTERED (), CONSTRAINT PRIMARY KEY NONCLUSTERED (), -- See SQL Server Books Online for guidelines on determining appropriate bucket count for the index diff --git a/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table.sql b/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table.sql index c8853425..9127c98f 100644 --- a/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Add MEMORY_OPTIMIZED_DATA Filegroup and Create Memory Optimized Table.sql @@ -27,9 +27,9 @@ GO --Create memory optimized table and indexes on the memory optimized table. CREATE TABLE . ( - , + , , - INDEX NONCLUSTERED (), + INDEX NONCLUSTERED (), CONSTRAINT PRIMARY KEY NONCLUSTERED (), -- See SQL Server Books Online for guidelines on determining appropriate bucket count for the index diff --git a/samples/features/ssms-templates/Sql/Table/Add Unique Constraint.sql b/samples/features/ssms-templates/Sql/Table/Add Unique Constraint.sql index bae5187c..1af02450 100644 --- a/samples/features/ssms-templates/Sql/Table/Add Unique Constraint.sql +++ b/samples/features/ssms-templates/Sql/Table/Add Unique Constraint.sql @@ -1,6 +1,6 @@ --====================== -- Add Unique Constraint template --====================== -ALTER TABLE . -ADD CONSTRAINT UNIQUE () -GO +ALTER TABLE . +ADD CONSTRAINT UNIQUE () +GO diff --git a/samples/features/ssms-templates/Sql/Table/Create Append-Only Ledger Table.sql b/samples/features/ssms-templates/Sql/Table/Create Append-Only Ledger Table.sql index 3979b938..7c5aa002 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Append-Only Ledger Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Append-Only Ledger Table.sql @@ -1,10 +1,10 @@ -- ============================== -- Create Append-Only Ledger Table Template -- Use the Specify Values for Template Parameters command (Ctrl-Shift-M) to fill in the parameter values below. --- +-- -- For more details on ledger tables please refer to MSDN documentation: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-overview --- +-- -- To learn more how to use append-only ledger tables in your applications: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-append-only-ledger-tables -- ============================== 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 371dfa33..6bbb769b 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 @@ -1,16 +1,16 @@ -- ====================================================== -- Create Memory Optimized System-Versioned Temporal Table Template -- Use the Specify Values for Template Parameters command (Ctrl-Shift-M) to fill in the parameter values below. --- +-- -- This template creates a memory optimized system-versioned temporal table and indexes on the memory optimized table. --- +-- -- The database must have a MEMORY_OPTIMIZED_DATA filegroup before the memory optimized table can be created. -- To learn about prerequistes for creating memory-optimized tables, take a look at "Creating a Memory-Optimized Table and a Natively Compiled Stored Procedure": -- https://msdn.microsoft.com/en-us/library/dn133079.aspx --- +-- -- For more details on system-versioned temporal tables please refer to MSDN documentation: -- https://msdn.microsoft.com/en-IN/library/dn935015.aspx#Anchor_0 --- +-- -- To learn more how to use system-versioned tables in your applications, take a look at "Getting Started with System-Versioned Temporal Tables": -- https://msdn.microsoft.com/en-US/library/mt604462.aspx -- ========================================= @@ -44,11 +44,11 @@ CREATE TABLE . HASH () WITH (BUCKET_COUNT = ) ) -WITH +WITH ( MEMORY_OPTIMIZED = ON, DURABILITY = , - --Set SYSTEM_VERSIONING to ON and provide reference to HISTORY_TABLE. + --Set SYSTEM_VERSIONING to ON and provide reference to HISTORY_TABLE. SYSTEM_VERSIONING = ON ( --If HISTORY_TABLE does not exists, default table will be created. diff --git a/samples/features/ssms-templates/Sql/Table/Create Memory Optimized Table.sql b/samples/features/ssms-templates/Sql/Table/Create Memory Optimized Table.sql index acb86816..016b3a30 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Memory Optimized Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Memory Optimized Table.sql @@ -15,9 +15,9 @@ GO CREATE TABLE . ( - , + , , - INDEX NONCLUSTERED (), + INDEX NONCLUSTERED (), CONSTRAINT PRIMARY KEY NONCLUSTERED (), -- See SQL Server Books Online for guidelines on determining appropriate bucket count for the index 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 58231ac6..691ff424 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 @@ -1,12 +1,12 @@ -- ========================================= -- Create system-versioned temporal table template -- Use the Specify Values for Template Parameters command (Ctrl-Shift-M) to fill in the parameter values below. --- +-- -- This template creates a system-versioned temporal table. --- +-- -- For more details on system-versioned temporal tables please refer to MSDN documentation: -- https://msdn.microsoft.com/en-IN/library/dn935015.aspx#Anchor_0 --- +-- -- To learn more how to use system-versioned tables in your applications, take a look at "Getting Started with System-Versioned Temporal Tables": -- https://msdn.microsoft.com/en-US/library/mt604462.aspx -- ========================================= @@ -15,7 +15,7 @@ USE GO BEGIN - --If table is system-versioned, SYSTEM_VERSIONING must be set to OFF first + --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) BEGIN ALTER TABLE [].[] SET (SYSTEM_VERSIONING = OFF) @@ -41,8 +41,8 @@ CREATE TABLE [].[].[], diff --git a/samples/features/ssms-templates/Sql/Table/Create Table with filestream column.sql b/samples/features/ssms-templates/Sql/Table/Create Table with filestream column.sql index 19267624..127a7c4c 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Table with filestream column.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Table with filestream column.sql @@ -10,11 +10,11 @@ GO CREATE TABLE . ( - , - , - , - varbinary(max) filestream , - uniqueidentifier NOT NULL rowguidcol unique, + , + , + , + varbinary(max) filestream , + uniqueidentifier NOT NULL rowguidcol unique, CONSTRAINT PRIMARY KEY () ) GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/Table/Create Table.sql b/samples/features/ssms-templates/Sql/Table/Create Table.sql index 23957ad3..535906ab 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Table.sql @@ -10,9 +10,9 @@ GO CREATE TABLE . ( - , - , - , + , + , + , CONSTRAINT PRIMARY KEY () ) GO diff --git a/samples/features/ssms-templates/Sql/Table/Create Updatable Ledger Table.sql b/samples/features/ssms-templates/Sql/Table/Create Updatable Ledger Table.sql index 6410e9b9..a07f2a0f 100644 --- a/samples/features/ssms-templates/Sql/Table/Create Updatable Ledger Table.sql +++ b/samples/features/ssms-templates/Sql/Table/Create Updatable Ledger Table.sql @@ -1,10 +1,10 @@ -- ============================== -- Create Updatable Ledger Table Template -- Use the Specify Values for Template Parameters command (Ctrl-Shift-M) to fill in the parameter values below. --- +-- -- For more details on ledger tables please refer to MSDN documentation: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-overview --- +-- -- To learn more how to use updatable ledger tables in your applications: -- https://docs.microsoft.com/azure/azure-sql/database/ledger-updatable-ledger-tables -- ============================== @@ -32,7 +32,7 @@ WITH --Set SYSTEM_VERSIONING to ON SYSTEM_VERSIONING = ON ( - --Option to specify the name of the ledger history table. If not supplied, the history table will be created with the + --Option to specify the name of the ledger history table. If not supplied, the history table will be created with the --default name format: [].[MSSQL_LedgerHistoryFor_] HISTORY_TABLE = [].[] ), diff --git a/samples/features/ssms-templates/Sql/Table/add column.sql b/samples/features/ssms-templates/Sql/Table/add column.sql index b17ba6f0..e80fe4bc 100644 --- a/samples/features/ssms-templates/Sql/Table/add column.sql +++ b/samples/features/ssms-templates/Sql/Table/add column.sql @@ -12,7 +12,7 @@ GO CREATE TABLE . ( - column1 int NOT NULL, + column1 int NOT NULL, column2 char(10) NULL ) GO diff --git a/samples/features/ssms-templates/Sql/Table/add constraint.sql b/samples/features/ssms-templates/Sql/Table/add constraint.sql index bb5b0931..0b4e3457 100644 --- a/samples/features/ssms-templates/Sql/Table/add constraint.sql +++ b/samples/features/ssms-templates/Sql/Table/add constraint.sql @@ -1,7 +1,7 @@ -- =========================================== -- Add constraint template -- --- This template creates a table, then it +-- This template creates a table, then it -- adds a CHECK CONSTRAINT to the table -- =========================================== USE @@ -13,7 +13,7 @@ GO CREATE TABLE . ( - column1 int NOT NULL, + column1 int NOT NULL, char(8) NOT NULL ) GO diff --git a/samples/features/ssms-templates/Sql/Table/add filestream column.sql b/samples/features/ssms-templates/Sql/Table/add filestream column.sql index 5cc1102b..07a362fd 100644 --- a/samples/features/ssms-templates/Sql/Table/add filestream column.sql +++ b/samples/features/ssms-templates/Sql/Table/add filestream column.sql @@ -12,7 +12,7 @@ GO CREATE TABLE . ( - column1 int NOT NULL, + column1 int NOT NULL, column2 uniqueidentifier NOT NULL rowguidcol unique ) GO diff --git a/samples/features/ssms-templates/Sql/Table/add key.sql b/samples/features/ssms-templates/Sql/Table/add key.sql index 09593c99..475d6c19 100644 --- a/samples/features/ssms-templates/Sql/Table/add key.sql +++ b/samples/features/ssms-templates/Sql/Table/add key.sql @@ -1,7 +1,7 @@ -- ============================================= -- Add Key template -- --- This template creates a table, then it +-- This template creates a table, then it -- adds a PRIMARY KEY constraint to the table -- ============================================= USE @@ -13,7 +13,7 @@ GO CREATE TABLE . ( - int NOT NULL, + int NOT NULL, column2 char(8) NOT NULL ) GO diff --git a/samples/features/ssms-templates/Sql/Table/drop column.sql b/samples/features/ssms-templates/Sql/Table/drop column.sql index 8b55b05d..4ec0cb1c 100644 --- a/samples/features/ssms-templates/Sql/Table/drop column.sql +++ b/samples/features/ssms-templates/Sql/Table/drop column.sql @@ -1,7 +1,7 @@ --============================================ -- Drop column template -- --- This template creates a table, then it +-- This template creates a table, then it -- drops one of the columns of the table. --============================================ USE @@ -13,7 +13,7 @@ GO CREATE TABLE . ( - column1 int NOT NULL, + column1 int NOT NULL, column2 char(10) NULL, datetime NULL ) @@ -21,5 +21,5 @@ GO -- Drop a column from the table ALTER TABLE . - DROP COLUMN + DROP COLUMN GO diff --git a/samples/features/ssms-templates/Sql/Table/drop constraint.sql b/samples/features/ssms-templates/Sql/Table/drop constraint.sql index 15c30a7b..a8037592 100644 --- a/samples/features/ssms-templates/Sql/Table/drop constraint.sql +++ b/samples/features/ssms-templates/Sql/Table/drop constraint.sql @@ -1,7 +1,7 @@ -- ======================================================== -- Drop constraint template -- --- This template creates a table with a CHECK CONSTRAINT, +-- 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 @@ -18,7 +18,7 @@ GO CREATE TABLE . ( - column1 int NOT NULL, + column1 int NOT NULL, salary money NOT NULL CONSTRAINT CHECK (salary < 500000) ) GO diff --git a/samples/features/ssms-templates/Sql/Table/drop key.sql b/samples/features/ssms-templates/Sql/Table/drop key.sql index 76b4e7a5..4575cfc7 100644 --- a/samples/features/ssms-templates/Sql/Table/drop key.sql +++ b/samples/features/ssms-templates/Sql/Table/drop key.sql @@ -1,7 +1,7 @@ -- =================================================== -- Drop Key template -- --- This template creates a table with a primary key, +-- This template creates a table with a primary key, -- then it drops the primary key of the table. -- =================================================== USE @@ -13,9 +13,9 @@ GO CREATE TABLE . ( - c1 int NOT NULL, - c2 char(10) NULL, - c3 datetime NULL, + c1 int NOT NULL, + c2 char(10) NULL, + c3 datetime NULL, CONSTRAINT PRIMARY KEY(c1) ) GO diff --git a/samples/features/ssms-templates/Sql/Trigger/Alter T-SQL Trigger.sql b/samples/features/ssms-templates/Sql/Trigger/Alter T-SQL Trigger.sql index 1c53e9d4..d4ab2ea6 100644 --- a/samples/features/ssms-templates/Sql/Trigger/Alter T-SQL Trigger.sql +++ b/samples/features/ssms-templates/Sql/Trigger/Alter T-SQL Trigger.sql @@ -4,8 +4,8 @@ USE GO -ALTER TRIGGER . -ON . +ALTER TRIGGER . +ON . AFTER AS GO diff --git a/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger (New Menu).sql b/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger (New Menu).sql index a0864e4f..880e47df 100644 --- a/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger (New Menu).sql +++ b/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger (New Menu).sql @@ -2,8 +2,8 @@ -- Template generated from Template Explorer using: -- Create Trigger (New Menu).SQL -- --- Use the Specify Values for Template Parameters --- command (Ctrl-Shift-M) to fill in the parameter +-- Use the Specify Values for Template Parameters +-- command (Ctrl-Shift-M) to fill in the parameter -- values below. -- -- See additional Create Trigger templates for more @@ -21,10 +21,10 @@ GO -- Create date: -- Description: -- ============================================= -CREATE TRIGGER . - ON . +CREATE TRIGGER . + ON . AFTER -AS +AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. diff --git a/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger.sql b/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger.sql index 8e68d961..85ae427a 100644 --- a/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger.sql +++ b/samples/features/ssms-templates/Sql/Trigger/Create T-SQL Trigger.sql @@ -5,11 +5,11 @@ USE GO IF OBJECT_ID ('.','TR') IS NOT NULL - DROP TRIGGER . + DROP TRIGGER . GO -CREATE TRIGGER . - ON . +CREATE TRIGGER . + ON . AFTER AS GO diff --git a/samples/features/ssms-templates/Sql/Trigger/Drop Trigger.sql b/samples/features/ssms-templates/Sql/Trigger/Drop Trigger.sql index cbfc0913..7bdb35d6 100644 --- a/samples/features/ssms-templates/Sql/Trigger/Drop Trigger.sql +++ b/samples/features/ssms-templates/Sql/Trigger/Drop Trigger.sql @@ -5,5 +5,5 @@ USE GO IF OBJECT_ID ('.','TR') IS NOT NULL - DROP TRIGGER . + DROP TRIGGER . GO diff --git a/samples/features/ssms-templates/Sql/User-defined Data Type/Create User-defined Data Type.sql b/samples/features/ssms-templates/Sql/User-defined Data Type/Create User-defined Data Type.sql index 9b8e9ed4..5f83310c 100644 --- a/samples/features/ssms-templates/Sql/User-defined Data Type/Create User-defined Data Type.sql +++ b/samples/features/ssms-templates/Sql/User-defined Data Type/Create User-defined Data Type.sql @@ -5,7 +5,7 @@ USE GO -- Create the data type -CREATE TYPE . +CREATE TYPE . FROM () -- Create table using the data type diff --git a/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql b/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql index 001c43c5..3f42a6aa 100644 --- a/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql +++ b/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Memory Optimized Table Type.sql @@ -15,9 +15,9 @@ GO CREATE TYPE . AS TABLE ( - , + , , - INDEX NONCLUSTERED (), + INDEX NONCLUSTERED (), PRIMARY KEY NONCLUSTERED (), -- See SQL Server Books Online for guidelines on determining appropriate bucket count for the index diff --git a/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Table Type.sql b/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Table Type.sql index c6e24be1..8985ed2b 100644 --- a/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Table Type.sql +++ b/samples/features/ssms-templates/Sql/User-defined Table Type/Create User-defined Table Type.sql @@ -5,11 +5,11 @@ USE GO -- Create the data type -CREATE TYPE . AS TABLE +CREATE TYPE . AS TABLE ( - , - , - , + , + , + , PRIMARY KEY () ) GO diff --git a/samples/features/ssms-templates/Sql/User-defined Type/Create Type.sql b/samples/features/ssms-templates/Sql/User-defined Type/Create Type.sql index 375a88ee..1534b9d1 100644 --- a/samples/features/ssms-templates/Sql/User-defined Type/Create Type.sql +++ b/samples/features/ssms-templates/Sql/User-defined Type/Create Type.sql @@ -14,11 +14,11 @@ GO CREATE TYPE EXTERNAL NAME .; GO - + -- Create a table that uses the data type CREATE TABLE . ( - , + , ) GO diff --git a/samples/features/ssms-templates/Sql/User/Create Schema User.sql b/samples/features/ssms-templates/Sql/User/Create Schema User.sql index be7df1d8..4e572cc3 100644 --- a/samples/features/ssms-templates/Sql/User/Create Schema User.sql +++ b/samples/features/ssms-templates/Sql/User/Create Schema User.sql @@ -14,12 +14,12 @@ CREATE USER [\] GO -- Grant specific access rights to use based on Schema -GRANT - DELETE, - EXECUTE, - INSERT, - SELECT, - UPDATE, - VIEW DEFINITION -ON SCHEMA::[] +GRANT + DELETE, + EXECUTE, + INSERT, + SELECT, + UPDATE, + VIEW DEFINITION +ON SCHEMA::[] TO [\]; diff --git a/samples/features/ssms-templates/Sql/User/Create User as DBO.sql b/samples/features/ssms-templates/Sql/User/Create User as DBO.sql index 567200d6..f928cf70 100644 --- a/samples/features/ssms-templates/Sql/User/Create User as DBO.sql +++ b/samples/features/ssms-templates/Sql/User/Create User as DBO.sql @@ -12,6 +12,6 @@ CREATE USER [] GO -- Add user to the database owner role -ALTER ROLE [db_owner] +ALTER ROLE [db_owner] ADD MEMBER [] GO diff --git a/samples/features/ssms-templates/Sql/View/Create Indexed View.sql b/samples/features/ssms-templates/Sql/View/Create Indexed View.sql index 6fc294bb..67f47b8e 100644 --- a/samples/features/ssms-templates/Sql/View/Create Indexed View.sql +++ b/samples/features/ssms-templates/Sql/View/Create Indexed View.sql @@ -10,7 +10,7 @@ IF object_id(N'.. GO -CREATE VIEW . +CREATE VIEW . WITH SCHEMABINDING AS diff --git a/samples/features/ssms-templates/Sql/XML Collection/Alter XML Schema Collection.sql b/samples/features/ssms-templates/Sql/XML Collection/Alter XML Schema Collection.sql index 7bf7497f..5f21ceb3 100644 --- a/samples/features/ssms-templates/Sql/XML Collection/Alter XML Schema Collection.sql +++ b/samples/features/ssms-templates/Sql/XML Collection/Alter XML Schema Collection.sql @@ -1,8 +1,8 @@ -- ============================================= -- Alter XML Schema Collection Template -- ============================================= -IF EXISTS (SELECT * - FROM sys.xml_schema_collections +IF EXISTS (SELECT * + FROM sys.xml_schema_collections WHERE name = N'') ALTER XML SCHEMA COLLECTION ADD '' diff --git a/samples/features/ssms-templates/Sql/XML Collection/Create XML Schema Collection.sql b/samples/features/ssms-templates/Sql/XML Collection/Create XML Schema Collection.sql index eab689d1..8f1ce143 100644 --- a/samples/features/ssms-templates/Sql/XML Collection/Create XML Schema Collection.sql +++ b/samples/features/ssms-templates/Sql/XML Collection/Create XML Schema Collection.sql @@ -1,13 +1,13 @@ -- ============================================= -- Create XML Schema Collection Template -- ============================================= -IF EXISTS (SELECT * - FROM sys.xml_schema_collections +IF EXISTS (SELECT * + FROM sys.xml_schema_collections WHERE name = N'') DROP XML SCHEMA COLLECTION GO CREATE XML SCHEMA COLLECTION -AS +AS '' GO \ No newline at end of file diff --git a/samples/features/ssms-templates/Sql/XML Collection/Drop XML Schema Collection.sql b/samples/features/ssms-templates/Sql/XML Collection/Drop XML Schema Collection.sql index 9b92d478..5e19c0cc 100644 --- a/samples/features/ssms-templates/Sql/XML Collection/Drop XML Schema Collection.sql +++ b/samples/features/ssms-templates/Sql/XML Collection/Drop XML Schema Collection.sql @@ -1,8 +1,8 @@ -- ============================================= -- Drop XML Schema Collection Template -- ============================================= -IF EXISTS (SELECT * - FROM sys.xml_schema_collections +IF EXISTS (SELECT * + FROM sys.xml_schema_collections WHERE name = N'') DROP XML SCHEMA COLLECTION GO \ No newline at end of file diff --git a/samples/features/t-sql-snapshot-backup/README.md b/samples/features/t-sql-snapshot-backup/README.md index 71566442..be3e6848 100644 --- a/samples/features/t-sql-snapshot-backup/README.md +++ b/samples/features/t-sql-snapshot-backup/README.md @@ -13,7 +13,7 @@ This code sample demonstrates an end-to-end solution of backing up and restoring 1. **Applies to:** - SQL Server 2022 (or higher) Evaluation / Developer / Enterprise editions. 2. **Key feature:** - - Create a T-SQL snapshot backup + - Create a T-SQL snapshot backup - Restore Databse from the snapshot backup 3. **Programming Language:** PowerShell. T-SQL 5. **Authors:** Perry Skountrianos [perryskou-msft] diff --git a/samples/features/t-sql-snapshot-backup/snapshot-backup-restore-azurevm-single-db.ps1 b/samples/features/t-sql-snapshot-backup/snapshot-backup-restore-azurevm-single-db.ps1 index f206485c..d1f33e03 100644 --- a/samples/features/t-sql-snapshot-backup/snapshot-backup-restore-azurevm-single-db.ps1 +++ b/samples/features/t-sql-snapshot-backup/snapshot-backup-restore-azurevm-single-db.ps1 @@ -1,9 +1,9 @@ $subscriptionId ='########-####-####-####-############' $subscriptionName = 'YOUR-AZURE-SUBSCRIPTION-NAME' -$resourceGroupName = 'YOUR-AZURE-RESOURCE-GROUP-NAME' -$location = 'YOUR-AZURE-RESOURCE-GROUP-LOCATION' +$resourceGroupName = 'YOUR-AZURE-RESOURCE-GROUP-NAME' +$location = 'YOUR-AZURE-RESOURCE-GROUP-LOCATION' $vmName = 'YOUR-VIRTUAL-MACHINE-NAME' -$snapshotName = 'SNAPSHOT-NAME' +$snapshotName = 'SNAPSHOT-NAME' $diskName = "YOUR-SNAPSHOT-BACKUP-NAME" $storageType = '' # E.g., 'Premium_LRS' $bkmFile = "FILEPATH-FOR-THE-.BKM-FILE" # E.g., "C:\BKP\db.bkm" @@ -38,7 +38,7 @@ Install-Module -Name Az # Create a sample database ########################################### $sqlConn = New-Object System.Data.SQLClient.SQLConnection -# Open SQL Server connection to master +# Open SQL Server connection to master $sqlConn.ConnectionString = "server='" + $SQLServer +"';database='master';Integrated Security=True;" $sqlConn.Open() @@ -64,7 +64,7 @@ $sqlConn.Open() $Command.Connection = $sqlConn # Suspend Database - $Command.CommandText = $suspendDb + $Command.CommandText = $suspendDb $Result = $Command.ExecuteNonQuery(); # Take a disk snapshot @@ -76,16 +76,16 @@ $sqlConn.Open() catch { # Unsuspend Database - $Command.CommandText = $unsuspendDb + $Command.CommandText = $unsuspendDb $Result = $Command.ExecuteNonQuery(); } - + # Backup database metadata $Command.CommandText = $backupMetadata $Result = $Command.ExecuteNonQuery(); # Unsuspend Database - $Command.CommandText = $unsuspendDb + $Command.CommandText = $unsuspendDb $Result = $Command.ExecuteNonQuery(); # Close SQL Server connection @@ -115,7 +115,7 @@ Set-Disk -Number 2 -IsOffline $false # Drop database and restore from snapshot ########################################### -# Open SQL Server connection to master +# Open SQL Server connection to master $sqlConn.ConnectionString = "server='" + $SQLServer +"';database='master';Integrated Security=True;" $sqlConn.Open() @@ -127,7 +127,7 @@ $sqlConn.Open() $Result = $Command.ExecuteNonQuery(); # Restore Database - $Command.CommandText = $restoreDB + $Command.CommandText = $restoreDB $Result = $Command.ExecuteNonQuery(); # Close SQL Server connection @@ -137,7 +137,7 @@ $sqlConn.Close() # Clean up ########################################### -# Open SQL Server connection to master +# Open SQL Server connection to master $sqlConn.ConnectionString = "server='" + $SQLServer +"';database='master';Integrated Security=True;" $sqlConn.Open() @@ -161,7 +161,7 @@ if (Test-Path $bkmFile) { } # Remove disk from VM -$vm = Remove-AzVMDataDisk -VM $vm -Name $diskName +$vm = Remove-AzVMDataDisk -VM $vm -Name $diskName Update-AzVM -VM $vm -ResourceGroupName $resourceGroupName # Remove unmanaged disk diff --git a/samples/features/temporal/product-catalog/README.md b/samples/features/temporal/product-catalog/README.md index 0a2207c3..f5a52028 100644 --- a/samples/features/temporal/product-catalog/README.md +++ b/samples/features/temporal/product-catalog/README.md @@ -1,4 +1,4 @@ -# ASP.NET Core Product Catalog application that uses SQL/Temporal and JSON functionalities +# ASP.NET Core Product Catalog application that uses SQL/Temporal and JSON functionalities This project contains an example of a simple ASP.NET Core product catalog web application that enables you to browse the current list of products, and also to see the state of products in any point in time in the history. @@ -66,7 +66,7 @@ If database is hosted on Azure you can add something like: 5. Build solution using Ctrl+Shift+B, right-click on project + Build, Build/Build Solution from menu, or **dotnet build** command from the command line (from the root folder of application). -6. Run the sample app using F5 or Ctrl+F5 in Visual Studio 2015, or using **dotnet run** executed in the command prompt of the project root folder. +6. Run the sample app using F5 or Ctrl+F5 in Visual Studio 2015, or using **dotnet run** executed in the command prompt of the project root folder. 1. Open /index.html Url to get all products from database, 2. Use expand buttons to see history of products, 3. Restore some of the previous version using restore link, @@ -91,7 +91,7 @@ You can easily modify this code to fit the architecture of your application. ## Related Links -You can find more information about the components that are used in this sample on these locations: +You can find more information about the components that are used in this sample on these locations: [.Net Core download](https://www.microsoft.com/net/core#windows) [JQuery DataTables with row expansion](https://datatables.net/examples/api/row_details.html). [JQuery UI Slider](https://jqueryui.com/slider/) diff --git a/samples/features/temporal/product-catalog/sql-scripts/demo.sql b/samples/features/temporal/product-catalog/sql-scripts/demo.sql index 9540ba4d..c9f0573b 100644 --- a/samples/features/temporal/product-catalog/sql-scripts/demo.sql +++ b/samples/features/temporal/product-catalog/sql-scripts/demo.sql @@ -9,11 +9,11 @@ select min(ValidFrom) from History.Product; select ProductID, Name, Color, Size, Price, Quantity from Product; ---Go back in time and show the list of products. +--Go back in time and show the list of products. select ProductID, Name, Color, Size, Price, Quantity from Product FOR SYSTEM_TIME AS OF '2015-07-28 13:20:00'; ---Show the difference between current version of the product with ID 17 and version that existed in past. +--Show the difference between current version of the product with ID 17 and version that existed in past. select * from dbo.diff_Product(17, '2015-07-28 13:20:00'); @@ -42,7 +42,7 @@ order by ValidFrom desc; --Restore product. Overwrite the latest version with the verison that was valid last year. exec RestoreProduct 17, '2015-11-07 03:40:09'; ---Return history of the product with id 17 and verify that it current version and '2015-11-07 03:40:09' version are identical. +--Return history of the product with id 17 and verify that it current version and '2015-11-07 03:40:09' version are identical. select ProductID, Name, Color, Size, Price, Quantity, ValidFrom, ValidTo from Product FOR SYSTEM_TIME ALL where productid = 17 diff --git a/samples/features/temporal/product-catalog/sql-scripts/setup.sql b/samples/features/temporal/product-catalog/sql-scripts/setup.sql index b1016cc0..2449f703 100644 --- a/samples/features/temporal/product-catalog/sql-scripts/setup.sql +++ b/samples/features/temporal/product-catalog/sql-scripts/setup.sql @@ -95,7 +95,7 @@ return ( ) GO -create procedure dbo.GetProducts as +create procedure dbo.GetProducts as begin select * from Product @@ -108,7 +108,7 @@ begin end GO -create procedure dbo.GetProductsAsOf (@date datetime2) as +create procedure dbo.GetProductsAsOf (@date datetime2) as begin select * from Product FOR SYSTEM_TIME AS OF @date @@ -119,7 +119,7 @@ begin end GO -create procedure dbo.RestoreProduct (@productid int, @date datetime2) as +create procedure dbo.RestoreProduct (@productid int, @date datetime2) as begin with restored as ( diff --git a/samples/features/temporal/product-catalog/wwwroot/index.html b/samples/features/temporal/product-catalog/wwwroot/index.html index 323145fc..7e0b09da 100644 --- a/samples/features/temporal/product-catalog/wwwroot/index.html +++ b/samples/features/temporal/product-catalog/wwwroot/index.html @@ -6,7 +6,7 @@ Product Catalog - + diff --git a/samples/features/temporal/product-catalog/wwwroot/media/js/jquery.dataTables.js b/samples/features/temporal/product-catalog/wwwroot/media/js/jquery.dataTables.js index f0aece92..5fdeb255 100644 --- a/samples/features/temporal/product-catalog/wwwroot/media/js/jquery.dataTables.js +++ b/samples/features/temporal/product-catalog/wwwroot/media/js/jquery.dataTables.js @@ -907,7 +907,7 @@ var i, ien, j, jen, k, ken; var col, cell, detectedType, cache; - // For each column, spin over the + // For each column, spin over the for ( i=0, ien=columns.length ; i'+ - * ''+ - * ''+ - * ''+ - * ''+ - * ''+ - * ''+ - * ' records' - * } - * } ); - * } ); - */ - "sLengthMenu": "Show _MENU_ entries", - - - /** - * When using Ajax sourced data and during the first draw when DataTables is - * gathering the data, this message is shown in an empty row in the table to - * indicate to the end user the the data is being loaded. Note that this - * parameter is not used when loading data by server-side processing, just - * Ajax sourced data with client-side processing. - * @type string - * @default Loading... - * - * @dtopt Language - * @name DataTable.defaults.language.loadingRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "loadingRecords": "Please wait - loading..." - * } - * } ); - * } ); - */ - "sLoadingRecords": "Loading...", - - - /** - * Text which is displayed when the table is processing a user action - * (usually a sort command or similar). - * @type string - * @default Processing... - * - * @dtopt Language - * @name DataTable.defaults.language.processing - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "processing": "DataTables is currently busy" - * } - * } ); - * } ); - */ - "sProcessing": "Processing...", - - - /** - * Details the actions that will be taken when the user types into the - * filtering input text box. The variable "_INPUT_", if used in the string, - * is replaced with the HTML text box for the filtering input allowing - * control over where it appears in the string. If "_INPUT_" is not given - * then the input box is appended to the string automatically. - * @type string - * @default Search: - * - * @dtopt Language - * @name DataTable.defaults.language.search - * - * @example - * // Input text box will be appended at the end automatically - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Filter records:" - * } - * } ); - * } ); - * - * @example - * // Specify where the filter should appear - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "search": "Apply filter _INPUT_ to table" - * } - * } ); - * } ); - */ - "sSearch": "Search:", - - - /** - * Assign a `placeholder` attribute to the search `input` element - * @type string - * @default - * - * @dtopt Language - * @name DataTable.defaults.language.searchPlaceholder - */ - "sSearchPlaceholder": "", - - - /** - * All of the language information can be stored in a file on the - * server-side, which DataTables will look up if this parameter is passed. - * It must store the URL of the language file, which is in a JSON format, - * and the object has the same properties as the oLanguage object in the - * initialiser object (i.e. the above parameters). Please refer to one of - * the example language files to see how this works in action. - * @type string - * @default Empty string - i.e. disabled - * - * @dtopt Language - * @name DataTable.defaults.language.url - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt" - * } - * } ); - * } ); - */ - "sUrl": "", - - - /** - * Text shown inside the table records when the is no information to be - * displayed after filtering. `emptyTable` is shown when there is simply no - * information in the table at all (regardless of filtering). - * @type string - * @default No matching records found - * - * @dtopt Language - * @name DataTable.defaults.language.zeroRecords - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "language": { - * "zeroRecords": "No records to display" - * } - * } ); - * } ); - */ - "sZeroRecords": "No matching records found" - }, - - - /** - * This parameter allows you to have define the global filtering state at - * initialisation time. As an object the `search` parameter must be - * defined, but all other parameters are optional. When `regex` is true, - * the search string will be treated as a regular expression, when false - * (default) it will be treated as a straight string. When `smart` - * DataTables will use it's smart filtering methods (to word match at - * any point in the data), when false this will not be done. - * @namespace - * @extends DataTable.models.oSearch - * - * @dtopt Options - * @name DataTable.defaults.search - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "search": {"search": "Initial search"} - * } ); - * } ) - */ - "oSearch": $.extend( {}, DataTable.models.oSearch ), - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * By default DataTables will look for the property `data` (or `aaData` for - * compatibility with DataTables 1.9-) when obtaining data from an Ajax - * source or for server-side processing - this parameter allows that - * property to be changed. You can use Javascript dotted object notation to - * get a data source for multiple levels of nesting. - * @type string - * @default data - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxDataProp - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxDataProp": "data", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * You can instruct DataTables to load data from an external - * source using this parameter (use aData if you want to pass data in you - * already have). Simply provide a url a JSON object can be obtained from. - * @type string - * @default null - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.ajaxSource - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sAjaxSource": null, - - - /** - * This initialisation variable allows you to specify exactly where in the - * DOM you want DataTables to inject the various controls it adds to the page - * (for example you might want the pagination controls at the top of the - * table). DIV elements (with or without a custom class) can also be added to - * aid styling. The follow syntax is used: - *
      - *
    • The following options are allowed: - *
        - *
      • 'l' - Length changing
      • - *
      • 'f' - Filtering input
      • - *
      • 't' - The table!
      • - *
      • 'i' - Information
      • - *
      • 'p' - Pagination
      • - *
      • 'r' - pRocessing
      • - *
      - *
    • - *
    • The following constants are allowed: - *
        - *
      • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
      • - *
      • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
      • - *
      - *
    • - *
    • The following syntax is expected: - *
        - *
      • '<' and '>' - div elements
      • - *
      • '<"class" and '>' - div with a class
      • - *
      • '<"#id" and '>' - div with an ID
      • - *
      - *
    • - *
    • Examples: - *
        - *
      • '<"wrapper"flipt>'
      • - *
      • '<lf<t>ip>'
      • - *
      - *
    • - *
    - * @type string - * @default lfrtip (when `jQueryUI` is false) or - * <"H"lfr>t<"F"ip> (when `jQueryUI` is true) - * - * @dtopt Options - * @name DataTable.defaults.dom - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "dom": '<"top"i>rt<"bottom"flp><"clear">' - * } ); - * } ); - */ - "sDom": "lfrtip", - - - /** - * Search delay option. This will throttle full table searches that use the - * DataTables provided search input element (it does not effect calls to - * `dt-api search()`, providing a delay before the search is made. - * @type integer - * @default 0 - * - * @dtopt Options - * @name DataTable.defaults.searchDelay - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "searchDelay": 200 - * } ); - * } ) - */ - "searchDelay": null, - - - /** - * DataTables features four different built-in options for the buttons to - * display for pagination control: - * - * * `simple` - 'Previous' and 'Next' buttons only - * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers - * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons - * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus - * page numbers - * - * Further methods can be added using {@link DataTable.ext.oPagination}. - * @type string - * @default simple_numbers - * - * @dtopt Options - * @name DataTable.defaults.pagingType - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "pagingType": "full_numbers" - * } ); - * } ) - */ - "sPaginationType": "simple_numbers", - - - /** - * Enable horizontal scrolling. When a table is too wide to fit into a - * certain layout, or you have a large number of columns in the table, you - * can enable x-scrolling to show the table in a viewport, which can be - * scrolled. This property can be `true` which will allow the table to - * scroll horizontally when needed, or any CSS unit, or a number (in which - * case it will be treated as a pixel measurement). Setting as simply `true` - * is recommended. - * @type boolean|string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollX - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": true, - * "scrollCollapse": true - * } ); - * } ); - */ - "sScrollX": "", - - - /** - * This property can be used to force a DataTable to use more width than it - * might otherwise do when x-scrolling is enabled. For example if you have a - * table which requires to be well spaced, this parameter is useful for - * "over-sizing" the table, and thus forcing scrolling. This property can by - * any CSS unit, or a number (in which case it will be treated as a pixel - * measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Options - * @name DataTable.defaults.scrollXInner - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollX": "100%", - * "scrollXInner": "110%" - * } ); - * } ); - */ - "sScrollXInner": "", - - - /** - * Enable vertical scrolling. Vertical scrolling will constrain the DataTable - * to the given height, and enable scrolling for any data which overflows the - * current viewport. This can be used as an alternative to paging to display - * a lot of data in a small area (although paging and scrolling can both be - * enabled at the same time). This property can be any CSS unit, or a number - * (in which case it will be treated as a pixel measurement). - * @type string - * @default blank string - i.e. disabled - * - * @dtopt Features - * @name DataTable.defaults.scrollY - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "scrollY": "200px", - * "paginate": false - * } ); - * } ); - */ - "sScrollY": "", - - - /** - * __Deprecated__ The functionality provided by this parameter has now been - * superseded by that provided through `ajax`, which should be used instead. - * - * Set the HTTP method that is used to make the Ajax call for server-side - * processing or Ajax sourced data. - * @type string - * @default GET - * - * @dtopt Options - * @dtopt Server-side - * @name DataTable.defaults.serverMethod - * - * @deprecated 1.10. Please use `ajax` for this functionality now. - */ - "sServerMethod": "GET", - - - /** - * DataTables makes use of renderers when displaying HTML elements for - * a table. These renderers can be added or modified by plug-ins to - * generate suitable mark-up for a site. For example the Bootstrap - * integration plug-in for DataTables uses a paging button renderer to - * display pagination buttons in the mark-up required by Bootstrap. - * - * For further information about the renderers available see - * DataTable.ext.renderer - * @type string|object - * @default null - * - * @name DataTable.defaults.renderer - * - */ - "renderer": null, - - - /** - * Set the data property name that DataTables should use to get a row's id - * to set as the `id` property in the node. - * @type string - * @default DT_RowId - * - * @name DataTable.defaults.rowId - */ - "rowId": "DT_RowId" - }; - - _fnHungarianMap( DataTable.defaults ); - - - - /* - * Developer note - See note in model.defaults.js about the use of Hungarian - * notation and camel case. - */ - - /** - * Column options that can be given to DataTables at initialisation time. - * @namespace - */ - DataTable.defaults.column = { - /** - * Define which column(s) an order will occur on for this column. This - * allows a column's ordering to take multiple columns into account when - * doing a sort or use the data from a different column. For example first - * name / last name columns make sense to do a multi-column sort over the - * two columns. - * @type array|int - * @default null Takes the value of the column index automatically - * - * @name DataTable.defaults.column.orderData - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderData": [ 0, 1 ], "targets": [ 0 ] }, - * { "orderData": [ 1, 0 ], "targets": [ 1 ] }, - * { "orderData": 2, "targets": [ 2 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderData": [ 0, 1 ] }, - * { "orderData": [ 1, 0 ] }, - * { "orderData": 2 }, - * null, - * null - * ] - * } ); - * } ); - */ - "aDataSort": null, - "iDataSort": -1, - - - /** - * You can control the default ordering direction, and even alter the - * behaviour of the sort handler (i.e. only allow ascending ordering etc) - * using this parameter. - * @type array - * @default [ 'asc', 'desc' ] - * - * @name DataTable.defaults.column.orderSequence - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderSequence": [ "asc" ], "targets": [ 1 ] }, - * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] }, - * { "orderSequence": [ "desc" ], "targets": [ 3 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * { "orderSequence": [ "asc" ] }, - * { "orderSequence": [ "desc", "asc", "asc" ] }, - * { "orderSequence": [ "desc" ] }, - * null - * ] - * } ); - * } ); - */ - "asSorting": [ 'asc', 'desc' ], - - - /** - * Enable or disable filtering on the data in this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.searchable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "searchable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "searchable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSearchable": true, - - - /** - * Enable or disable ordering on this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.orderable - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderable": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "orderable": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bSortable": true, - - - /** - * Enable or disable the display of this column. - * @type boolean - * @default true - * - * @name DataTable.defaults.column.visible - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "visible": false, "targets": [ 0 ] } - * ] } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "visible": false }, - * null, - * null, - * null, - * null - * ] } ); - * } ); - */ - "bVisible": true, - - - /** - * Developer definable function that is called whenever a cell is created (Ajax source, - * etc) or processed for input (DOM source). This can be used as a compliment to mRender - * allowing you to modify the DOM element (add background colour for example) when the - * element is available. - * @type function - * @param {element} td The TD node that has been created - * @param {*} cellData The Data for the cell - * @param {array|object} rowData The data for the whole row - * @param {int} row The row index for the aoData data store - * @param {int} col The column index for aoColumns - * - * @name DataTable.defaults.column.createdCell - * @dtopt Columns - * - * @example - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [3], - * "createdCell": function (td, cellData, rowData, row, col) { - * if ( cellData == "1.7" ) { - * $(td).css('color', 'blue') - * } - * } - * } ] - * }); - * } ); - */ - "fnCreatedCell": null, - - - /** - * This parameter has been replaced by `data` in DataTables to ensure naming - * consistency. `dataProp` can still be used, as there is backwards - * compatibility in DataTables for this option, but it is strongly - * recommended that you use `data` in preference to `dataProp`. - * @name DataTable.defaults.column.dataProp - */ - - - /** - * This property can be used to read data from any data source property, - * including deeply nested objects / properties. `data` can be given in a - * number of different ways which effect its behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. Note that - * function notation is recommended for use in `render` rather than - * `data` as it is much simpler to use as a renderer. - * * `null` - use the original data source for the row rather than plucking - * data directly from it. This action has effects on two other - * initialisation options: - * * `defaultContent` - When null is given as the `data` option and - * `defaultContent` is specified for the column, the value defined by - * `defaultContent` will be used for the cell. - * * `render` - When null is used for the `data` option and the `render` - * option is specified for the column, the whole data source for the - * row is used for the renderer. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * `{array|object}` The data source for the row - * * `{string}` The type call data requested - this will be 'set' when - * setting data or 'filter', 'display', 'type', 'sort' or undefined - * when gathering data. Note that when `undefined` is given for the - * type DataTables expects to get the raw data for the object back< - * * `{*}` Data to set when the second parameter is 'set'. - * * Return: - * * The return value from the function is not required when 'set' is - * the type of call, but otherwise the return is what will be used - * for the data requested. - * - * Note that `data` is a getter and setter option. If you just require - * formatting of data for output, you will likely want to use `render` which - * is simply a getter and thus simpler to use. - * - * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The - * name change reflects the flexibility of this property and is consistent - * with the naming of mRender. If 'mDataProp' is given, then it will still - * be used by DataTables, as it automatically maps the old name to the new - * if required. - * - * @type string|int|function|null - * @default null Use automatically calculated column index - * - * @name DataTable.defaults.column.data - * @dtopt Columns - * - * @example - * // Read table data from objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": {value}, - * // "version": {value}, - * // "grade": {value} - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/objects.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform" }, - * { "data": "version" }, - * { "data": "grade" } - * ] - * } ); - * } ); - * - * @example - * // Read information from deeply nested objects - * // JSON structure for each row: - * // { - * // "engine": {value}, - * // "browser": {value}, - * // "platform": { - * // "inner": {value} - * // }, - * // "details": [ - * // {value}, {value} - * // ] - * // } - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { "data": "platform.inner" }, - * { "data": "platform.details.0" }, - * { "data": "platform.details.1" } - * ] - * } ); - * } ); - * - * @example - * // Using `data` as a function to provide different information for - * // sorting, filtering and display. In this case, currency (price) - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": function ( source, type, val ) { - * if (type === 'set') { - * source.price = val; - * // Store the computed dislay and filter values for efficiency - * source.price_display = val=="" ? "" : "$"+numberFormat(val); - * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; - * return; - * } - * else if (type === 'display') { - * return source.price_display; - * } - * else if (type === 'filter') { - * return source.price_filter; - * } - * // 'sort', 'type' and undefined all just use the integer - * return source.price; - * } - * } ] - * } ); - * } ); - * - * @example - * // Using default content - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, - * "defaultContent": "Click to edit" - * } ] - * } ); - * } ); - * - * @example - * // Using array notation - outputting a list from an array - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "name[, ]" - * } ] - * } ); - * } ); - * - */ - "mData": null, - - - /** - * This property is the rendering partner to `data` and it is suggested that - * when you want to manipulate data for display (including filtering, - * sorting etc) without altering the underlying data for the table, use this - * property. `render` can be considered to be the the read only companion to - * `data` which is read / write (then as such more complex). Like `data` - * this option can be given in a number of different ways to effect its - * behaviour: - * - * * `integer` - treated as an array index for the data source. This is the - * default that DataTables uses (incrementally increased for each column). - * * `string` - read an object property from the data source. There are - * three 'special' options that can be used in the string to alter how - * DataTables reads the data from the source object: - * * `.` - Dotted Javascript notation. Just as you use a `.` in - * Javascript to read from nested objects, so to can the options - * specified in `data`. For example: `browser.version` or - * `browser.name`. If your object parameter name contains a period, use - * `\\` to escape it - i.e. `first\\.name`. - * * `[]` - Array notation. DataTables can automatically combine data - * from and array source, joining the data with the characters provided - * between the two brackets. For example: `name[, ]` would provide a - * comma-space separated list from the source array. If no characters - * are provided between the brackets, the original array source is - * returned. - * * `()` - Function notation. Adding `()` to the end of a parameter will - * execute a function of the name given. For example: `browser()` for a - * simple function on the data source, `browser.version()` for a - * function in a nested property or even `browser().version` to get an - * object property if the function called returns an object. - * * `object` - use different data for the different data types requested by - * DataTables ('filter', 'display', 'type' or 'sort'). The property names - * of the object is the data type the property refers to and the value can - * defined using an integer, string or function using the same rules as - * `render` normally does. Note that an `_` option _must_ be specified. - * This is the default value to use if you haven't specified a value for - * the data type requested by DataTables. - * * `function` - the function given will be executed whenever DataTables - * needs to set or get the data for a cell in the column. The function - * takes three parameters: - * * Parameters: - * * {array|object} The data source for the row (based on `data`) - * * {string} The type call data requested - this will be 'filter', - * 'display', 'type' or 'sort'. - * * {array|object} The full data source for the row (not based on - * `data`) - * * Return: - * * The return value from the function is what will be used for the - * data requested. - * - * @type string|int|function|object|null - * @default null Use the data source value. - * - * @name DataTable.defaults.column.render - * @dtopt Columns - * - * @example - * // Create a comma separated list from an array of objects - * $(document).ready( function() { - * $('#example').dataTable( { - * "ajaxSource": "sources/deep.txt", - * "columns": [ - * { "data": "engine" }, - * { "data": "browser" }, - * { - * "data": "platform", - * "render": "[, ].name" - * } - * ] - * } ); - * } ); - * - * @example - * // Execute a function to obtain data - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": "browserName()" - * } ] - * } ); - * } ); - * - * @example - * // As an object, extracting different data for the different types - * // This would be used with a data source such as: - * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" } - * // Here the `phone` integer is used for sorting and type detection, while `phone_filter` - * // (which has both forms) is used for filtering for if a user inputs either format, while - * // the formatted phone number is the one that is shown in the table. - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": null, // Use the full data source object for the renderer's source - * "render": { - * "_": "phone", - * "filter": "phone_filter", - * "display": "phone_display" - * } - * } ] - * } ); - * } ); - * - * @example - * // Use as a function to create a link from the data source - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "data": "download_link", - * "render": function ( data, type, full ) { - * return 'Download'; - * } - * } ] - * } ); - * } ); - */ - "mRender": null, - - - /** - * Change the cell type created for the column - either TD cells or TH cells. This - * can be useful as TH cells have semantic meaning in the table body, allowing them - * to act as a header for a row (you may wish to add scope='row' to the TH elements). - * @type string - * @default td - * - * @name DataTable.defaults.column.cellType - * @dtopt Columns - * - * @example - * // Make the first column use TH cells - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ { - * "targets": [ 0 ], - * "cellType": "th" - * } ] - * } ); - * } ); - */ - "sCellType": "td", - - - /** - * Class to give to each cell in this column. - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.class - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "class": "my_class", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "class": "my_class" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sClass": "", - - /** - * When DataTables calculates the column widths to assign to each column, - * it finds the longest string in each column and then constructs a - * temporary table and reads the widths from that. The problem with this - * is that "mmm" is much wider then "iiii", but the latter is a longer - * string - thus the calculation can go wrong (doing it properly and putting - * it into an DOM object and measuring that is horribly(!) slow). Thus as - * a "work around" we provide this option. It will append its value to the - * text that is found to be the longest string for the column - i.e. padding. - * Generally you shouldn't need this! - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.contentPadding - * @dtopt Columns - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "contentPadding": "mmm" - * } - * ] - * } ); - * } ); - */ - "sContentPadding": "", - - - /** - * Allows a default value to be given for a column's data, and will be used - * whenever a null data source is encountered (this can be because `data` - * is set to null, or because the data source itself is null). - * @type string - * @default null - * - * @name DataTable.defaults.column.defaultContent - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { - * "data": null, - * "defaultContent": "Edit", - * "targets": [ -1 ] - * } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * null, - * { - * "data": null, - * "defaultContent": "Edit" - * } - * ] - * } ); - * } ); - */ - "sDefaultContent": null, - - - /** - * This parameter is only used in DataTables' server-side processing. It can - * be exceptionally useful to know what columns are being displayed on the - * client side, and to map these to database fields. When defined, the names - * also allow DataTables to reorder information from the server if it comes - * back in an unexpected order (i.e. if you switch your columns around on the - * client-side, your server-side code does not also need updating). - * @type string - * @default Empty string - * - * @name DataTable.defaults.column.name - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "name": "engine", "targets": [ 0 ] }, - * { "name": "browser", "targets": [ 1 ] }, - * { "name": "platform", "targets": [ 2 ] }, - * { "name": "version", "targets": [ 3 ] }, - * { "name": "grade", "targets": [ 4 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "name": "engine" }, - * { "name": "browser" }, - * { "name": "platform" }, - * { "name": "version" }, - * { "name": "grade" } - * ] - * } ); - * } ); - */ - "sName": "", - - - /** - * Defines a data source type for the ordering which can be used to read - * real-time information from the table (updating the internally cached - * version) prior to ordering. This allows ordering to occur on user - * editable elements such as form inputs. - * @type string - * @default std - * - * @name DataTable.defaults.column.orderDataType - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "orderDataType": "dom-text", "targets": [ 2, 3 ] }, - * { "type": "numeric", "targets": [ 3 ] }, - * { "orderDataType": "dom-select", "targets": [ 4 ] }, - * { "orderDataType": "dom-checkbox", "targets": [ 5 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * null, - * null, - * { "orderDataType": "dom-text" }, - * { "orderDataType": "dom-text", "type": "numeric" }, - * { "orderDataType": "dom-select" }, - * { "orderDataType": "dom-checkbox" } - * ] - * } ); - * } ); - */ - "sSortDataType": "std", - - - /** - * The title of this column. - * @type string - * @default null Derived from the 'TH' value for this column in the - * original HTML table. - * - * @name DataTable.defaults.column.title - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "title": "My column title", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "title": "My column title" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sTitle": null, - - - /** - * The type allows you to specify how the data for this column will be - * ordered. Four types (string, numeric, date and html (which will strip - * HTML tags before ordering)) are currently available. Note that only date - * formats understood by Javascript's Date() object will be accepted as type - * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string', - * 'numeric', 'date' or 'html' (by default). Further types can be adding - * through plug-ins. - * @type string - * @default null Auto-detected from raw data - * - * @name DataTable.defaults.column.type - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "type": "html", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "type": "html" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sType": null, - - - /** - * Defining the width of the column, this parameter may take any CSS value - * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not - * been given a specific width through this interface ensuring that the table - * remains readable. - * @type string - * @default null Automatic - * - * @name DataTable.defaults.column.width - * @dtopt Columns - * - * @example - * // Using `columnDefs` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columnDefs": [ - * { "width": "20%", "targets": [ 0 ] } - * ] - * } ); - * } ); - * - * @example - * // Using `columns` - * $(document).ready( function() { - * $('#example').dataTable( { - * "columns": [ - * { "width": "20%" }, - * null, - * null, - * null, - * null - * ] - * } ); - * } ); - */ - "sWidth": null - }; - - _fnHungarianMap( DataTable.defaults.column ); - - - - /** - * DataTables settings object - this holds all the information needed for a - * given table, including configuration, data and current application of the - * table options. DataTables does not have a single instance for each DataTable - * with the settings attached to that instance, but rather instances of the - * DataTable "class" are created on-the-fly as needed (typically by a - * $().dataTable() call) and the settings object is then applied to that - * instance. - * - * Note that this object is related to {@link DataTable.defaults} but this - * one is the internal data store for DataTables's cache of columns. It should - * NOT be manipulated outside of DataTables. Any configuration should be done - * through the initialisation options. - * @namespace - * @todo Really should attach the settings object to individual instances so we - * don't need to create new instances on each $().dataTable() call (if the - * table already exists). It would also save passing oSettings around and - * into every single function. However, this is a very significant - * architecture change for DataTables and will almost certainly break - * backwards compatibility with older installations. This is something that - * will be done in 2.0. - */ - DataTable.models.oSettings = { - /** - * Primary features of DataTables and their enablement state. - * @namespace - */ - "oFeatures": { - - /** - * Flag to say if DataTables should automatically try to calculate the - * optimum table and columns widths (true) or not (false). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bAutoWidth": null, - - /** - * Delay the creation of TR and TD elements until they are actually - * needed by a driven page draw. This can give a significant speed - * increase for Ajax source and Javascript source data, but makes no - * difference at all fro DOM and server-side processing tables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bDeferRender": null, - - /** - * Enable filtering on the table or not. Note that if this is disabled - * then there is no filtering at all on the table, including fnFilter. - * To just remove the filtering input use sDom and remove the 'f' option. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bFilter": null, - - /** - * Table information element (the 'Showing x of y records' div) enable - * flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bInfo": null, - - /** - * Present a user control allowing the end user to change the page size - * when pagination is enabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bLengthChange": null, - - /** - * Pagination enabled or not. Note that if this is disabled then length - * changing must also be disabled. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bPaginate": null, - - /** - * Processing indicator enable flag whenever DataTables is enacting a - * user request - typically an Ajax request for server-side processing. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bProcessing": null, - - /** - * Server-side processing enabled flag - when enabled DataTables will - * get all data from the server for every draw - there is no filtering, - * sorting or paging done on the client-side. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bServerSide": null, - - /** - * Sorting enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSort": null, - - /** - * Multi-column sorting - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortMulti": null, - - /** - * Apply a class to the columns which are being sorted to provide a - * visual highlight or not. This can slow things down when enabled since - * there is a lot of DOM interaction. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortClasses": null, - - /** - * State saving enablement flag. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bStateSave": null - }, - - - /** - * Scrolling settings for a table. - * @namespace - */ - "oScroll": { - /** - * When the table is shorter in height than sScrollY, collapse the - * table container down to the height of the table (when true). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bCollapse": null, - - /** - * Width of the scrollbar for the web-browser's platform. Calculated - * during table initialisation. - * @type int - * @default 0 - */ - "iBarWidth": 0, - - /** - * Viewport width for horizontal scrolling. Horizontal scrolling is - * disabled if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sX": null, - - /** - * Width to expand the table to when using x-scrolling. Typically you - * should not need to use this. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @deprecated - */ - "sXInner": null, - - /** - * Viewport height for vertical scrolling. Vertical scrolling is disabled - * if an empty string. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sY": null - }, - - /** - * Language information for the table. - * @namespace - * @extends DataTable.defaults.oLanguage - */ - "oLanguage": { - /** - * Information callback function. See - * {@link DataTable.defaults.fnInfoCallback} - * @type function - * @default null - */ - "fnInfoCallback": null - }, - - /** - * Browser support parameters - * @namespace - */ - "oBrowser": { - /** - * Indicate if the browser incorrectly calculates width:100% inside a - * scrolling element (IE6/7) - * @type boolean - * @default false - */ - "bScrollOversize": false, - - /** - * Determine if the vertical scrollbar is on the right or left of the - * scrolling container - needed for rtl language layout, although not - * all browsers move the scrollbar (Safari). - * @type boolean - * @default false - */ - "bScrollbarLeft": false, - - /** - * Flag for if `getBoundingClientRect` is fully supported or not - * @type boolean - * @default false - */ - "bBounding": false, - - /** - * Browser scrollbar width - * @type integer - * @default 0 - */ - "barWidth": 0 - }, - - - "ajax": null, - - - /** - * Array referencing the nodes which are used for the features. The - * parameters of this object match what is allowed by sDom - i.e. - *
      - *
    • 'l' - Length changing
    • - *
    • 'f' - Filtering input
    • - *
    • 't' - The table!
    • - *
    • 'i' - Information
    • - *
    • 'p' - Pagination
    • - *
    • 'r' - pRocessing
    • - *
    - * @type array - * @default [] - */ - "aanFeatures": [], - - /** - * Store data information - see {@link DataTable.models.oRow} for detailed - * information. - * @type array - * @default [] - */ - "aoData": [], - - /** - * Array of indexes which are in the current display (after filtering etc) - * @type array - * @default [] - */ - "aiDisplay": [], - - /** - * Array of indexes for display - no filtering - * @type array - * @default [] - */ - "aiDisplayMaster": [], - - /** - * Map of row ids to data indexes - * @type object - * @default {} - */ - "aIds": {}, - - /** - * Store information about each column that is in use - * @type array - * @default [] - */ - "aoColumns": [], - - /** - * Store information about the table's header - * @type array - * @default [] - */ - "aoHeader": [], - - /** - * Store information about the table's footer - * @type array - * @default [] - */ - "aoFooter": [], - - /** - * Store the applied global search information in case we want to force a - * research or compare the old search to a new one. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @namespace - * @extends DataTable.models.oSearch - */ - "oPreviousSearch": {}, - - /** - * Store the applied search for each column - see - * {@link DataTable.models.oSearch} for the format that is used for the - * filtering information for each column. - * @type array - * @default [] - */ - "aoPreSearchCols": [], - - /** - * Sorting that is applied to the table. Note that the inner arrays are - * used in the following manner: - *
      - *
    • Index 0 - column number
    • - *
    • Index 1 - current sorting direction
    • - *
    - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @todo These inner arrays should really be objects - */ - "aaSorting": null, - - /** - * Sorting that is always applied to the table (i.e. prefixed in front of - * aaSorting). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aaSortingFixed": [], - - /** - * Classes to use for the striping of a table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "asStripeClasses": null, - - /** - * If restoring a table - we should restore its striping classes as well - * @type array - * @default [] - */ - "asDestroyStripes": [], - - /** - * If restoring a table - we should restore its width - * @type int - * @default 0 - */ - "sDestroyWidth": 0, - - /** - * Callback functions array for every time a row is inserted (i.e. on a draw). - * @type array - * @default [] - */ - "aoRowCallback": [], - - /** - * Callback functions for the header on each draw. - * @type array - * @default [] - */ - "aoHeaderCallback": [], - - /** - * Callback function for the footer on each draw. - * @type array - * @default [] - */ - "aoFooterCallback": [], - - /** - * Array of callback functions for draw callback functions - * @type array - * @default [] - */ - "aoDrawCallback": [], - - /** - * Array of callback functions for row created function - * @type array - * @default [] - */ - "aoRowCreatedCallback": [], - - /** - * Callback functions for just before the table is redrawn. A return of - * false will be used to cancel the draw. - * @type array - * @default [] - */ - "aoPreDrawCallback": [], - - /** - * Callback functions for when the table has been initialised. - * @type array - * @default [] - */ - "aoInitComplete": [], - - - /** - * Callbacks for modifying the settings to be stored for state saving, prior to - * saving state. - * @type array - * @default [] - */ - "aoStateSaveParams": [], - - /** - * Callbacks for modifying the settings that have been stored for state saving - * prior to using the stored values to restore the state. - * @type array - * @default [] - */ - "aoStateLoadParams": [], - - /** - * Callbacks for operating on the settings object once the saved state has been - * loaded - * @type array - * @default [] - */ - "aoStateLoaded": [], - - /** - * Cache the table ID for quick access - * @type string - * @default Empty string - */ - "sTableId": "", - - /** - * The TABLE node for the main table - * @type node - * @default null - */ - "nTable": null, - - /** - * Permanent ref to the thead element - * @type node - * @default null - */ - "nTHead": null, - - /** - * Permanent ref to the tfoot element - if it exists - * @type node - * @default null - */ - "nTFoot": null, - - /** - * Permanent ref to the tbody element - * @type node - * @default null - */ - "nTBody": null, - - /** - * Cache the wrapper node (contains all DataTables controlled elements) - * @type node - * @default null - */ - "nTableWrapper": null, - - /** - * Indicate if when using server-side processing the loading of data - * should be deferred until the second draw. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - * @default false - */ - "bDeferLoading": false, - - /** - * Indicate if all required information has been read in - * @type boolean - * @default false - */ - "bInitialised": false, - - /** - * Information about open rows. Each object in the array has the parameters - * 'nTr' and 'nParent' - * @type array - * @default [] - */ - "aoOpenRows": [], - - /** - * Dictate the positioning of DataTables' control elements - see - * {@link DataTable.model.oInit.sDom}. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sDom": null, - - /** - * Search delay (in mS) - * @type integer - * @default null - */ - "searchDelay": null, - - /** - * Which type of pagination should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default two_button - */ - "sPaginationType": "two_button", - - /** - * The state duration (for `stateSave`) in seconds. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type int - * @default 0 - */ - "iStateDuration": 0, - - /** - * Array of callback functions for state saving. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the JSON string to save that has been thus far created. Returns - * a JSON string to be inserted into a json object - * (i.e. '"param": [ 0, 1, 2]')
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateSave": [], - - /** - * Array of callback functions for state loading. Each array element is an - * object with the following parameters: - *
      - *
    • function:fn - function to call. Takes two parameters, oSettings - * and the object stored. May return false to cancel state loading
    • - *
    • string:sName - name of callback
    • - *
    - * @type array - * @default [] - */ - "aoStateLoad": [], - - /** - * State that was saved. Useful for back reference - * @type object - * @default null - */ - "oSavedState": null, - - /** - * State that was loaded. Useful for back reference - * @type object - * @default null - */ - "oLoadedState": null, - - /** - * Source url for AJAX data for the table. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - * @default null - */ - "sAjaxSource": null, - - /** - * Property from a given object from which to read the table data from. This - * can be an empty string (when not server-side processing), in which case - * it is assumed an an array is given directly. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sAjaxDataProp": null, - - /** - * Note if draw should be blocked while getting data - * @type boolean - * @default true - */ - "bAjaxDataGet": true, - - /** - * The last jQuery XHR object that was used for server-side data gathering. - * This can be used for working with the XHR information in one of the - * callbacks - * @type object - * @default null - */ - "jqXHR": null, - - /** - * JSON returned from the server in the last Ajax request - * @type object - * @default undefined - */ - "json": undefined, - - /** - * Data submitted as part of the last Ajax request - * @type object - * @default undefined - */ - "oAjaxData": undefined, - - /** - * Function to get the server-side data. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnServerData": null, - - /** - * Functions which are called prior to sending an Ajax request so extra - * parameters can easily be sent to the server - * @type array - * @default [] - */ - "aoServerParams": [], - - /** - * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if - * required). - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type string - */ - "sServerMethod": null, - - /** - * Format numbers for display. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type function - */ - "fnFormatNumber": null, - - /** - * List of options that can be used for the user selectable length menu. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type array - * @default [] - */ - "aLengthMenu": null, - - /** - * Counter for the draws that the table does. Also used as a tracker for - * server-side processing - * @type int - * @default 0 - */ - "iDraw": 0, - - /** - * Indicate if a redraw is being done - useful for Ajax - * @type boolean - * @default false - */ - "bDrawing": false, - - /** - * Draw index (iDraw) of the last error when parsing the returned data - * @type int - * @default -1 - */ - "iDrawError": -1, - - /** - * Paging display length - * @type int - * @default 10 - */ - "_iDisplayLength": 10, - - /** - * Paging start point - aiDisplay index - * @type int - * @default 0 - */ - "_iDisplayStart": 0, - - /** - * Server-side processing - number of records in the result set - * (i.e. before filtering), Use fnRecordsTotal rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type int - * @default 0 - * @private - */ - "_iRecordsTotal": 0, - - /** - * Server-side processing - number of records in the current display set - * (i.e. after filtering). Use fnRecordsDisplay rather than - * this property to get the value of the number of records, regardless of - * the server-side processing setting. - * @type boolean - * @default 0 - * @private - */ - "_iRecordsDisplay": 0, - - /** - * Flag to indicate if jQuery UI marking and classes should be used. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bJUI": null, - - /** - * The classes to use for the table - * @type object - * @default {} - */ - "oClasses": {}, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if filtering has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bFiltered": false, - - /** - * Flag attached to the settings object so you can check in the draw - * callback if sorting has been done in the draw. Deprecated in favour of - * events. - * @type boolean - * @default false - * @deprecated - */ - "bSorted": false, - - /** - * Indicate that if multiple rows are in the header and there is more than - * one unique cell per column, if the top one (true) or bottom one (false) - * should be used for sorting / title by DataTables. - * Note that this parameter will be set by the initialisation routine. To - * set a default use {@link DataTable.defaults}. - * @type boolean - */ - "bSortCellsTop": null, - - /** - * Initialisation object that is used for the table - * @type object - * @default null - */ - "oInit": null, - - /** - * Destroy callback functions - for plug-ins to attach themselves to the - * destroy so they can clean up markup and events. - * @type array - * @default [] - */ - "aoDestroyCallback": [], - - - /** - * Get the number of records in the current record set, before filtering - * @type function - */ - "fnRecordsTotal": function () - { - return _fnDataSource( this ) == 'ssp' ? - this._iRecordsTotal * 1 : - this.aiDisplayMaster.length; - }, - - /** - * Get the number of records in the current record set, after filtering - * @type function - */ - "fnRecordsDisplay": function () - { - return _fnDataSource( this ) == 'ssp' ? - this._iRecordsDisplay * 1 : - this.aiDisplay.length; - }, - - /** - * Get the display end point - aiDisplay index - * @type function - */ - "fnDisplayEnd": function () - { - var - len = this._iDisplayLength, - start = this._iDisplayStart, - calc = start + len, - records = this.aiDisplay.length, - features = this.oFeatures, - paginate = features.bPaginate; - - if ( features.bServerSide ) { - return paginate === false || len === -1 ? - start + records : - Math.min( start+len, this._iRecordsDisplay ); - } - else { - return ! paginate || calc>records || len===-1 ? - records : - calc; - } - }, - - /** - * The DataTables object for this table - * @type object - * @default null - */ - "oInstance": null, - - /** - * Unique identifier for each instance of the DataTables object. If there - * is an ID on the table node, then it takes that value, otherwise an - * incrementing internal counter is used. - * @type string - * @default null - */ - "sInstance": null, - - /** - * tabindex attribute value that is added to DataTables control elements, allowing - * keyboard navigation of the table and its controls. - */ - "iTabIndex": 0, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollHead": null, - - /** - * DIV container for the footer scrolling table if scrolling - */ - "nScrollFoot": null, - - /** - * Last applied sort - * @type array - * @default [] - */ - "aLastSort": [], - - /** - * Stored plug-in instances - * @type object - * @default {} - */ - "oPlugins": {}, - - /** - * Function used to get a row's id from the row's data - * @type function - * @default null - */ - "rowIdFn": null, - - /** - * Data location where to store a row's id - * @type string - * @default null - */ - "rowId": null - }; - - /** - * Extension object for DataTables that is used to provide all extension - * options. - * - * Note that the `DataTable.ext` object is available through - * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is - * also aliased to `jQuery.fn.dataTableExt` for historic reasons. - * @namespace - * @extends DataTable.models.ext - */ - - - /** - * DataTables extensions - * - * This namespace acts as a collection area for plug-ins that can be used to - * extend DataTables capabilities. Indeed many of the build in methods - * use this method to provide their own capabilities (sorting methods for - * example). - * - * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy - * reasons - * - * @namespace - */ - DataTable.ext = _ext = { - /** - * Buttons. For use with the Buttons extension for DataTables. This is - * defined here so other extensions can define buttons regardless of load - * order. It is _not_ used by DataTables core. - * - * @type object - * @default {} - */ - buttons: {}, - - - /** - * Element class names - * - * @type object - * @default {} - */ - classes: {}, - - - /** - * DataTables build type (expanded by the download builder) - * - * @type string - */ - builder: "-source-", - - - /** - * Error reporting. - * - * How should DataTables report an error. Can take the value 'alert', - * 'throw', 'none' or a function. - * - * @type string|function - * @default alert - */ - errMode: "alert", - - - /** - * Feature plug-ins. - * - * This is an array of objects which describe the feature plug-ins that are - * available to DataTables. These feature plug-ins are then available for - * use through the `dom` initialisation option. - * - * Each feature plug-in is described by an object which must have the - * following properties: - * - * * `fnInit` - function that is used to initialise the plug-in, - * * `cFeature` - a character so the feature can be enabled by the `dom` - * instillation option. This is case sensitive. - * - * The `fnInit` function has the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * - * And the following return is expected: - * - * * {node|null} The element which contains your feature. Note that the - * return may also be void if your plug-in does not require to inject any - * DOM elements into DataTables control (`dom`) - for example this might - * be useful when developing a plug-in which allows table control via - * keyboard entry - * - * @type array - * - * @example - * $.fn.dataTable.ext.features.push( { - * "fnInit": function( oSettings ) { - * return new TableTools( { "oDTSettings": oSettings } ); - * }, - * "cFeature": "T" - * } ); - */ - feature: [], - - - /** - * Row searching. - * - * This method of searching is complimentary to the default type based - * searching, and a lot more comprehensive as it allows you complete control - * over the searching logic. Each element in this array is a function - * (parameters described below) that is called for every row in the table, - * and your logic decides if it should be included in the searching data set - * or not. - * - * Searching functions have the following input parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{array|object}` Data for the row to be processed (same as the - * original format that was passed in as the data source, or an array - * from a DOM data source - * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which - * can be useful to retrieve the `TR` element if you need DOM interaction. - * - * And the following return is expected: - * - * * {boolean} Include the row in the searched result set (true) or not - * (false) - * - * Note that as with the main search ability in DataTables, technically this - * is "filtering", since it is subtractive. However, for consistency in - * naming we call it searching here. - * - * @type array - * @default [] - * - * @example - * // The following example shows custom search being applied to the - * // fourth column (i.e. the data[3] index) based on two input values - * // from the end-user, matching the data in a certain range. - * $.fn.dataTable.ext.search.push( - * function( settings, data, dataIndex ) { - * var min = document.getElementById('min').value * 1; - * var max = document.getElementById('max').value * 1; - * var version = data[3] == "-" ? 0 : data[3]*1; - * - * if ( min == "" && max == "" ) { - * return true; - * } - * else if ( min == "" && version < max ) { - * return true; - * } - * else if ( min < version && "" == max ) { - * return true; - * } - * else if ( min < version && version < max ) { - * return true; - * } - * return false; - * } - * ); - */ - search: [], - - - /** - * Selector extensions - * - * The `selector` option can be used to extend the options available for the - * selector modifier options (`selector-modifier` object data type) that - * each of the three built in selector types offer (row, column and cell + - * their plural counterparts). For example the Select extension uses this - * mechanism to provide an option to select only rows, columns and cells - * that have been marked as selected by the end user (`{selected: true}`), - * which can be used in conjunction with the existing built in selector - * options. - * - * Each property is an array to which functions can be pushed. The functions - * take three attributes: - * - * * Settings object for the host table - * * Options object (`selector-modifier` object type) - * * Array of selected item indexes - * - * The return is an array of the resulting item indexes after the custom - * selector has been applied. - * - * @type object - */ - selector: { - cell: [], - column: [], - row: [] - }, - - - /** - * Internal functions, exposed for used in plug-ins. - * - * Please note that you should not need to use the internal methods for - * anything other than a plug-in (and even then, try to avoid if possible). - * The internal function may change between releases. - * - * @type object - * @default {} - */ - internal: {}, - - - /** - * Legacy configuration options. Enable and disable legacy options that - * are available in DataTables. - * - * @type object - */ - legacy: { - /** - * Enable / disable DataTables 1.9 compatible server-side processing - * requests - * - * @type boolean - * @default null - */ - ajax: null - }, - - - /** - * Pagination plug-in methods. - * - * Each entry in this object is a function and defines which buttons should - * be shown by the pagination rendering method that is used for the table: - * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the - * buttons are displayed in the document, while the functions here tell it - * what buttons to display. This is done by returning an array of button - * descriptions (what each button will do). - * - * Pagination types (the four built in options and any additional plug-in - * options defined here) can be used through the `paginationType` - * initialisation parameter. - * - * The functions defined take two parameters: - * - * 1. `{int} page` The current page index - * 2. `{int} pages` The number of pages in the table - * - * Each function is expected to return an array where each element of the - * array can be one of: - * - * * `first` - Jump to first page when activated - * * `last` - Jump to last page when activated - * * `previous` - Show previous page when activated - * * `next` - Show next page when activated - * * `{int}` - Show page of the index given - * * `{array}` - A nested array containing the above elements to add a - * containing 'DIV' element (might be useful for styling). - * - * Note that DataTables v1.9- used this object slightly differently whereby - * an object with two functions would be defined for each plug-in. That - * ability is still supported by DataTables 1.10+ to provide backwards - * compatibility, but this option of use is now decremented and no longer - * documented in DataTables 1.10+. - * - * @type object - * @default {} - * - * @example - * // Show previous, next and current page buttons only - * $.fn.dataTableExt.oPagination.current = function ( page, pages ) { - * return [ 'previous', page, 'next' ]; - * }; - */ - pager: {}, - - - renderer: { - pageButton: {}, - header: {} - }, - - - /** - * Ordering plug-ins - custom data source - * - * The extension options for ordering of data available here is complimentary - * to the default type based ordering that DataTables typically uses. It - * allows much greater control over the the data that is being used to - * order a column, but is necessarily therefore more complex. - * - * This type of ordering is useful if you want to do ordering based on data - * live from the DOM (for example the contents of an 'input' element) rather - * than just the static string that DataTables knows of. - * - * The way these plug-ins work is that you create an array of the values you - * wish to be ordering for the column in question and then return that - * array. The data in the array much be in the index order of the rows in - * the table (not the currently ordering order!). Which order data gathering - * function is run here depends on the `dt-init columns.orderDataType` - * parameter that is used for the column (if any). - * - * The functions defined take two parameters: - * - * 1. `{object}` DataTables settings object: see - * {@link DataTable.models.oSettings} - * 2. `{int}` Target column index - * - * Each function is expected to return an array: - * - * * `{array}` Data for the column to be ordering upon - * - * @type array - * - * @example - * // Ordering using `input` node values - * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col ) - * { - * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { - * return $('input', td).val(); - * } ); - * } - */ - order: {}, - - - /** - * Type based plug-ins. - * - * Each column in DataTables has a type assigned to it, either by automatic - * detection or by direct assignment using the `type` option for the column. - * The type of a column will effect how it is ordering and search (plug-ins - * can also make use of the column type if required). - * - * @namespace - */ - type: { - /** - * Type detection functions. - * - * The functions defined in this object are used to automatically detect - * a column's type, making initialisation of DataTables super easy, even - * when complex data is in the table. - * - * The functions defined take two parameters: - * - * 1. `{*}` Data from the column cell to be analysed - * 2. `{settings}` DataTables settings object. This can be used to - * perform context specific type detection - for example detection - * based on language settings such as using a comma for a decimal - * place. Generally speaking the options from the settings will not - * be required - * - * Each function is expected to return: - * - * * `{string|null}` Data type detected, or null if unknown (and thus - * pass it on to the other type detection functions. - * - * @type array - * - * @example - * // Currency type detection plug-in: - * $.fn.dataTable.ext.type.detect.push( - * function ( data, settings ) { - * // Check the numeric part - * if ( ! $.isNumeric( data.substring(1) ) ) { - * return null; - * } - * - * // Check prefixed by currency - * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) { - * return 'currency'; - * } - * return null; - * } - * ); - */ - detect: [], - - - /** - * Type based search formatting. - * - * The type based searching functions can be used to pre-format the - * data to be search on. For example, it can be used to strip HTML - * tags or to de-format telephone numbers for numeric only searching. - * - * Note that is a search is not defined for a column of a given type, - * no search formatting will be performed. - * - * Pre-processing of searching data plug-ins - When you assign the sType - * for a column (or have it automatically detected for you by DataTables - * or a type detection plug-in), you will typically be using this for - * custom sorting, but it can also be used to provide custom searching - * by allowing you to pre-processing the data and returning the data in - * the format that should be searched upon. This is done by adding - * functions this object with a parameter name which matches the sType - * for that target column. This is the corollary of afnSortData - * for searching data. - * - * The functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for searching - * - * Each function is expected to return: - * - * * `{string|null}` Formatted string that will be used for the searching. - * - * @type object - * @default {} - * - * @example - * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) { - * return d.replace(/\n/g," ").replace( /<.*?>/g, "" ); - * } - */ - search: {}, - - - /** - * Type based ordering. - * - * The column type tells DataTables what ordering to apply to the table - * when a column is sorted upon. The order for each type that is defined, - * is defined by the functions available in this object. - * - * Each ordering option can be described by three properties added to - * this object: - * - * * `{type}-pre` - Pre-formatting function - * * `{type}-asc` - Ascending order function - * * `{type}-desc` - Descending order function - * - * All three can be used together, only `{type}-pre` or only - * `{type}-asc` and `{type}-desc` together. It is generally recommended - * that only `{type}-pre` is used, as this provides the optimal - * implementation in terms of speed, although the others are provided - * for compatibility with existing Javascript sort functions. - * - * `{type}-pre`: Functions defined take a single parameter: - * - * 1. `{*}` Data from the column cell to be prepared for ordering - * - * And return: - * - * * `{*}` Data to be sorted upon - * - * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort - * functions, taking two parameters: - * - * 1. `{*}` Data to compare to the second parameter - * 2. `{*}` Data to compare to the first parameter - * - * And returning: - * - * * `{*}` Ordering match: <0 if first parameter should be sorted lower - * than the second parameter, ===0 if the two parameters are equal and - * >0 if the first parameter should be sorted height than the second - * parameter. - * - * @type object - * @default {} - * - * @example - * // Numeric ordering of formatted numbers with a pre-formatter - * $.extend( $.fn.dataTable.ext.type.order, { - * "string-pre": function(x) { - * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" ); - * return parseFloat( a ); - * } - * } ); - * - * @example - * // Case-sensitive string ordering, with no pre-formatting method - * $.extend( $.fn.dataTable.ext.order, { - * "string-case-asc": function(x,y) { - * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - * }, - * "string-case-desc": function(x,y) { - * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - * } - * } ); - */ - order: {} - }, - - /** - * Unique DataTables instance counter - * - * @type int - * @private - */ - _unique: 0, - - - // - // Depreciated - // The following properties are retained for backwards compatiblity only. - // The should not be used in new projects and will be removed in a future - // version - // - - /** - * Version check function. - * @type function - * @depreciated Since 1.10 - */ - fnVersionCheck: DataTable.fnVersionCheck, - - - /** - * Index for what 'this' index API functions should use - * @type int - * @deprecated Since v1.10 - */ - iApiIndex: 0, - - - /** - * jQuery UI class container - * @type object - * @deprecated Since v1.10 - */ - oJUIClasses: {}, - - - /** - * Software version - * @type string - * @deprecated Since v1.10 - */ - sVersion: DataTable.version - }; - - - // - // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts - // - $.extend( _ext, { - afnFiltering: _ext.search, - aTypes: _ext.type.detect, - ofnSearch: _ext.type.search, - oSort: _ext.type.order, - afnSortData: _ext.order, - aoFeatures: _ext.feature, - oApi: _ext.internal, - oStdClasses: _ext.classes, - oPagination: _ext.pager - } ); - - - $.extend( DataTable.ext.classes, { - "sTable": "dataTable", - "sNoFooter": "no-footer", - - /* Paging buttons */ - "sPageButton": "paginate_button", - "sPageButtonActive": "current", - "sPageButtonDisabled": "disabled", - - /* Striping classes */ - "sStripeOdd": "odd", - "sStripeEven": "even", - - /* Empty row */ - "sRowEmpty": "dataTables_empty", - - /* Features */ - "sWrapper": "dataTables_wrapper", - "sFilter": "dataTables_filter", - "sInfo": "dataTables_info", - "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ - "sLength": "dataTables_length", - "sProcessing": "dataTables_processing", - - /* Sorting */ - "sSortAsc": "sorting_asc", - "sSortDesc": "sorting_desc", - "sSortable": "sorting", /* Sortable in both directions */ - "sSortableAsc": "sorting_asc_disabled", - "sSortableDesc": "sorting_desc_disabled", - "sSortableNone": "sorting_disabled", - "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ - - /* Filtering */ - "sFilterInput": "", - - /* Page length */ - "sLengthSelect": "", - - /* Scrolling */ - "sScrollWrapper": "dataTables_scroll", - "sScrollHead": "dataTables_scrollHead", - "sScrollHeadInner": "dataTables_scrollHeadInner", - "sScrollBody": "dataTables_scrollBody", - "sScrollFoot": "dataTables_scrollFoot", - "sScrollFootInner": "dataTables_scrollFootInner", - - /* Misc */ - "sHeaderTH": "", - "sFooterTH": "", - - // Deprecated - "sSortJUIAsc": "", - "sSortJUIDesc": "", - "sSortJUI": "", - "sSortJUIAscAllowed": "", - "sSortJUIDescAllowed": "", - "sSortJUIWrapper": "", - "sSortIcon": "", - "sJUIHeader": "", - "sJUIFooter": "" - } ); - - - (function() { - - // Reused strings for better compression. Closure compiler appears to have a - // weird edge case where it is trying to expand strings rather than use the - // variable version. This results in about 200 bytes being added, for very - // little preference benefit since it this run on script load only. - var _empty = ''; - _empty = ''; - - var _stateDefault = _empty + 'ui-state-default'; - var _sortIcon = _empty + 'css_right ui-icon ui-icon-'; - var _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix'; - - $.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, { - /* Full numbers paging buttons */ - "sPageButton": "fg-button ui-button "+_stateDefault, - "sPageButtonActive": "ui-state-disabled", - "sPageButtonDisabled": "ui-state-disabled", - - /* Features */ - "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ - "ui-buttonset-multi paging_", /* Note that the type is postfixed */ - - /* Sorting */ - "sSortAsc": _stateDefault+" sorting_asc", - "sSortDesc": _stateDefault+" sorting_desc", - "sSortable": _stateDefault+" sorting", - "sSortableAsc": _stateDefault+" sorting_asc_disabled", - "sSortableDesc": _stateDefault+" sorting_desc_disabled", - "sSortableNone": _stateDefault+" sorting_disabled", - "sSortJUIAsc": _sortIcon+"triangle-1-n", - "sSortJUIDesc": _sortIcon+"triangle-1-s", - "sSortJUI": _sortIcon+"carat-2-n-s", - "sSortJUIAscAllowed": _sortIcon+"carat-1-n", - "sSortJUIDescAllowed": _sortIcon+"carat-1-s", - "sSortJUIWrapper": "DataTables_sort_wrapper", - "sSortIcon": "DataTables_sort_icon", - - /* Scrolling */ - "sScrollHead": "dataTables_scrollHead "+_stateDefault, - "sScrollFoot": "dataTables_scrollFoot "+_stateDefault, - - /* Misc */ - "sHeaderTH": _stateDefault, - "sFooterTH": _stateDefault, - "sJUIHeader": _headerFooter+" ui-corner-tl ui-corner-tr", - "sJUIFooter": _headerFooter+" ui-corner-bl ui-corner-br" - } ); - - }()); - - - - var extPagination = DataTable.ext.pager; - - function _numbers ( page, pages ) { - var - numbers = [], - buttons = extPagination.numbers_length, - half = Math.floor( buttons / 2 ), - i = 1; - - if ( pages <= buttons ) { - numbers = _range( 0, pages ); - } - else if ( page <= half ) { - numbers = _range( 0, buttons-2 ); - numbers.push( 'ellipsis' ); - numbers.push( pages-1 ); - } - else if ( page >= pages - 1 - half ) { - numbers = _range( pages-(buttons-2), pages ); - numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6 - numbers.splice( 0, 0, 0 ); - } - else { - numbers = _range( page-half+2, page+half-1 ); - numbers.push( 'ellipsis' ); - numbers.push( pages-1 ); - numbers.splice( 0, 0, 'ellipsis' ); - numbers.splice( 0, 0, 0 ); - } - - numbers.DT_el = 'span'; - return numbers; - } - - - $.extend( extPagination, { - simple: function ( page, pages ) { - return [ 'previous', 'next' ]; - }, - - full: function ( page, pages ) { - return [ 'first', 'previous', 'next', 'last' ]; - }, - - numbers: function ( page, pages ) { - return [ _numbers(page, pages) ]; - }, - - simple_numbers: function ( page, pages ) { - return [ 'previous', _numbers(page, pages), 'next' ]; - }, - - full_numbers: function ( page, pages ) { - return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ]; - }, - - // For testing and plug-ins to use - _numbers: _numbers, - - // Number of number buttons (including ellipsis) to show. _Must be odd!_ - numbers_length: 7 - } ); - - - $.extend( true, DataTable.ext.renderer, { - pageButton: { - _: function ( settings, host, idx, buttons, page, pages ) { - var classes = settings.oClasses; - var lang = settings.oLanguage.oPaginate; - var aria = settings.oLanguage.oAria.paginate || {}; - var btnDisplay, btnClass, counter=0; - - var attach = function( container, buttons ) { - var i, ien, node, button; - var clickHandler = function ( e ) { - _fnPageChange( settings, e.data.action, true ); - }; - - for ( i=0, ien=buttons.length ; i' ) - .appendTo( container ); - attach( inner, button ); - } - else { - btnDisplay = null; - btnClass = ''; - - switch ( button ) { - case 'ellipsis': - container.append(''); - break; - - case 'first': - btnDisplay = lang.sFirst; - btnClass = button + (page > 0 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - case 'previous': - btnDisplay = lang.sPrevious; - btnClass = button + (page > 0 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - case 'next': - btnDisplay = lang.sNext; - btnClass = button + (page < pages-1 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - case 'last': - btnDisplay = lang.sLast; - btnClass = button + (page < pages-1 ? - '' : ' '+classes.sPageButtonDisabled); - break; - - default: - btnDisplay = button + 1; - btnClass = page === button ? - classes.sPageButtonActive : ''; - break; - } - - if ( btnDisplay !== null ) { - node = $('', { - 'class': classes.sPageButton+' '+btnClass, - 'aria-controls': settings.sTableId, - 'aria-label': aria[ button ], - 'data-dt-idx': counter, - 'tabindex': settings.iTabIndex, - 'id': idx === 0 && typeof button === 'string' ? - settings.sTableId +'_'+ button : - null - } ) - .html( btnDisplay ) - .appendTo( container ); - - _fnBindAction( - node, {action: button}, clickHandler - ); - - counter++; - } - } - } - }; - - // IE9 throws an 'unknown error' if document.activeElement is used - // inside an iframe or frame. Try / catch the error. Not good for - // accessibility, but neither are frames. - var activeEl; - - try { - // Because this approach is destroying and recreating the paging - // elements, focus is lost on the select button which is bad for - // accessibility. So we want to restore focus once the draw has - // completed - activeEl = $(host).find(document.activeElement).data('dt-idx'); - } - catch (e) {} - - attach( $(host).empty(), buttons ); - - if ( activeEl ) { - $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); - } - } - } - } ); - - - - // Built in type detection. See model.ext.aTypes for information about - // what is required from this methods. - $.extend( DataTable.ext.type.detect, [ - // Plain numbers - first since V8 detects some plain numbers as dates - // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...). - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _isNumber( d, decimal ) ? 'num'+decimal : null; - }, - - // Dates (only those recognised by the browser's Date.parse) - function ( d, settings ) - { - // V8 will remove any unknown characters at the start and end of the - // expression, leading to false matches such as `$245.12` or `10%` being - // a valid date. See forum thread 18941 for detail. - if ( d && !(d instanceof Date) && ( ! _re_date_start.test(d) || ! _re_date_end.test(d) ) ) { - return null; - } - var parsed = Date.parse(d); - return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null; - }, - - // Formatted numbers - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null; - }, - - // HTML numeric - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null; - }, - - // HTML numeric, formatted - function ( d, settings ) - { - var decimal = settings.oLanguage.sDecimal; - return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null; - }, - - // HTML (this is strict checking - there must be html) - function ( d, settings ) - { - return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ? - 'html' : null; - } - ] ); - - - - // Filter formatting functions. See model.ext.ofnSearch for information about - // what is required from these methods. - // - // Note that additional search methods are added for the html numbers and - // html formatted numbers by `_addNumericSort()` when we know what the decimal - // place is - - - $.extend( DataTable.ext.type.search, { - html: function ( data ) { - return _empty(data) ? - data : - typeof data === 'string' ? - data - .replace( _re_new_lines, " " ) - .replace( _re_html, "" ) : - ''; - }, - - string: function ( data ) { - return _empty(data) ? - data : - typeof data === 'string' ? - data.replace( _re_new_lines, " " ) : - data; - } - } ); - - - - var __numericReplace = function ( d, decimalPlace, re1, re2 ) { - if ( d !== 0 && (!d || d === '-') ) { - return -Infinity; - } - - // If a decimal place other than `.` is used, it needs to be given to the - // function so we can detect it and replace with a `.` which is the only - // decimal place Javascript recognises - it is not locale aware. - if ( decimalPlace ) { - d = _numToDecimal( d, decimalPlace ); - } - - if ( d.replace ) { - if ( re1 ) { - d = d.replace( re1, '' ); - } - - if ( re2 ) { - d = d.replace( re2, '' ); - } - } - - return d * 1; - }; - - - // Add the numeric 'deformatting' functions for sorting and search. This is done - // in a function to provide an easy ability for the language options to add - // additional methods if a non-period decimal place is used. - function _addNumericSort ( decimalPlace ) { - $.each( - { - // Plain numbers - "num": function ( d ) { - return __numericReplace( d, decimalPlace ); - }, - - // Formatted numbers - "num-fmt": function ( d ) { - return __numericReplace( d, decimalPlace, _re_formatted_numeric ); - }, - - // HTML numeric - "html-num": function ( d ) { - return __numericReplace( d, decimalPlace, _re_html ); - }, - - // HTML numeric, formatted - "html-num-fmt": function ( d ) { - return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric ); - } - }, - function ( key, fn ) { - // Add the ordering method - _ext.type.order[ key+decimalPlace+'-pre' ] = fn; - - // For HTML types add a search formatter that will strip the HTML - if ( key.match(/^html\-/) ) { - _ext.type.search[ key+decimalPlace ] = _ext.type.search.html; - } - } - ); - } - - - // Default sort methods - $.extend( _ext.type.order, { - // Dates - "date-pre": function ( d ) { - return Date.parse( d ) || 0; - }, - - // html - "html-pre": function ( a ) { - return _empty(a) ? - '' : - a.replace ? - a.replace( /<.*?>/g, "" ).toLowerCase() : - a+''; - }, - - // string - "string-pre": function ( a ) { - // This is a little complex, but faster than always calling toString, - // http://jsperf.com/tostring-v-check - return _empty(a) ? - '' : - typeof a === 'string' ? - a.toLowerCase() : - ! a.toString ? - '' : - a.toString(); - }, - - // string-asc and -desc are retained only for compatibility with the old - // sort methods - "string-asc": function ( x, y ) { - return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - }, - - "string-desc": function ( x, y ) { - return ((x < y) ? 1 : ((x > y) ? -1 : 0)); - } - } ); - - - // Numeric sorting types - order doesn't matter here - _addNumericSort( '' ); - - - $.extend( true, DataTable.ext.renderer, { - header: { - _: function ( settings, cell, column, classes ) { - // No additional mark-up required - // Attach a sort listener to update on sort - note that using the - // `DT` namespace will allow the event to be removed automatically - // on destroy, while the `dt` namespaced event is the one we are - // listening for - $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { - if ( settings !== ctx ) { // need to check this this is the host - return; // table, not a nested one - } - - var colIdx = column.idx; - - cell - .removeClass( - column.sSortingClass +' '+ - classes.sSortAsc +' '+ - classes.sSortDesc - ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortAsc : columns[ colIdx ] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - } ); - }, - - jqueryui: function ( settings, cell, column, classes ) { - $('
    ') - .addClass( classes.sSortJUIWrapper ) - .append( cell.contents() ) - .append( $('') - .addClass( classes.sSortIcon+' '+column.sSortingClassJUI ) - ) - .appendTo( cell ); - - // Attach a sort listener to update on sort - $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { - if ( settings !== ctx ) { - return; - } - - var colIdx = column.idx; - - cell - .removeClass( classes.sSortAsc +" "+classes.sSortDesc ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortAsc : columns[ colIdx ] == 'desc' ? - classes.sSortDesc : - column.sSortingClass - ); - - cell - .find( 'span.'+classes.sSortIcon ) - .removeClass( - classes.sSortJUIAsc +" "+ - classes.sSortJUIDesc +" "+ - classes.sSortJUI +" "+ - classes.sSortJUIAscAllowed +" "+ - classes.sSortJUIDescAllowed - ) - .addClass( columns[ colIdx ] == 'asc' ? - classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ? - classes.sSortJUIDesc : - column.sSortingClassJUI - ); - } ); - } - } - } ); - - /* - * Public helper functions. These aren't used internally by DataTables, or - * called by any of the options passed into DataTables, but they can be used - * externally by developers working with DataTables. They are helper functions - * to make working with DataTables a little bit easier. - */ - - /** - * Helpers for `columns.render`. - * - * The options defined here can be used with the `columns.render` initialisation - * option to provide a display renderer. The following functions are defined: - * - * * `number` - Will format numeric data (defined by `columns.data`) for - * display, retaining the original unformatted data for sorting and filtering. - * It takes 5 parameters: - * * `string` - Thousands grouping separator - * * `string` - Decimal point indicator - * * `integer` - Number of decimal points to show - * * `string` (optional) - Prefix. - * * `string` (optional) - Postfix (/suffix). - * * `text` - Escape HTML to help prevent XSS attacks. It has no optional - * parameters. - * - * @example - * // Column definition using the number renderer - * { - * data: "salary", - * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' ) - * } - * - * @namespace - */ - DataTable.render = { - number: function ( thousands, decimal, precision, prefix, postfix ) { - return { - display: function ( d ) { - if ( typeof d !== 'number' && typeof d !== 'string' ) { - return d; - } - - var negative = d < 0 ? '-' : ''; - var flo = parseFloat( d ); - - // If NaN then there isn't much formatting that we can do - just - // return immediately - if ( isNaN( flo ) ) { - return d; - } - - d = Math.abs( flo ); - - var intPart = parseInt( d, 10 ); - var floatPart = precision ? - decimal+(d - intPart).toFixed( precision ).substring( 2 ): - ''; - - return negative + (prefix||'') + - intPart.toString().replace( - /\B(?=(\d{3})+(?!\d))/g, thousands - ) + - floatPart + - (postfix||''); - } - }; - }, - - text: function () { - return { - display: function ( d ) { - return typeof d === 'string' ? - d.replace(//g, '>').replace(/"/g, '"') : - d; - } - }; - } - }; - - - /* - * This is really a good bit rubbish this method of exposing the internal methods - * publicly... - To be fixed in 2.0 using methods on the prototype - */ - - - /** - * Create a wrapper function for exporting an internal functions to an external API. - * @param {string} fn API function name - * @returns {function} wrapped function - * @memberof DataTable#internal - */ - function _fnExternApiFunc (fn) - { - return function() { - var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat( - Array.prototype.slice.call(arguments) - ); - return DataTable.ext.internal[fn].apply( this, args ); - }; - } - - - /** - * Reference to internal functions for use by plug-in developers. Note that - * these methods are references to internal functions and are considered to be - * private. If you use these methods, be aware that they are liable to change - * between versions. - * @namespace - */ - $.extend( DataTable.ext.internal, { - _fnExternApiFunc: _fnExternApiFunc, - _fnBuildAjax: _fnBuildAjax, - _fnAjaxUpdate: _fnAjaxUpdate, - _fnAjaxParameters: _fnAjaxParameters, - _fnAjaxUpdateDraw: _fnAjaxUpdateDraw, - _fnAjaxDataSrc: _fnAjaxDataSrc, - _fnAddColumn: _fnAddColumn, - _fnColumnOptions: _fnColumnOptions, - _fnAdjustColumnSizing: _fnAdjustColumnSizing, - _fnVisibleToColumnIndex: _fnVisibleToColumnIndex, - _fnColumnIndexToVisible: _fnColumnIndexToVisible, - _fnVisbleColumns: _fnVisbleColumns, - _fnGetColumns: _fnGetColumns, - _fnColumnTypes: _fnColumnTypes, - _fnApplyColumnDefs: _fnApplyColumnDefs, - _fnHungarianMap: _fnHungarianMap, - _fnCamelToHungarian: _fnCamelToHungarian, - _fnLanguageCompat: _fnLanguageCompat, - _fnBrowserDetect: _fnBrowserDetect, - _fnAddData: _fnAddData, - _fnAddTr: _fnAddTr, - _fnNodeToDataIndex: _fnNodeToDataIndex, - _fnNodeToColumnIndex: _fnNodeToColumnIndex, - _fnGetCellData: _fnGetCellData, - _fnSetCellData: _fnSetCellData, - _fnSplitObjNotation: _fnSplitObjNotation, - _fnGetObjectDataFn: _fnGetObjectDataFn, - _fnSetObjectDataFn: _fnSetObjectDataFn, - _fnGetDataMaster: _fnGetDataMaster, - _fnClearTable: _fnClearTable, - _fnDeleteIndex: _fnDeleteIndex, - _fnInvalidate: _fnInvalidate, - _fnGetRowElements: _fnGetRowElements, - _fnCreateTr: _fnCreateTr, - _fnBuildHead: _fnBuildHead, - _fnDrawHead: _fnDrawHead, - _fnDraw: _fnDraw, - _fnReDraw: _fnReDraw, - _fnAddOptionsHtml: _fnAddOptionsHtml, - _fnDetectHeader: _fnDetectHeader, - _fnGetUniqueThs: _fnGetUniqueThs, - _fnFeatureHtmlFilter: _fnFeatureHtmlFilter, - _fnFilterComplete: _fnFilterComplete, - _fnFilterCustom: _fnFilterCustom, - _fnFilterColumn: _fnFilterColumn, - _fnFilter: _fnFilter, - _fnFilterCreateSearch: _fnFilterCreateSearch, - _fnEscapeRegex: _fnEscapeRegex, - _fnFilterData: _fnFilterData, - _fnFeatureHtmlInfo: _fnFeatureHtmlInfo, - _fnUpdateInfo: _fnUpdateInfo, - _fnInfoMacros: _fnInfoMacros, - _fnInitialise: _fnInitialise, - _fnInitComplete: _fnInitComplete, - _fnLengthChange: _fnLengthChange, - _fnFeatureHtmlLength: _fnFeatureHtmlLength, - _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate, - _fnPageChange: _fnPageChange, - _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing, - _fnProcessingDisplay: _fnProcessingDisplay, - _fnFeatureHtmlTable: _fnFeatureHtmlTable, - _fnScrollDraw: _fnScrollDraw, - _fnApplyToChildren: _fnApplyToChildren, - _fnCalculateColumnWidths: _fnCalculateColumnWidths, - _fnThrottle: _fnThrottle, - _fnConvertToWidth: _fnConvertToWidth, - _fnGetWidestNode: _fnGetWidestNode, - _fnGetMaxLenString: _fnGetMaxLenString, - _fnStringToCss: _fnStringToCss, - _fnSortFlatten: _fnSortFlatten, - _fnSort: _fnSort, - _fnSortAria: _fnSortAria, - _fnSortListener: _fnSortListener, - _fnSortAttachListener: _fnSortAttachListener, - _fnSortingClasses: _fnSortingClasses, - _fnSortData: _fnSortData, - _fnSaveState: _fnSaveState, - _fnLoadState: _fnLoadState, - _fnSettingsFromNode: _fnSettingsFromNode, - _fnLog: _fnLog, - _fnMap: _fnMap, - _fnBindAction: _fnBindAction, - _fnCallbackReg: _fnCallbackReg, - _fnCallbackFire: _fnCallbackFire, - _fnLengthOverflow: _fnLengthOverflow, - _fnRenderer: _fnRenderer, - _fnDataSource: _fnDataSource, - _fnRowAttributes: _fnRowAttributes, - _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant - // in 1.10, so this dead-end function is - // added to prevent errors - } ); - - - // jQuery access - $.fn.dataTable = DataTable; - - // Provide access to the host jQuery object (circular reference) - DataTable.$ = $; - - // Legacy aliases - $.fn.dataTableSettings = DataTable.settings; - $.fn.dataTableExt = DataTable.ext; - - // With a capital `D` we return a DataTables API instance rather than a - // jQuery object - $.fn.DataTable = function ( opts ) { - return $(this).dataTable( opts ).api(); - }; - - // All properties that are available to $.fn.dataTable should also be - // available on $.fn.DataTable - $.each( DataTable, function ( prop, val ) { - $.fn.DataTable[ prop ] = val; - } ); - - - // Information about events fired by DataTables - for documentation. - /** - * Draw event, fired whenever the table is redrawn on the page, at the same - * point as fnDrawCallback. This may be useful for binding events or - * performing calculations when the table is altered at all. - * @name DataTable#draw.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Search event, fired when the searching applied to the table (using the - * built-in global search, or column filters) is altered. - * @name DataTable#search.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Page change event, fired when the paging of the table is altered. - * @name DataTable#page.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * Order event, fired when the ordering applied to the table is altered. - * @name DataTable#order.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - */ - - /** - * DataTables initialisation complete event, fired when the table is fully - * drawn, including Ajax data loaded, if Ajax data is required. - * @name DataTable#init.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The JSON object request from the server - only - * present if client-side Ajax sourced data is used - */ - - /** - * State save event, fired when the table has changed state a new state save - * is required. This event allows modification of the state saving object - * prior to actually doing the save, including addition or other state - * properties (for plug-ins) or modification of a DataTables core property. - * @name DataTable#stateSaveParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The state information to be saved - */ - - /** - * State load event, fired when the table is loading state from the stored - * data, but prior to the settings object being modified by the saved state - * - allowing modification of the saved state is required or loading of - * state for a plug-in. - * @name DataTable#stateLoadParams.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * State loaded event, fired when state has been loaded from stored data and - * the settings object has been modified by the loaded data. - * @name DataTable#stateLoaded.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {object} json The saved state information - */ - - /** - * Processing event, fired when DataTables is doing some kind of processing - * (be it, order, searcg or anything else). It can be used to indicate to - * the end user that there is something happening, or that something has - * finished. - * @name DataTable#processing.dt - * @event - * @param {event} e jQuery event object - * @param {object} oSettings DataTables settings object - * @param {boolean} bShow Flag for if DataTables is doing processing or not - */ - - /** - * Ajax (XHR) event, fired whenever an Ajax request is completed from a - * request to made to the server for new data. This event is called before - * DataTables processed the returned data, so it can also be used to pre- - * process the data returned from the server, if needed. - * - * Note that this trigger is called in `fnServerData`, if you override - * `fnServerData` and which to use this event, you need to trigger it in you - * success function. - * @name DataTable#xhr.dt - * @event - * @param {event} e jQuery event object - * @param {object} o DataTables settings object {@link DataTable.models.oSettings} - * @param {object} json JSON returned from the server - * - * @example - * // Use a custom property returned from the server in another DOM element - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * $('#status').html( json.status ); - * } ); - * - * @example - * // Pre-process the data returned from the server - * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { - * for ( var i=0, ien=json.aaData.length ; i"); } - htAuditTrail = + htAuditTrail = ('
    ' + innerTab + '
    ProductColorSizePriceQuantityDate Modified
    '); @@ -80,7 +80,7 @@ $(document).ready(function () { alert("Product is successfully restored."); }, false); - + }) }); @@ -116,7 +116,7 @@ $(function () { $("span#snapshot").text(''); } else { $("span#snapshot").text("("+d.toDateString()+")"); - $("#example").DataTable().ajax.url(jqdtAjaxSource + "?date=" + d.toISOString()).load(); + $("#example").DataTable().ajax.url(jqdtAjaxSource + "?date=" + d.toISOString()).load(); } } }); diff --git a/samples/features/unicode/CheckStorageReq_CurrDB.sql b/samples/features/unicode/CheckStorageReq_CurrDB.sql index 908c0415..71e5944c 100644 --- a/samples/features/unicode/CheckStorageReq_CurrDB.sql +++ b/samples/features/unicode/CheckStorageReq_CurrDB.sql @@ -2,10 +2,10 @@ DROP TABLE IF EXISTS #tmpObjects; -CREATE TABLE #tmpObjects (ObjectName sysname, - ColumnName sysname, - ColumnType sysname, - DefinedTypeSize smallint, +CREATE TABLE #tmpObjects (ObjectName sysname, + ColumnName sysname, + ColumnType sysname, + DefinedTypeSize smallint, ActualMaxBytes smallint, UTF8BytesNeeded smallint, [isdone] bit, @@ -20,7 +20,7 @@ FROM sys.columns AS SC INNER JOIN sys.types AS ST ON SC.user_type_id = ST.user_type_id INNER JOIN sys.tables AS STbl ON STbl.[object_id] = SC.[object_id] INNER JOIN sys.schemas AS SS ON STbl.[schema_id] = SS.[schema_id] -WHERE STbl.[type] = 'U' +WHERE STbl.[type] = 'U' AND STbl.is_ms_shipped = 0 --AND STbl.temporal_type IN (0,1) AND ST.system_type_id IN (167, 175, 231, 239) @@ -31,18 +31,18 @@ WHERE STbl.[type] = 'U' DECLARE @OName sysname, @CName sysname, @CurrBytes smallint, @UTF8Bytes smallint, @sqlcmd NVARCHAR(4000), @params NVARCHAR(60), @cnt int, @maxcnt int SELECT @maxcnt = COUNT(*) FROM #tmpObjects; -SET @cnt = 0 +SET @cnt = 0 SET @params = '@CurrBytesOut smallint OUTPUT, @UTF8BytesOut smallint OUTPUT' WHILE @cnt < @maxcnt BEGIN SELECT TOP 1 @OName = ObjectName, @CName = ColumnName FROM #tmpObjects WHERE isdone = 0 - SELECT @sqlcmd = 'SELECT @CurrBytesOut = MAX(DATALENGTH(' + @CName + ')), @UTF8BytesOut = MAX(DATALENGTH(CAST(' + @CName + ' AS VARCHAR(4000)) COLLATE Latin1_General_100_CI_AI_SC_UTF8)) FROM ' + @OName + ' WITH (NOLOCK)'; + SELECT @sqlcmd = 'SELECT @CurrBytesOut = MAX(DATALENGTH(' + @CName + ')), @UTF8BytesOut = MAX(DATALENGTH(CAST(' + @CName + ' AS VARCHAR(4000)) COLLATE Latin1_General_100_CI_AI_SC_UTF8)) FROM ' + @OName + ' WITH (NOLOCK)'; EXEC sp_executesql @sqlcmd, @params, @CurrBytesOut = @CurrBytes OUTPUT, @UTF8BytesOut = @UTF8Bytes OUTPUT UPDATE #tmpObjects - SET ActualMaxBytes = @CurrBytes, UTF8BytesNeeded = @UTF8Bytes, isdone = 1 + SET ActualMaxBytes = @CurrBytes, UTF8BytesNeeded = @UTF8Bytes, isdone = 1 WHERE ObjectName = @OName AND ColumnName = @CName SET @cnt = @cnt + 1 diff --git a/samples/features/unicode/DataType_WesternMyth.sql b/samples/features/unicode/DataType_WesternMyth.sql index cfd1a3cb..1c15c96a 100644 --- a/samples/features/unicode/DataType_WesternMyth.sql +++ b/samples/features/unicode/DataType_WesternMyth.sql @@ -15,14 +15,14 @@ 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); -INSERT INTO t1 VALUES (N'MyString', N'MyString') -SELECT LEN(c1) AS [varchar LEN], +CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, + c2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); +INSERT INTO t1 VALUES (N'MyString', N'MyString') +SELECT LEN(c1) AS [varchar LEN], DATALENGTH(c1) AS [varchar DATALENGTH], c1 -FROM t1; -SELECT LEN(c2) AS [nvarchar LEN], - DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 +FROM t1; +SELECT LEN(c2) AS [nvarchar LEN], + DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 FROM t1; GO @@ -38,21 +38,21 @@ GO -- Test Chinese character strings with Latin collation 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); -INSERT INTO t1 VALUES (N'æ•æ·çš„æ£•色ç‹ç‹¸è·³', N'æ•æ·çš„æ£•色ç‹ç‹¸è·³') -SELECT LEN(c1) AS [varchar LEN], +CREATE TABLE t1 (c1 varchar(24) COLLATE Latin1_General_100_CI_AI, + c2 nvarchar(8) COLLATE Latin1_General_100_CI_AI); +INSERT INTO t1 VALUES (N'æ•æ·çš„æ£•色ç‹ç‹¸è·³', N'æ•æ·çš„æ£•色ç‹ç‹¸è·³') +SELECT LEN(c1) AS [varchar LEN], DATALENGTH(c1) AS [varchar DATALENGTH], c1 -FROM t1; -SELECT LEN(c2) AS [nvarchar LEN], - DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 +FROM t1; +SELECT LEN(c2) AS [nvarchar LEN], + DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 FROM t1; GO -- uh-oh data loss on the varchar example. Why? --- varchar is bound to code page enconding, +-- 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) @@ -72,7 +72,7 @@ SELECT UNICODE(N'æ·' COLLATE Latin1_General_100_CI_AI), NCHAR(25463) -- Irrespective of collation now. With a Unicode capable data type, --- collation only sets linguistic algorithms +-- collation only sets linguistic algorithms -- (Compare = sort; Case sensitivity = Upper/Lowercase) SELECT UNICODE(N'æ•' COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI), NCHAR(25935) SELECT UNICODE(N'æ·' COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI), NCHAR(25463) @@ -81,35 +81,35 @@ SELECT UNICODE(N'æ·' COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI), NCHAR -- Now test Chinese character strings with Chinese collation DROP TABLE IF EXISTS t2; -CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI, - c2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI); -INSERT INTO t2 VALUES (N'æ•æ·çš„æ£•色ç‹ç‹¸è·³', N'æ•æ·çš„æ£•色ç‹ç‹¸è·³') -SELECT LEN(c1) AS [varchar LEN], +CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI, + c2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI); +INSERT INTO t2 VALUES (N'æ•æ·çš„æ£•色ç‹ç‹¸è·³', N'æ•æ·çš„æ£•色ç‹ç‹¸è·³') +SELECT LEN(c1) AS [varchar LEN], DATALENGTH(c1) AS [varchar DATALENGTH], c1 -FROM t2; -SELECT LEN(c2) AS [nvarchar LEN], - DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 +FROM t2; +SELECT LEN(c2) AS [nvarchar LEN], + DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 FROM t2; GO -- Now the varchar example is correct. But there's 2 bytes per character?... -- Myth buster: code page defines string length for varchar. It's not always 1 byte per character. --- Wasn't East-Asian 3 bytes? Yes, but under Chinese collation code page, +-- Wasn't East-Asian 3 bytes? Yes, but under Chinese collation code page, -- they are encoded using 2 bytes just like UCS-2/UTF-16 -- Test with Supplementary Characters (4 bytes) and using SC DROP TABLE IF EXISTS t2; -CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, - c2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); -INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') -SELECT LEN(c1) AS [varchar LEN], +CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, + c2 nvarchar(8) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); +INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') +SELECT LEN(c1) AS [varchar LEN], DATALENGTH(c1) AS [varchar DATALENGTH], c1 -FROM t2; -SELECT LEN(c2) AS [nvarchar LEN], - DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 +FROM t2; +SELECT LEN(c2) AS [nvarchar LEN], + DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 FROM t2; GO @@ -117,28 +117,28 @@ GO -- Fix the error DROP TABLE IF EXISTS t2; -CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, - c2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); -INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') -SELECT LEN(c1) AS [varchar LEN], +CREATE TABLE t2 (c1 varchar(24) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC, + c2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); +INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') +SELECT LEN(c1) AS [varchar LEN], DATALENGTH(c1) AS [varchar DATALENGTH], c1 -FROM t2; -SELECT LEN(c2) AS [nvarchar LEN], - DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 +FROM t2; +SELECT LEN(c2) AS [nvarchar LEN], + DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 FROM t2; GO --- Varchar still doesn't encode? +-- Varchar still doesn't encode? DROP TABLE IF EXISTS t2; -CREATE TABLE t2 (c1 varchar(48) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC_UTF8, - c2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); -INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') -SELECT LEN(c1) AS [varchar LEN], +CREATE TABLE t2 (c1 varchar(48) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC_UTF8, + c2 nvarchar(16) COLLATE Chinese_Traditional_Stroke_Order_100_CI_AI_SC); +INSERT INTO t2 VALUES (N'👶👦👧👨👩👴👵👨', N'👶👦👧👨👩👴👵👨') +SELECT LEN(c1) AS [varchar LEN], DATALENGTH(c1) AS [varchar DATALENGTH], c1 -FROM t2; -SELECT LEN(c2) AS [nvarchar LEN], - DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 +FROM t2; +SELECT LEN(c2) AS [nvarchar LEN], + DATALENGTH(c2) AS [nvarchar DATALENGTH], c2 FROM t2; GO @@ -147,11 +147,11 @@ GO -- What if I needed all these in one database? Easy, I could just use nvarchar. DROP TABLE IF EXISTS t3; -CREATE TABLE t3 (c1 nvarchar(110) COLLATE Latin1_General_100_CI_AI_SC); -INSERT INTO t3 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAsciiæ•æ·çš„æ£•色ç‹ç‹¸è·³ðŸ‘¶ðŸ‘¦') -SELECT LEN(c1) AS [nvarchar UTF16 LEN], +CREATE TABLE t3 (c1 nvarchar(110) COLLATE Latin1_General_100_CI_AI_SC); +INSERT INTO t3 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAsciiæ•æ·çš„æ£•色ç‹ç‹¸è·³ðŸ‘¶ðŸ‘¦') +SELECT LEN(c1) AS [nvarchar UTF16 LEN], DATALENGTH(c1) AS [nvarchar UTF16 DATALENGTH], c1 -FROM t3; +FROM t3; GO @@ -159,20 +159,20 @@ 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_UTF8); -INSERT INTO t4 VALUES (N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAsciiæ•æ·çš„æ£•色ç‹ç‹¸è·³ðŸ‘¶ðŸ‘¦') -SELECT LEN(c1) AS [varchar UTF8 LEN], +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 UTF8 LEN], DATALENGTH(c1) AS [varchar UTF8 DATALENGTH], c1 -FROM t4; +FROM t4; GO -- Where are the savings? -SELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], - DATALENGTH(N'æ•æ·çš„æ£•色ç‹ç‹¸è·³') AS [Chinese_UTF16_2bytes], +SELECT DATALENGTH(N'MyStringThequickbrownfoxjumpsoverthelazydogIsLatinAscii') AS [Latin_UTF16_2bytes], + DATALENGTH(N'æ•æ·çš„æ£•色ç‹ç‹¸è·³') AS [Chinese_UTF16_2bytes], 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], +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] GO \ No newline at end of file diff --git a/samples/features/unicode/Functional.sql b/samples/features/unicode/Functional.sql index 1e4b23a9..1baf75bb 100644 --- a/samples/features/unicode/Functional.sql +++ b/samples/features/unicode/Functional.sql @@ -27,11 +27,11 @@ CREATE TABLE MyUtf8Table (datakind VARCHAR(100), data VARCHAR(8000) COLLATE Lati GO INSERT INTO MyUtf8Table -VALUES ('ASCII - 1 byte per character', N'Thequickbrownfoxjumpsoverthelazydog'), - ('Cyrillic - 2 bytes per character', N'БыÑтраÑкоричневаÑлиÑапрыгаетчерезленивуюÑобаку'), - ('Far East - 3 bytes per character', N'æ•æ·çš„æ£•色ç‹ç‹¸è·³è¿‡äº†æ‡’ç‹—'), - ('Emojis - 4 bytes per character', N'👶👦👧👨👩👴👵👨👩👨👩👨👩👨👩'), - ('Emojis with Variation Selector - 6 bytes per glyph', N'âš•ï¸âš–ï¸â†”︎↕︎↖︎↗︎↘︎↙︎↩︎↪︎↔ï¸â†•ï¸â†–ï¸â†—ï¸â†˜ï¸â†™ï¸â†©ï¸â†ªï¸'), +VALUES ('ASCII - 1 byte per character', N'Thequickbrownfoxjumpsoverthelazydog'), + ('Cyrillic - 2 bytes per character', N'БыÑтраÑкоричневаÑлиÑапрыгаетчерезленивуюÑобаку'), + ('Far East - 3 bytes per character', N'æ•æ·çš„æ£•色ç‹ç‹¸è·³è¿‡äº†æ‡’ç‹—'), + ('Emojis - 4 bytes per character', N'👶👦👧👨👩👴👵👨👩👨👩👨👩👨👩'), + ('Emojis with Variation Selector - 6 bytes per glyph', N'âš•ï¸âš–ï¸â†”︎↕︎↖︎↗︎↘︎↙︎↩︎↪︎↔ï¸â†•ï¸â†–ï¸â†—ï¸â†˜ï¸â†™ï¸â†©ï¸â†ªï¸'), ('Ashi with Supplementary Variation Selector - 7 bytes per glyph', N'芦󠄀芦ó „芦󠄂芦󠄃芦󠄄芦󠄅芦󠄆芦󠄇芦󠄈芦󠄉芦󠄃芦󠄂芦ó „芦󠄀芦ó „芦󠄂芦󠄃芦󠄄芦󠄈芦󠄉'); GO @@ -46,9 +46,9 @@ GO -- -- Create a database collated with UTF-8. --- This is to demonstrate that now string literals can be used without N'', +-- This is to demonstrate that now string literals can be used without N'', -- as string literals are collated with the database collation, and can hold any characters. --- +-- CREATE DATABASE MyUtf8Database COLLATE Lithuanian_100_CS_AI_WS_SC_UTF8; GO @@ -59,11 +59,11 @@ CREATE TABLE MyTableWithInheritedCollation (datakind VARCHAR(100), data VARCHAR( GO INSERT INTO MyTableWithInheritedCollation -VALUES ('ASCII - 1 byte per character', 'Thequickbrownfoxjumpsoverthelazydog'), - ('Cyrillic - 2 bytes per character', 'БыÑтраÑкоричневаÑлиÑапрыгаетчерезленивуюÑобаку'), - ('Far East - 3 bytes per character', 'æ•æ·çš„æ£•色ç‹ç‹¸è·³è¿‡äº†æ‡’ç‹—'), - ('Emojis - 4 bytes per character', '👶👦👧👨👩👴👵👨👩👨👩👨👩👨👩'), - ('Emojis with Variation Selector - 6 bytes per glyph', 'âš•ï¸âš–ï¸â†”︎↕︎↖︎↗︎↘︎↙︎↩︎↪︎↔ï¸â†•ï¸â†–ï¸â†—ï¸â†˜ï¸â†™ï¸â†©ï¸â†ªï¸'), +VALUES ('ASCII - 1 byte per character', 'Thequickbrownfoxjumpsoverthelazydog'), + ('Cyrillic - 2 bytes per character', 'БыÑтраÑкоричневаÑлиÑапрыгаетчерезленивуюÑобаку'), + ('Far East - 3 bytes per character', 'æ•æ·çš„æ£•色ç‹ç‹¸è·³è¿‡äº†æ‡’ç‹—'), + ('Emojis - 4 bytes per character', '👶👦👧👨👩👴👵👨👩👨👩👨👩👨👩'), + ('Emojis with Variation Selector - 6 bytes per glyph', 'âš•ï¸âš–ï¸â†”︎↕︎↖︎↗︎↘︎↙︎↩︎↪︎↔ï¸â†•ï¸â†–ï¸â†—ï¸â†˜ï¸â†™ï¸â†©ï¸â†ªï¸'), ('Ashi with Supplementary Variation Selector - 7 bytes per glyph', '芦󠄀芦ó „芦󠄂芦󠄃芦󠄄芦󠄅芦󠄆芦󠄇芦󠄈芦󠄉芦󠄃芦󠄂芦ó „芦󠄀芦ó „芦󠄂芦󠄃芦󠄄芦󠄈芦󠄉'); GO @@ -116,7 +116,7 @@ GO CREATE user ToBeKeptAway without LOGIN; GO -CREATE TABLE KeepAway (top_secret_data VARCHAR(8000) COLLATE Mapudungan_100_CS_AS_SC_UTF8 masked +CREATE TABLE KeepAway (top_secret_data VARCHAR(8000) COLLATE Mapudungan_100_CS_AS_SC_UTF8 masked WITH (FUNCTION = 'partial(2, "💩💩💩💩💩", 2)')); GO @@ -140,8 +140,8 @@ GO ---------------------------- /* -See how many bytes each character requires for both UTF-8 and UTF-16 encodings. -Returns all 65,536 BMP (Base Multilingual Plan) characters (which is also the entire UCS-2 character set), and 3 Supplementary Characters. +See how many bytes each character requires for both UTF-8 and UTF-16 encodings. +Returns all 65,536 BMP (Base Multilingual Plan) characters (which is also the entire UCS-2 character set), and 3 Supplementary Characters. Since all Supplementary Characters are 4 bytes in both encodings, there is no need to return more of them, but we do need to see a few of them to see that they are: a) all 4 bytes b) encoded slightly differently diff --git a/samples/features/unicode/Perf_Latin.sql b/samples/features/unicode/Perf_Latin.sql index 90b2a5aa..62494b8c 100644 --- a/samples/features/unicode/Perf_Latin.sql +++ b/samples/features/unicode/Perf_Latin.sql @@ -44,7 +44,7 @@ DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF16 (col1) + INSERT INTO dbo.Inserts_UTF16 (col1) SELECT REPLICATE(CONCAT( CHAR(FLOOR(65 + (RAND() * 25))), CHAR(FLOOR(65 + (RAND() * 25))), @@ -69,7 +69,7 @@ DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF8 (col1) + INSERT INTO dbo.Inserts_UTF8 (col1) SELECT REPLICATE(CONCAT( CHAR(FLOOR(65 + (RAND() * 25))), CHAR(FLOOR(65 + (RAND() * 25))), @@ -95,7 +95,7 @@ DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF16_Compressed (col1) + INSERT INTO dbo.Inserts_UTF16_Compressed (col1) SELECT REPLICATE(CONCAT( CHAR(FLOOR(65 + (RAND() * 25))), CHAR(FLOOR(65 + (RAND() * 25))), @@ -120,7 +120,7 @@ DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF8_Compressed (col1) + INSERT INTO dbo.Inserts_UTF8_Compressed (col1) SELECT REPLICATE(CONCAT( CHAR(FLOOR(65 + (RAND() * 25))), CHAR(FLOOR(65 + (RAND() * 25))), @@ -178,7 +178,7 @@ DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF16 (col1) + INSERT INTO dbo.Inserts_UTF16 (col1) SELECT REPLICATE(CONCAT( CHAR(FLOOR(65 + (RAND() * 25))), CHAR(FLOOR(65 + (RAND() * 25))), @@ -198,21 +198,21 @@ GO -- UTF8 SET NOCOUNT ON; BEGIN TRAN -INSERT INTO dbo.Inserts_UTF8 (col1) +INSERT INTO dbo.Inserts_UTF8 (col1) SELECT col1 FROM dbo.Inserts_UTF16 COMMIT GO -- UTF16 Compressed SET NOCOUNT ON; BEGIN TRAN -INSERT INTO dbo.Inserts_UTF16_Compressed (col1) +INSERT INTO dbo.Inserts_UTF16_Compressed (col1) SELECT col1 FROM dbo.Inserts_UTF16 COMMIT GO -- UTF8 Compressed SET NOCOUNT ON; BEGIN TRAN -INSERT INTO dbo.Inserts_UTF8_Compressed (col1) +INSERT INTO dbo.Inserts_UTF8_Compressed (col1) SELECT col1 FROM dbo.Inserts_UTF16 COMMIT GO @@ -227,7 +227,7 @@ FROM Inserts_UTF8 GO -- Check table sizes --- Highlights: UTF8 uncompressed is close to UTF16 compressed. +-- Highlights: UTF8 uncompressed is close to UTF16 compressed. -- UTF8 compressed doesn't get much further as expected. SELECT OBJECT_NAME(p.OBJECT_ID) AS TableName, p.ROWS AS NumRows, a.used_pages, a.total_pages, @@ -246,14 +246,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 171 ms +CPU 171 ms Elapsed 1982 ms Reads 14893 + 14523 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF16 @@ -265,14 +265,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 266 ms +CPU 266 ms Elapsed 703 ms Reads 8787 + 8365 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF8 -- WHERE ID BETWEEN 5000 AND 12500 @@ -283,14 +283,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 423 ms +CPU 423 ms Elapsed 662 ms Reads 8367 + 7964 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF16_Compressed -- WHERE ID BETWEEN 5000 AND 12500 @@ -301,14 +301,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 371 ms +CPU 371 ms Elapsed 664 ms Reads 8238 + 7235 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF8_Compressed -- WHERE ID BETWEEN 5000 AND 12500 diff --git a/samples/features/unicode/Perf_NonLatin.sql b/samples/features/unicode/Perf_NonLatin.sql index 54f317c0..e652e90c 100644 --- a/samples/features/unicode/Perf_NonLatin.sql +++ b/samples/features/unicode/Perf_NonLatin.sql @@ -1,5 +1,5 @@ -------------------------------------------------- --- Perf Improvements - Cyrillic - 2 Bytes per char +-- Perf Improvements - Cyrillic - 2 Bytes per char -------------------------------------------------- USE master; @@ -37,14 +37,14 @@ CREATE TABLE dbo.Inserts_UTF8_Compressed( WITH (DATA_COMPRESSION = PAGE) GO --- INSERT perf UTF16: +-- INSERT perf UTF16: SET NOCOUNT ON; BEGIN TRAN DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF16 (col1) + INSERT INTO dbo.Inserts_UTF16 (col1) SELECT REPLICATE(CONCAT( NCHAR(FLOOR(1070 + (RAND() * 45))), NCHAR(FLOOR(1070 + (RAND() * 45))), @@ -63,14 +63,14 @@ SELECT DATEDIFF(s, @start, GETDATE()) AS 'Inserts_UTF16' COMMIT GO --- INSERT perf UTF8: +-- INSERT perf UTF8: SET NOCOUNT ON; BEGIN TRAN DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF8 (col1) + INSERT INTO dbo.Inserts_UTF8 (col1) SELECT REPLICATE(CONCAT( NCHAR(FLOOR(1070 + (RAND() * 45))), NCHAR(FLOOR(1070 + (RAND() * 45))), @@ -89,14 +89,14 @@ END; SELECT DATEDIFF(s, @start, GETDATE()) AS 'Inserts_UTF8' COMMIT GO --- INSERT perf UTF16 Compressed: +-- INSERT perf UTF16 Compressed: SET NOCOUNT ON; BEGIN TRAN DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF16_Compressed (col1) + INSERT INTO dbo.Inserts_UTF16_Compressed (col1) SELECT REPLICATE(CONCAT( NCHAR(FLOOR(1070 + (RAND() * 45))), NCHAR(FLOOR(1070 + (RAND() * 45))), @@ -114,14 +114,14 @@ END; SELECT DATEDIFF(s, @start, GETDATE()) AS 'Inserts_UTF16_Compressed' COMMIT GO --- INSERT perf UTF8 Compressed: +-- INSERT perf UTF8 Compressed: SET NOCOUNT ON; BEGIN TRAN DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF8_Compressed (col1) + INSERT INTO dbo.Inserts_UTF8_Compressed (col1) SELECT REPLICATE(CONCAT( NCHAR(FLOOR(1070 + (RAND() * 45))), NCHAR(FLOOR(1070 + (RAND() * 45))), @@ -179,7 +179,7 @@ DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF16 (col1) + INSERT INTO dbo.Inserts_UTF16 (col1) SELECT REPLICATE(CONCAT( NCHAR(FLOOR(1070 + (RAND() * 45))), NCHAR(FLOOR(1070 + (RAND() * 45))), @@ -199,21 +199,21 @@ GO -- UTF8 SET NOCOUNT ON; BEGIN TRAN -INSERT INTO dbo.Inserts_UTF8 (col1) +INSERT INTO dbo.Inserts_UTF8 (col1) SELECT col1 FROM dbo.Inserts_UTF16 COMMIT GO -- UTF16 Compressed SET NOCOUNT ON; BEGIN TRAN -INSERT INTO dbo.Inserts_UTF16_Compressed (col1) +INSERT INTO dbo.Inserts_UTF16_Compressed (col1) SELECT col1 FROM dbo.Inserts_UTF16 COMMIT GO -- UTF8 Compressed SET NOCOUNT ON; BEGIN TRAN -INSERT INTO dbo.Inserts_UTF8_Compressed (col1) +INSERT INTO dbo.Inserts_UTF8_Compressed (col1) SELECT col1 FROM dbo.Inserts_UTF16 COMMIT GO @@ -248,14 +248,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 141 ms +CPU 141 ms Elapsed 646 ms Reads 7069 + 7069 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF16 @@ -266,14 +266,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 452 ms +CPU 452 ms Elapsed 252 ms Reads 7069 + 2888 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF8 WHERE col1 LIKE 'ч%' @@ -283,14 +283,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 282 ms +CPU 282 ms Elapsed 403 ms Reads 4143 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF16_Compressed WHERE col1 LIKE 'ч%' @@ -300,14 +300,14 @@ DBCC DROPCLEANBUFFERS GO /* SSMS: -CPU 674 ms +CPU 674 ms Elapsed 244 ms Reads 6601 SQLCMD: CPU ms Elapsed ms -Reads +Reads */ SELECT * FROM Inserts_UTF8_Compressed WHERE col1 LIKE 'ч%' diff --git a/samples/features/unicode/Storage.sql b/samples/features/unicode/Storage.sql index 5bd7ad14..04a1a52c 100644 --- a/samples/features/unicode/Storage.sql +++ b/samples/features/unicode/Storage.sql @@ -44,7 +44,7 @@ DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() WHILE @i < 1000000 BEGIN - INSERT INTO dbo.Inserts_UTF16 (col1) + INSERT INTO dbo.Inserts_UTF16 (col1) SELECT REPLICATE(CONCAT( CHAR(FLOOR(65 + (RAND() * 25))), CHAR(FLOOR(65 + (RAND() * 25))), @@ -67,7 +67,7 @@ SET NOCOUNT ON; BEGIN TRAN DECLARE @i int = 1, @start datetime SELECT @start = GETDATE() -INSERT INTO dbo.Inserts_UTF8 (col1) +INSERT INTO dbo.Inserts_UTF8 (col1) SELECT col1 FROM dbo.Inserts_UTF16; SELECT DATEDIFF(s, @start, GETDATE()) AS 'Inserts_UTF8' COMMIT diff --git a/samples/manage/DiscoverSql.ps1 b/samples/manage/DiscoverSql.ps1 index 2963f248..2679de2e 100644 --- a/samples/manage/DiscoverSql.ps1 +++ b/samples/manage/DiscoverSql.ps1 @@ -1,8 +1,8 @@ - + # This script checks if SQL Server is installed on Windows - - [string] $SqlInstalled = "" + + [string] $SqlInstalled = "" $regPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' if (Test-Path $regPath) { $inst = (get-itemproperty $regPath).InstalledInstances @@ -10,7 +10,7 @@ foreach ($i in $inst) { # Read registry data # - $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i + $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i $setupValues = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup") $edition = ($setupValues.Edition -split ' ')[0] $version = ($setupValues.Version) diff --git a/samples/manage/README.md b/samples/manage/README.md index 8b6072e3..0a24ac8f 100644 --- a/samples/manage/README.md +++ b/samples/manage/README.md @@ -5,15 +5,15 @@ Contains samples for managing Microsoft's SQL databases including SQL Server, Az ## Automatically Export your databases with Azure Automation This includes samples for setting up Azure Automation and exporting your databases to azure blob storage. -## 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. +## 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 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. +[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 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. +## Get started using Elastic Pools in a SaaS scenario +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. +[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 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 index b0aa6a5f..65b33f3e 100644 --- a/samples/manage/azure-arc-enabled-sql-server/README.md +++ b/samples/manage/azure-arc-enabled-sql-server/README.md @@ -18,7 +18,7 @@ Use the following steps to migrate your existing SQL Server - Azure Arc resource 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. +3. Run the script. ```console ./migrate-to-azure-arc-data.ps1 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 index a4521a1d..b5c63560 100644 --- 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 @@ -21,7 +21,7 @@ $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) { diff --git a/samples/manage/azure-arc-enabled-sql-server/modify-license-type/README.md b/samples/manage/azure-arc-enabled-sql-server/modify-license-type/README.md index 47d72528..f58a2120 100644 --- a/samples/manage/azure-arc-enabled-sql-server/modify-license-type/README.md +++ b/samples/manage/azure-arc-enabled-sql-server/modify-license-type/README.md @@ -10,19 +10,19 @@ ms.date: 2/16/2023 # Overview This script allows you to to set or change the license type on all Azure-connected SQL Servers -on a specific resource, in a single resource group, a specific subscription, a list of subscriptions or all subscriptions to which you have access. By default, it sets the specified license type value on the servers where it is undefined. But you can request to set it on all servers in the selected scope. +on a specific resource, in a single resource group, a specific subscription, a list of subscriptions or all subscriptions to which you have access. By default, it sets the specified license type value on the servers where it is undefined. But you can request to set it on all servers in the selected scope. -You can specify a single subscription to scan, or provide a list of subscriptions as a .CSV file. +You can specify a single subscription to scan, or provide a list of subscriptions as a .CSV file. If not specified, all subscriptions your role has access to are scanned. If the license type is not specified, the value "Paid" is used. # Prerequisites -- You must have at least a *Contributor* role in each subscription you modify. +- You must have at least a *Contributor* role in each subscription you modify. - The Azure extension for SQL Server is updated to version 1.1.2230.58 or newer. -# Launching the script +# Launching the script The script accepts the following command line parameters: @@ -36,7 +36,7 @@ The script accepts the following command line parameters: 1You can create a .csv file using the following command and then edit to remove the subscriptions you don't want to scan. ```PowerShell -Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation +Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation ``` ## Example 1 @@ -44,7 +44,7 @@ Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation The following command will scan all the subscriptions to which the user has access to, and set the license type to "Paid" on all servers where license type is undefined. ```PowerShell -.\modify-license-type.ps1 -LicenseType Paid +.\modify-license-type.ps1 -LicenseType Paid ``` ## Example 2 @@ -75,10 +75,10 @@ This option is recommended because Cloud shell has the Azure PowerShell modules curl https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/azure-arc-enabled-sql-server/modify-license-type/modify-license-type.ps1 -o modify-license-type.ps1 ``` -3. Run the script. +3. Run the script. ```console - .//modify-license-type.ps1 -LicenseType Paid + .//modify-license-type.ps1 -LicenseType Paid ``` > [!NOTE] @@ -96,14 +96,14 @@ Use the following steps to run the script in a PowerShell session on your PC. curl https://raw.githubusercontent.com/microsoft/sql-server-samples/master/samples/manage/azure-arc-enabled-sql-server/modify-license-type/modify-license-type.ps1 -o modify-license-type.ps1 ``` -1. Make sure the NuGet package provider is installed: +1. Make sure the NuGet package provider is installed: ```console Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - Install-packageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Scope CurrentUser -Force + Install-packageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Scope CurrentUser -Force ``` -1. Make sure the the Az module is installed. For more information, see [Install the Azure Az PowerShell module](https://learn.microsoft.com/powershell/azure/install-az-ps): +1. Make sure the the Az module is installed. For more information, see [Install the Azure Az PowerShell module](https://learn.microsoft.com/powershell/azure/install-az-ps): ```console Install-Module Az -Scope CurrentUser -Repository PSGallery -Force @@ -115,8 +115,8 @@ Use the following steps to run the script in a PowerShell session on your PC. Connect-AzAccount ``` -1. Run the script using the desired scope. +1. Run the script using the desired scope. ```console - .//modify-license-type.ps1 -LicenseType Paid + .//modify-license-type.ps1 -LicenseType Paid ``` diff --git a/samples/manage/azure-arc-enabled-sql-server/modify-license-type/modify-license-type.ps1 b/samples/manage/azure-arc-enabled-sql-server/modify-license-type/modify-license-type.ps1 index f5b7751e..185bc4c2 100644 --- a/samples/manage/azure-arc-enabled-sql-server/modify-license-type/modify-license-type.ps1 +++ b/samples/manage/azure-arc-enabled-sql-server/modify-license-type/modify-license-type.ps1 @@ -1,36 +1,36 @@ # # This script provides a scaleable solution to set or change the license type on all Azure-connected SQL Servers -# in a specific subscription, a list of subscruiptions or the entire account. By default, it sets the new license -# type value only on the servers where it is undefined. +# in a specific subscription, a list of subscruiptions or the entire account. By default, it sets the new license +# type value only on the servers where it is undefined. # -# You can specfy a single subscription to scan, or provide subscriptions as a .CSV file with the list of IDs. -# If not specified, all subscriptions your role has access to are scanned. +# You can specfy a single subscription to scan, or provide subscriptions as a .CSV file with the list of IDs. +# If not specified, all subscriptions your role has access to are scanned. # # The script accepts the following command line parameters: -# +# # -SubId [subscription_id] | [csv_file_name] (Limit scope to specific subscriptions. Accepts a .csv file with the list of subscriptions. # If not specified all subscriptions will be scanned) # -ResourceGroup [resource_goup] (Limit scope to a specific resoure group) # -MachineName [machine_name] (Limit scope to a specific machine) # -LicenseType [license_type_value] (Specific LT value) -# -All (Required. Set the new license type on all installed extensions. +# -All (Required. Set the new license type on all installed extensions. # By default the value is set only if license type is undefined undefined) -# +# # The script uses a function ConvertTo-HashTable that was created by Adam Bertram (@adam-bertram). # The function was originally published on https://4sysops.com/archives/convert-json-to-a-powershell-hash-table/ # and is used here with the author's permission. # param ( - [Parameter (Mandatory=$false)] - [string] $SubId, - [Parameter (Mandatory= $false)] - [string] $ResourceGroup, - [Parameter (Mandatory= $false)] - [string] $MachineName, + [Parameter (Mandatory=$false)] + [string] $SubId, + [Parameter (Mandatory= $false)] + [string] $ResourceGroup, + [Parameter (Mandatory= $false)] + [string] $MachineName, [Parameter (Mandatory= $true)] [ValidateSet("PAYG","Paid","LicenseOnly", IgnoreCase=$false)] - [string] $LicenseType, + [string] $LicenseType, [Parameter (Mandatory= $false)] [boolean] $All=$false ) @@ -43,7 +43,7 @@ function CheckModule ($m) { if (!(Get-Module | Where-Object {$_.Name -eq $m})) { # If module is not imported, but available on disk then import if (Get-Module -ListAvailable | Where-Object {$_.Name -eq $m}) { - Import-Module $m + Import-Module $m } else { @@ -86,7 +86,7 @@ function ConvertTo-Hashtable { ) ## Return the array but don't enumerate it because the object may be pretty complex Write-Output -NoEnumerate $collection - } elseif ($InputObject -is [psobject]) { + } elseif ($InputObject -is [psobject]) { ## If the object has properties that need enumeration, cxonvert it to its own hash table and return it $hash = @{} foreach ($property in $InputObject.PSObject.Properties) { @@ -119,7 +119,7 @@ $requiredModules | Foreach-Object {CheckModule $_} if ($SubId -like "*.csv") { $subscriptions = Import-Csv $SubId }elseif($SubId -ne $null){ - $subscriptions = [PSCustomObject]@{SubscriptionId = $SubId} | Get-AzSubscription + $subscriptions = [PSCustomObject]@{SubscriptionId = $SubId} | Get-AzSubscription }else{ $subscriptions = Get-AzSubscription } @@ -127,19 +127,19 @@ if ($SubId -like "*.csv") { Write-Host ([Environment]::NewLine + "-- Scanning subscriptions --") -# Scan arc-enabled servers in each subscription +# Scan arc-enabled servers in each subscription foreach ($sub in $subscriptions){ if ($sub.State -ne "Enabled") {continue} try { - Set-AzContext -SubscriptionId $sub.Id + Set-AzContext -SubscriptionId $sub.Id }catch { write-host "Invalid subscription: $($sub.Id)" {continue} } - + $query = " resources | where type =~ 'microsoft.hybridcompute/machines/extensions' @@ -149,40 +149,40 @@ foreach ($sub in $subscriptions){ | parse id with * '/providers/Microsoft.HybridCompute/machines/' machineName '/extensions/' * | project machineName, extensionName = name, resourceGroup, location, subscriptionId, extensionPublisher, extensionType, properties " - - if ($MachineName) {$query += "| where machineName =~ '$($MachineName)'"} + + if ($MachineName) {$query += "| where machineName =~ '$($MachineName)'"} if ($ResourceGroup) {$query += "| where resourceGroup =~ '$($ResourceGroup)'"} $resources = Search-AzGraph -Query "$($query) | where subscriptionId =~ '$($sub.Id)'" foreach ($r in $resources) { $setID = @{ - MachineName = $r.MachineName - Name = $r.extensionName - ResourceGroup = $r.resourceGroup - Location = $r.location + MachineName = $r.MachineName + Name = $r.extensionName + ResourceGroup = $r.resourceGroup + Location = $r.location SubscriptionId = $r.subscriptionId Publisher = $r.extensionPublisher - ExtensionType = $r.extensionType + ExtensionType = $r.extensionType } $settings = @{} $settings = $r.properties.settings | ConvertTo-Json | ConvertFrom-Json | ConvertTo-Hashtable - + if ($settings.ContainsKey("LicenseType")) { if ($All) { if ($settings["LicenseType"] -ne $LicenseType ) { - $settings["LicenseType"] = $LicenseType + $settings["LicenseType"] = $LicenseType Write-Host "Resource group: [$($r.resourceGroup)] Connected machine: [$($r.MachineName)] : License type: [$($settings["LicenseType"])]" Set-AzConnectedMachineExtension @setId -Settings $settings -NoWait | Out-Null } - } + } } else { - $settings["LicenseType"] = $LicenseType + $settings["LicenseType"] = $LicenseType Write-Host "Resource group: [$($r.resourceGroup)] Connected machine: [$($r.MachineName)] : License type: [$($settings["LicenseType"])]" Set-AzConnectedMachineExtension @setId -Settings $settings -NoWait | Out-Null } - } + } } - + \ No newline at end of file diff --git a/samples/manage/azure-automation-automated-export/AutoExport.ps1 b/samples/manage/azure-automation-automated-export/AutoExport.ps1 index 14b0cea2..146766f8 100644 --- a/samples/manage/azure-automation-automated-export/AutoExport.ps1 +++ b/samples/manage/azure-automation-automated-export/AutoExport.ps1 @@ -56,7 +56,7 @@ function CreateDatabaseObject($databaseName, $serverName) $dbObj = New-Object System.Object; # Add the DatabaseName property and set it. $dbObj | Add-Member -type NoteProperty -name DatabaseName -Value $databaseName; - # Add a unique time at the end of DatabaseCopyName so that we have a unique database name every time. + # Add a unique time at the end of DatabaseCopyName so that we have a unique database name every time. $currentTime = Get-Date -format "_yyyy-MM-dd_HH:mm.ss"; $dbCopyName = $databaseName + $currentTime; # Add the DatabaseCopyName property and set it. @@ -297,7 +297,7 @@ for($currentRun = 0; $currentRun -lt ([math]::Ceiling($databaseServerPairs.Lengt for($currentIndex; $currentIndex -lt $global:databaseServerPairs.Length -and $currentIndex -lt ($currentRun*$batchingLimit + $batchingLimit); $currentIndex++) { $global:dbs.Add((CreateDatabaseObject $global:databaseServerPairs[$currentIndex].DatabaseName $global:databaseServerPairs[$currentIndex].ServerName)) - } + } # Continually call ExportProcess until all of the database objects have been removed from the array. while($global:dbs.Count -gt 0) diff --git a/samples/manage/azure-automation-automated-export/README.md b/samples/manage/azure-automation-automated-export/README.md index ac3fcce7..b0718723 100644 --- a/samples/manage/azure-automation-automated-export/README.md +++ b/samples/manage/azure-automation-automated-export/README.md @@ -48,7 +48,7 @@ Save the AutoExport.ps1 and AutoExportBlobRetention.ps1 files locally to make th - **$waitTimeInMinutes:** This tells the script how long it can wait for an operation to complete before it fails. - **$storageKeyVariableName:** This is the Azure Automation string Variable name you created to store your Storage Key. - **$storageAccountName:** This is the name of the storage account you are exporting to. - - **$connectionAssetName:** Connection Asset Name for Authenticating (Keep as AzureClassicRunAsConnection if you created the default RunAs accounts) + - **$connectionAssetName:** Connection Asset Name for Authenticating (Keep as AzureClassicRunAsConnection if you created the default RunAs accounts) 2. In AutoExportBlobRetention, here are the values that need to be modified: - **$storageKeyVariableName:** This is the Azure Automation string Variable name you created to store your Storage Key. - **$storageAccountName:** This is the name of your Storage Account you exported your bacpacs to. diff --git a/samples/manage/azure-hybrid-benefit/DiscoverSql.ps1 b/samples/manage/azure-hybrid-benefit/DiscoverSql.ps1 index 2963f248..2679de2e 100644 --- a/samples/manage/azure-hybrid-benefit/DiscoverSql.ps1 +++ b/samples/manage/azure-hybrid-benefit/DiscoverSql.ps1 @@ -1,8 +1,8 @@ - + # This script checks if SQL Server is installed on Windows - - [string] $SqlInstalled = "" + + [string] $SqlInstalled = "" $regPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' if (Test-Path $regPath) { $inst = (get-itemproperty $regPath).InstalledInstances @@ -10,7 +10,7 @@ foreach ($i in $inst) { # Read registry data # - $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i + $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i $setupValues = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup") $edition = ($setupValues.Edition -split ' ')[0] $version = ($setupValues.Version) diff --git a/samples/manage/azure-hybrid-benefit/DiscoverSql.sh b/samples/manage/azure-hybrid-benefit/DiscoverSql.sh index 92538704..c6560a4d 100644 --- a/samples/manage/azure-hybrid-benefit/DiscoverSql.sh +++ b/samples/manage/azure-hybrid-benefit/DiscoverSql.sh @@ -1,7 +1,7 @@ if ! systemctl is-active --quiet mssql-server.service; then dir - - echo "False" - exit - else - echo "True" + + echo "False" + exit + else + echo "True" fi \ No newline at end of file diff --git a/samples/manage/azure-hybrid-benefit/README.md b/samples/manage/azure-hybrid-benefit/README.md index ea21e4da..49d7495e 100644 --- a/samples/manage/azure-hybrid-benefit/README.md +++ b/samples/manage/azure-hybrid-benefit/README.md @@ -8,7 +8,7 @@ ms.date: 01/07/2023 # Overview -This script provides a simple solution to analyze and track the consolidated utilization of SQL Server licenses by all of the SQL resources in a specific subscription or the entire account. By default, the script scans all subscriptions the user account has access to. Alternatively, you can specify a single subscription or a .CSV file with a list of subscriptions. +This script provides a simple solution to analyze and track the consolidated utilization of SQL Server licenses by all of the SQL resources in a specific subscription or the entire account. By default, the script scans all subscriptions the user account has access to. Alternatively, you can specify a single subscription or a .CSV file with a list of subscriptions. | **Category** | **Description** | |:--|:--| @@ -29,12 +29,12 @@ This script provides a simple solution to analyze and track the consolidated uti |Unknown vCores|Total vCores used by Azure SQL Server resources with an unknown edition or service tier| The following resources are in scope for the license utilization analysis: -- Azure SQL databases (vCore-based purchasing model only) +- Azure SQL databases (vCore-based purchasing model only) - Azure SQL elastic pools (vCore-based purchasing model only) - Azure SQL managed instances - Azure SQL instance pools - Azure Data Factory SSIS integration runtimes -- SQL Servers in Azure virtual machines +- SQL Servers in Azure virtual machines - SQL Servers in Azure virtual machines hosted in Azure dedicated host >[!NOTE] @@ -45,9 +45,9 @@ The following resources are in scope for the license utilization analysis: # Required permissions -You must be at least a *Reader* of each subscription you scan. If you report unregistered vCores, you must have the `Microsoft.Compute/virtualMachines/runCommand/action` permission. The [Virtual Machine Contributor](https://learn.microsoft.com/azure/role-based-access-control/built-in-roles#virtual-machine-contributor) role and higher levels have this permission. If you don't have this permission, the tool will shows zero value for unregistered cores. +You must be at least a *Reader* of each subscription you scan. If you report unregistered vCores, you must have the `Microsoft.Compute/virtualMachines/runCommand/action` permission. The [Virtual Machine Contributor](https://learn.microsoft.com/azure/role-based-access-control/built-in-roles#virtual-machine-contributor) role and higher levels have this permission. If you don't have this permission, the tool will shows zero value for unregistered cores. -# Launching the script +# Launching the script The script accepts the following command line parameters: @@ -55,7 +55,7 @@ The script accepts the following command line parameters: |:--|:--|:--| |-SubId|subscription_id *or* a file_name|Optional: subscription id or a .csv file with the list of subscriptions1| |-UseInRunbook| \$True or \$False (default) |Optional: must be $True when executed as a Runbook| -|-Server|[protocol:]server[instance_name][,port]|Optional: SQL Server connection endpoint to save data to the database.
    Must be accompanied by -Database and -Cred | +|-Server|[protocol:]server[instance_name][,port]|Optional: SQL Server connection endpoint to save data to the database.
    Must be accompanied by -Database and -Cred | |-Database|database_name|Optional: database name where data will be saved.
    Must be accompanied by -Server and -Cred| |-Cred|credential_object|Optional: value of type PSCredential to securely pass database user and password| |-FilePath|csv_file_name|Optional: filename where the data will be saved in a .csv format. Ignored if database parameters are specified| @@ -63,12 +63,12 @@ The script accepts the following command line parameters: 1You can create a .csv file using the following command and then edit to remove the subscriptions you don't want to scan. ```PowerShell -Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation +Get-AzSubscription | Export-Csv .\mysubscriptions.csv -NoTypeInformation ``` If both database parameters and *FilePath* are omitted, the script will write the results to a `.\sql-license-usage.csv` file. The file is created automatically. If the file already exists, the consecutive scans will append the results to it. If the database parameters are specified, the data will be saved in a *Usage-per-subscription* table. If the table doesn't exist, it will be created automatically. >[!IMPORTANT] -> Selecting `-ShowUnregistered` option will substantially increase the execution time, especially for the subscriptions with large numbers of virtual machines. +> Selecting `-ShowUnregistered` option will substantially increase the execution time, especially for the subscriptions with large numbers of virtual machines. ## Example 1 @@ -92,7 +92,7 @@ The following command will scan all the subscriptions the user has access to and ```PowerShell $cred = Get-Credential -.\sql-license-usage.ps1 -Server my-westus2-server.database.windows.net -Database sql-license-usage -Cred $cred +.\sql-license-usage.ps1 -Server my-westus2-server.database.windows.net -Database sql-license-usage -Cred $cred ``` ## Example 4 @@ -104,7 +104,7 @@ $params =@{ Server="my-westus2-server.database.windows.net"; Database="sql-license-usage"; Cred=Get-Credential; -} +} .\sql-license-usage.ps1 @params ``` @@ -132,7 +132,7 @@ To run the script in the Cloud Shell, use the following steps: # Running the script as a Azure runbook -You can track your license utilization over time by running this script on schedule as a runbook. To set it up using Azure Portal, follow these steps. +You can track your license utilization over time by running this script on schedule as a runbook. To set it up using Azure Portal, follow these steps. 1. Open a command shell on your device and run this command. It will copy the script to your local folder. ```console @@ -159,7 +159,7 @@ curl https://raw.githubusercontent.com/microsoft/sql-server-samples/master/sampl - USEINRUNBOOKS. Select True to activate the logic that authenticates the runbook using the *Azure Run As Account*. 1. Click **OK** to link to the schedule and **OK** again to create the job. -For more information about the runbooks, see the [Runbook tutorial](https://docs.microsoft.com/en-us/azure/automation/learn/automation-tutorial-runbook-textual-powershell) +For more information about the runbooks, see the [Runbook tutorial](https://docs.microsoft.com/en-us/azure/automation/learn/automation-tutorial-runbook-textual-powershell) >[!IMPORTANT] > When running the script as a runbook, it is necessary to save the data in a database so that the results could be analyzed outside of the runbook. diff --git a/samples/manage/azure-hybrid-benefit/get-sqlvm-inventory.ps1 b/samples/manage/azure-hybrid-benefit/get-sqlvm-inventory.ps1 index 7029b37c..591cd8f0 100644 --- a/samples/manage/azure-hybrid-benefit/get-sqlvm-inventory.ps1 +++ b/samples/manage/azure-hybrid-benefit/get-sqlvm-inventory.ps1 @@ -16,14 +16,14 @@ # IaaS registration status # # The script accepts the following command line parameters: -# +# # -SubId [subscription_id] (Optional. If not specified all subscription the user has access to Accepts a .csv file with the list of subscriptions) # -FilePath [csv_file_name] (Optional. Sprcifies a .csv file to save the data. if not specified, saves it in sql-vcm-inventory.csv) -# +# param ( - [Parameter (Mandatory= $false)] - [string] $SubId, + [Parameter (Mandatory= $false)] + [string] $SubId, [Parameter (Mandatory= $false)] [string] $FilePath @@ -37,7 +37,7 @@ function CheckModule ($m) { if (!(Get-Module | Where-Object {$_.Name -eq $m})) { # If module is not imported, but available on disk then import if (Get-Module -ListAvailable | Where-Object {$_.Name -eq $m}) { - Import-Module $m + Import-Module $m } else { @@ -58,7 +58,7 @@ function CheckModule ($m) { function GetVCores { # This function translates each VM or Host sku type and name into vCores - + [CmdletBinding()] param ( [Parameter(Mandatory)] @@ -66,32 +66,32 @@ function GetVCores { [Parameter(Mandatory)] [string]$name ) - + if ($global:VM_SKUs.Count -eq 0){ $global:VM_SKUs = Get-AzComputeResourceSku "westus" | where-object {$_.ResourceType -in 'virtualMachines','hostGroups/hosts'} } # Select first size and get the VCPus available $size_info = $global:VM_SKUs | Where-Object {$_.ResourceType.Contains($type) -and ($_.Name -eq $name)} | Select-Object -First 1 - + # Save the VCPU count switch ($type) { "hosts" {$vcpu = $size_info.Capabilities | Where-Object {$_.name -eq "Cores"} } "virtualMachines" {$vcpu = $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} } } - + if ($vcpu){ return $vcpu.Value } else { return 0 - } + } } function DiscoveryOnWindows { - + # This script checks if SQL Server is installed on Windows - - [string] $SqlInstalled = "" + + [string] $SqlInstalled = "" $regPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' if (Test-Path $regPath) { $inst = (get-itemproperty $regPath).InstalledInstances @@ -99,7 +99,7 @@ function DiscoveryOnWindows { foreach ($i in $inst) { # Read registry data # - $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i + $p = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i $setupValues = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup") $edition = ($setupValues.Edition -split ' ')[0] $version = ($setupValues.Version) @@ -111,15 +111,15 @@ function DiscoveryOnWindows { # # This script checks if SQL Server is installed on Linux -# -# +# +# $DiscoveryOnLinux = 'if ! systemctl is-active --quiet mssql-server.service; then dir - - echo "False" - exit - else - echo "True" + + echo "False" + exit + else + echo "True" fi' @@ -150,13 +150,13 @@ New-Item -ItemType file -path DiscoverSql.sh -value $DiscoveryOnLinux -Force | if ($SubId -like "*.csv") { $subscriptions = Import-Csv $SubId }elseif($SubId.length -gt 0){ - $subscriptions = [PSCustomObject]@{SubscriptionId = $SubId} | Get-AzSubscription + $subscriptions = [PSCustomObject]@{SubscriptionId = $SubId} | Get-AzSubscription }else{ $subscriptions = Get-AzSubscription } -#File setup +#File setup if (!$PSBoundParameters.ContainsKey("FilePath")) { $FilePath = '.\sql-vm-inventory.csv' } @@ -168,51 +168,51 @@ $global:VM_SKUs = @{} # To hold the VM SKU table for future use Write-Host ([Environment]::NewLine + "-- Scanning subscriptions --") -# Calculate usage for each subscription +# Calculate usage for each subscription foreach ($sub in $subscriptions){ if ($sub.State -ne "Enabled") {continue} try { - Set-AzContext -SubscriptionId $sub.Id + Set-AzContext -SubscriptionId $sub.Id }catch { write-host "Invalid subscription: " $sub.Id {continue} } - # Reset the subtotals + # Reset the subtotals #$subtotal.psobject.properties.name | Foreach-object {$subtotal.$_ = 0} - + # Get all resource groups in the subscription #$rgs = Get-AzResourceGroup - - # Scan all VMs with SQL server installed using a parallel loop (up to 10 at a time). + + # Scan all VMs with SQL server installed using a parallel loop (up to 10 at a time). # NOTE: ForEach-Object -Parallel requires PS v7.1 or higher if ($PSVersionTable.PSVersion.Major -ge 7){ #Get-AzVM -Status | Where-Object { $_.powerstate -eq 'VM running' } | ForEach-Object -ThrottleLimit 10 -Parallel { Get-AzVM -Status | Where-Object { $_.powerstate -eq 'VM running' } | ForEach-Object { - #$function:GetVCores = $using:GetVCoresDef + #$function:GetVCores = $using:GetVCoresDef $SqlEdition = '' $SqlVersion = '' $vCores = GetVCores -type 'virtualMachines' -name $_.HardwareProfile.VmSize $sql_vm = Get-AzSqlVm -ResourceGroupName $_.ResourceGroupName -Name $_.Name -ErrorAction Ignore - - + + if ($sql_vm) { $RegStatus = 'SQL Server registered' $SqlEdition = $Sql_vm.Sku $SqlVersion = $Sql_vm.Offer } else { - if ($_.StorageProfile.OSDisk.OSType -eq "Windows"){ + if ($_.StorageProfile.OSDisk.OSType -eq "Windows"){ $params =@{ ResourceGroupName = $_.ResourceGroupName Name = $_.Name CommandId = 'RunPowerShellScript' ScriptPath = 'DiscoverSql.ps1' ErrorAction = 'Stop' - } + } } else { $params =@{ @@ -221,11 +221,11 @@ foreach ($sub in $subscriptions){ CommandId = 'RunShellScript' ScriptPath = 'DiscoverSql.sh' ErrorAction = 'Stop' - } + } } - try { - $out = Invoke-AzVMRunCommand @params - if (!$out.Value[0].Message){ + try { + $out = Invoke-AzVMRunCommand @params + if (!$out.Value[0].Message){ $RegStatus = 'SQL Server not installed' } else { @@ -233,21 +233,21 @@ foreach ($sub in $subscriptions){ $RegStatus = 'SQL Server not registered' } } - catch { - $RegStatus = 'No VM access' + catch { + $RegStatus = 'No VM access' } - } + } $inventoryTable += ,(@( $sub.Name, $sub.Id, $_.ResourceGroupName, $_.Name, $_.Location, $_.HardwareProfile.VmSize, $vCores, $_.StorageProfile.ImageReference.Offer, $_.StorageProfile.ImageReference.Sku, $SqlVersion, $SqlEdition, $RegStatus)) #write-host $_.ResourceGroupName $_.Name $_.Location $_.HardwareProfile.VmSize $vCores $_.StorageProfile.ImageReference.Offer $_.StorageProfile.ImageReference.Sku $SqlVersion $SqlEdition $RegStatus - } - } + } + } [system.gc]::Collect() } - + # Write usage data to the .csv file if ($FilePath){ - (ConvertFrom-Csv ($inventoryTable | %{$_ -join ','})) | Export-Csv $FilePath -NoType #-Append + (ConvertFrom-Csv ($inventoryTable | %{$_ -join ','})) | Export-Csv $FilePath -NoType #-Append Write-Host ([Environment]::NewLine + "-- Added the usage data to $FilePath --") } else { Write-Host $inventoryTable diff --git a/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 b/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 index cf6d98d4..7eb2d7a8 100644 --- a/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 +++ b/samples/manage/azure-hybrid-benefit/sql-license-usage.ps1 @@ -1,22 +1,22 @@ # -# This script provides a simple solution to analyze and track the consolidated utilization of SQL Server licenses -# by all of the SQL resources in a specific subscription or the entire the account. By default, the script scans -# all subscriptions the user account has access. Alternatively, you can specify a single subscription or a .CSV file +# This script provides a simple solution to analyze and track the consolidated utilization of SQL Server licenses +# by all of the SQL resources in a specific subscription or the entire the account. By default, the script scans +# all subscriptions the user account has access. Alternatively, you can specify a single subscription or a .CSV file # with a list of subscription. The usage report includes the following information for each scanned subscription. # # The following resources are in scope for the license utilization analysis: -# - Azure SQL databases (vCore-based purchasing model only) +# - Azure SQL databases (vCore-based purchasing model only) # - Azure SQL elastic pools (vCore-based purchasing model only) # - Azure SQL managed instances # - Azure SQL instance pools # - Azure Data Factory SSIS integration runtimes -# - SQL Servers in Azure virtual machines +# - SQL Servers in Azure virtual machines # - SQL Servers in Azure virtual machines hosted in Azure dedicated host # # NOTE: The script does not calculate usage for Azure SQL resources that use the DTU-based purchasing model # # The script accepts the following command line parameters: -# +# # -SubId [subscription_id] | [csv_file_name] (Accepts a .csv file with the list of subscriptions) # -Server [protocol:]server[instance_name][,port] (Required to save data to the database) # -Database [database_name] (Required to save data to the database) @@ -24,21 +24,21 @@ # -FilePath [csv_file_name] (Required to save data in a .csv format. Ignored if database parameters are specified) # -UseInRunbook [True] | [False] (Required when executed as a Runbook) # -ShowUnregistered [True] | [False] (Optional. If specified, checks every VM if SQL server is installed) -# +# param ( - [Parameter (Mandatory= $false)] - [string] $SubId, [Parameter (Mandatory= $false)] - [string] $Server, + [string] $SubId, [Parameter (Mandatory= $false)] - [PSCredential] $Cred, + [string] $Server, [Parameter (Mandatory= $false)] - [string] $Database, + [PSCredential] $Cred, [Parameter (Mandatory= $false)] - [string] $FilePath, + [string] $Database, [Parameter (Mandatory= $false)] - [bool] $UseInRunbook = $false, + [string] $FilePath, + [Parameter (Mandatory= $false)] + [bool] $UseInRunbook = $false, [Parameter (Mandatory= $false)] [bool] $ShowNC = $false, [Parameter (Mandatory= $false)] @@ -54,7 +54,7 @@ function CheckModule ($m) { if (!(Get-Module | Where-Object {$_.Name -eq $m})) { # If module is not imported, but available on disk then import if (Get-Module -ListAvailable | Where-Object {$_.Name -eq $m}) { - Import-Module $m + Import-Module $m } else { @@ -75,7 +75,7 @@ function CheckModule ($m) { function GetVCores { # This function translates each VM or Host sku type and name into vCores - + [CmdletBinding()] param ( [Parameter(Mandatory)] @@ -83,29 +83,29 @@ function GetVCores { [Parameter(Mandatory)] [string]$name ) - + if ($global:VM_SKUs.Count -eq 0){ $global:VM_SKUs = Get-AzComputeResourceSku "westus" | where-object {$_.ResourceType -in 'virtualMachines','hostGroups/hosts'} } # Select first size and get the VCPus available $size_info = $global:VM_SKUs | Where-Object {$_.ResourceType.Contains($type) -and ($_.Name -eq $name)} | Select-Object -First 1 - + # Save the VCPU count switch ($type) { "hosts" {$vcpu = $size_info.Capabilities | Where-Object {$_.name -eq "Cores"} } "virtualMachines" {$vcpu = $size_info.Capabilities | Where-Object {$_.name -eq "vCPUsAvailable"} } } - + if ($vcpu){ return $vcpu.Value } else { return 0 - } + } } function AddVCores { # This function breaks down vCores into the $subtotal columns - + [CmdletBinding()] param ( [Parameter(Mandatory=$false)] @@ -120,45 +120,45 @@ function AddVCores { "BusinessCritical" { switch ($LicenseType) { "BasePrice" {$script:subtotal.ahb_ent += $CoreCount} - "LicenseIncluded" {$script:subtotal.payg_ent += $CoreCount} - default {$script:subtotal.payg_ent += $CoreCount} + "LicenseIncluded" {$script:subtotal.payg_ent += $CoreCount} + default {$script:subtotal.payg_ent += $CoreCount} } } "GeneralPurpose" { switch ($LicenseType) { "BasePrice" {$script:subtotal.ahb_std += $CoreCount} - "LicenseIncluded" {$script:subtotal.payg_std += $CoreCount} + "LicenseIncluded" {$script:subtotal.payg_std += $CoreCount} default {$script:subtotal.payg_std += $CoreCount} } } "Hyperscale" { switch ($LicenseType) { "BasePrice" {$script:subtotal.ahb_std += $CoreCount} - "LicenseIncluded" {$script:subtotal.payg_std += $CoreCount} - default {$script:subtotal.payg_std += $CoreCount} + "LicenseIncluded" {$script:subtotal.payg_std += $CoreCount} + default {$script:subtotal.payg_std += $CoreCount} } } "Enterprise" { switch ($LicenseType) { "BasePrice" {$script:subtotal.ahb_ent += $CoreCount} - "LicenseIncluded" {$script:subtotal.payg_ent += $CoreCount} + "LicenseIncluded" {$script:subtotal.payg_ent += $CoreCount} "AHUB" {$script:subtotal.ahb_ent += $CoreCount} "DR" {$script:subtotal.hadr_ent += $CoreCount} - "PAYG" {$script:subtotal.payg_ent += $CoreCount} - default {$script:subtotal.payg_ent += $CoreCount} + "PAYG" {$script:subtotal.payg_ent += $CoreCount} + default {$script:subtotal.payg_ent += $CoreCount} } } "Standard" { switch ($LicenseType) { "BasePrice" {$script:subtotal.ahb_std += $CoreCount} - "LicenseIncluded" {$script:subtotal.payg_std += $CoreCount} + "LicenseIncluded" {$script:subtotal.payg_std += $CoreCount} "AHUB" {$script:subtotal.ahb_std += $CoreCount} "DR" {$script:subtotal.hadr_std += $CoreCount} - "PAYG" {$script:subtotal.payg_std += $CoreCount} + "PAYG" {$script:subtotal.payg_std += $CoreCount} default {$script:subtotal.payg_std += $CoreCount} } } - "Developer" { + "Developer" { $script:subtotal.developer += $CoreCount } "Express" { @@ -167,14 +167,14 @@ function AddVCores { default { $script:subtotal.unknown_tier += $CoreCount } - } + } } function DiscoveryOnWindows { - + # This script checks if SQL Server is installed on Windows - - [bool] $SqlInstalled = $false + + [bool] $SqlInstalled = $false $regPath = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' if (Test-Path $regPath) { $inst = (get-itemproperty $regPath).InstalledInstances @@ -190,14 +190,14 @@ Update-AzConfig -DisplayBreakingChangeWarning $false # # This script checks if SQL Server is installed on Linux -# -# +# +# $DiscoveryOnLinux = - 'if ! systemctl is-active --quiet mssql-server.service; then - echo "False" - exit - else - echo "True" + 'if ! systemctl is-active --quiet mssql-server.service; then + echo "False" + exit + else + echo "True" fi' @@ -252,24 +252,24 @@ New-Item -ItemType file -path DiscoverSql.sh -value $DiscoveryOnLinux -Force | if ($SubId -like "*.csv") { $subscriptions = Import-Csv $SubId }elseif($SubId -ne $null){ - $subscriptions = [PSCustomObject]@{SubscriptionId = $SubId} | Get-AzSubscription + $subscriptions = [PSCustomObject]@{SubscriptionId = $SubId} | Get-AzSubscription }else{ $subscriptions = Get-AzSubscription } [bool] $useDatabase = $PSBoundParameters.ContainsKey("Server") -and $PSBoundParameters.ContainsKey("Cred") -and $PSBoundParameters.ContainsKey("Database") -# Initialize tables and arrays +# Initialize tables and arrays if ($useDatabase){ - + #Database setup #$cred = New-Object System.Management.Automation.PSCredential($Username,$Password) - + [String] $tableName = "Usage-per-subscription" - [String] $testSQL = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_SCHEMA = 'dbo' + [String] $testSQL = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '$tableName'" [String] $createSQL = "CREATE TABLE [dbo].[$tableName]( [Date] [date] NOT NULL, @@ -304,9 +304,9 @@ if ($useDatabase){ [Developer_vCores], [Express_vCores], [Unregistered_vCores], - [Unknown_vCores]) - VALUES - ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}' )" + [Unknown_vCores]) + VALUES + ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}','{12}','{13}','{14}','{15}' )" $propertiesToSplat = @{ Database = $Database ServerInstance = $Server @@ -314,7 +314,7 @@ if ($useDatabase){ Password = $Cred.GetNetworkCredential().Password Query = $testSQL } - + # Create table if does not exist if ((Invoke-SQLCmd @propertiesToSplat).Column1 -eq 0) { $propertiesToSplat.Query = $createSQL @@ -323,7 +323,7 @@ if ($useDatabase){ }else{ - #File setup + #File setup if (!$PSBoundParameters.ContainsKey("FilePath")) { $FilePath = '.\sql-license-usage.csv' } @@ -339,27 +339,27 @@ $subtotal = [pscustomobject]@{ahb_std=0; ahb_ent=0; payg_std=0; payg_ent=0; hadr Write-Host ([Environment]::NewLine + "-- Scanning subscriptions --") -# Calculate usage for each subscription +# Calculate usage for each subscription foreach ($sub in $subscriptions){ if ($sub.State -ne "Enabled") {continue} try { - Set-AzContext -SubscriptionId $sub.Id + Set-AzContext -SubscriptionId $sub.Id }catch { write-host "Invalid subscription: " $sub.Id {continue} } - # Reset the subtotals + # Reset the subtotals $subtotal.psobject.properties.name | Foreach-object {$subtotal.$_ = 0} - + # Get all resource groups in the subscription $rgs = Get-AzResourceGroup - + # Get all logical servers - $servers = Get-AzSqlServer + $servers = Get-AzSqlServer # Scan all vCore-based SQL database resources in the subscription $servers | Get-AzSqlDatabase | Where-Object { $_.SkuName -ne "ElasticPool" -and $_.Edition -in "GeneralPurpose", "BusinessCritical", "Hyperscale"} | Foreach-Object { @@ -378,7 +378,7 @@ foreach ($sub in $subscriptions){ AddVCores -Tier $_.Sku.Tier -LicenseType $_.LicenseType -CoreCount $_.VCores } [system.gc]::Collect() - + # Scan all instance pool resources in the subscription Get-AzSqlInstancePool | Foreach-Object { AddVCores -Tier $_.Edition -LicenseType $_.LicenseType -CoreCount $_.VCores @@ -388,54 +388,54 @@ foreach ($sub in $subscriptions){ # Scan all SSIS imtegration runtime resources in the subscription $rgs | Get-AzDataFactoryV2 | Get-AzDataFactoryV2IntegrationRuntime | Where-Object { $_.State -eq "Started" -and $_.Nodesize -ne $null } | Foreach-Object { $vCores = GetVCores -type "virtualMachines" -name $_.NodeSize - AddVCores -Tier $_.Edition -LicenseType $_.LicenseType -CoreCount $vCores + AddVCores -Tier $_.Edition -LicenseType $_.LicenseType -CoreCount $vCores } [system.gc]::Collect() - # Scan all VMs with SQL server installed using a parallel loop (up to 10 at a time). For that reason function AddVCores is not used + # Scan all VMs with SQL server installed using a parallel loop (up to 10 at a time). For that reason function AddVCores is not used # NOTE: ForEach-Object -Parallel is not supported in Runbooks (requires PS v7.1) if ($PSVersionTable.PSVersion.Major -ge 7){ $vms = Get-AzVM -Status | Where-Object { $_.powerstate -eq 'VM running' } | ForEach-Object -ThrottleLimit 10 -Parallel { - $function:GetVCores = $using:GetVCoresDef + $function:GetVCores = $using:GetVCoresDef $vCores = GetVCores -type 'virtualMachines' -name $_.HardwareProfile.VmSize $sql_vm = Get-AzSqlVm -ResourceGroupName $_.ResourceGroupName -Name $_.Name -ErrorAction Ignore - + if ($sql_vm) { switch ($sql_vm.Sku) { "Enterprise" { switch ($sql_vm.LicenseType) { "AHUB" {$($using:subtotal).ahb_ent += $vCores} "DR" {$($using:subtotal).hadr_ent += $vCores} - "PAYG" {$($using:subtotal).payg_ent += $vCores} - default {$($using:subtotal).payg_ent += $vCores} + "PAYG" {$($using:subtotal).payg_ent += $vCores} + default {$($using:subtotal).payg_ent += $vCores} } } "Standard" { switch ($sql_vm.LicenseType) { "AHUB" {$($using:subtotal).ahb_std += $vCores} "DR" {$($using:subtotal).hadr_std += $vCores} - "PAYG" {$($using:subtotal).payg_std += $vCores} + "PAYG" {$($using:subtotal).payg_std += $vCores} default {$($using:subtotal).payg_std += $vCores} } } - "Developer" { + "Developer" { $($using:subtotal).developer += $vCores } "Express" { $($using:subtotal).express += $vCores - } - } + } + } } else { if ($($using:ShowUnregistered)){ - if ($_.StorageProfile.OSDisk.OSType -eq "Windows"){ + if ($_.StorageProfile.OSDisk.OSType -eq "Windows"){ $params =@{ ResourceGroupName = $_.ResourceGroupName Name = $_.Name CommandId = 'RunPowerShellScript' ScriptPath = 'DiscoverSql.ps1' ErrorAction = 'Stop' - } + } } else { $params =@{ @@ -444,38 +444,38 @@ foreach ($sub in $subscriptions){ CommandId = 'RunShellScript' ScriptPath = 'DiscoverSql.sh' ErrorAction = 'Stop' - } + } } - try { - $out = Invoke-AzVMRunCommand @params - if ($out.Value[0].Message.Contains('True')){ - $($using:subtotal).unreg_sqlvm += $vCores - } + try { + $out = Invoke-AzVMRunCommand @params + if ($out.Value[0].Message.Contains('True')){ + $($using:subtotal).unreg_sqlvm += $vCores + } } - catch { + catch { write-host $params.Name "No acceaa" } } } - } + } } else { Get-AzVM -Status | Where-Object { $_.powerstate -eq 'VM running' } | ForEach-Object { $vCores = GetVCores -type 'virtualMachines' -name $_.HardwareProfile.VmSize $sql_vm = Get-AzSqlVm -ResourceGroupName $_.ResourceGroupName -Name $_.Name -ErrorAction Ignore if ($sql_vm) { - AddVCores -Tier $sql_vm.Sku -LicenseType $sql_vm.LicenseType -CoreCount $vCores + AddVCores -Tier $sql_vm.Sku -LicenseType $sql_vm.LicenseType -CoreCount $vCores } else { if ($ShowUnregistered){ - if ($_.StorageProfile.OSDisk.OSType -eq "Windows"){ + if ($_.StorageProfile.OSDisk.OSType -eq "Windows"){ $params =@{ ResourceGroupName = $_.ResourceGroupName Name = $_.Name CommandId = 'RunPowerShellScript' ScriptPath = 'DiscoverSql.ps1' ErrorAction = 'Stop' - } + } } else { $params =@{ @@ -484,68 +484,68 @@ foreach ($sub in $subscriptions){ CommandId = 'RunShellScript' ScriptPath = 'DiscoverSql.sh' ErrorAction = 'Stop' - } + } }try { - $out = Invoke-AzVMRunCommand @params - if ($out.Value[0].Message.Contains('True')){ - $subtotal.unreg_sqlvm += $vCores + $out = Invoke-AzVMRunCommand @params + if ($out.Value[0].Message.Contains('True')){ + $subtotal.unreg_sqlvm += $vCores } } - catch { + catch { write-host $params.Name "No acceaa" } } } - } - } + } + } [system.gc]::Collect() # Scan the VMs hosts in the subscription - $host_groups = Get-AzHostGroup + $host_groups = Get-AzHostGroup # Get the dedicated host size, match it with the corresponding VCPU count and add to VCore count - + foreach ($host_group in $host_groups){ - + $vm_hosts = $host_group | Select-Object -Property @{Name = 'HostGroupName'; Expression = {$_.Name}},@{Name = 'ResourceGroupName'; Expression = {$_.ResourceGroupName}} | Get-AzHost - + foreach ($vm_host in $vm_hosts){ $token = (Get-AzAccessToken).Token $params = @{ - Uri = "https://management.azure.com/subscriptions/" + $sub.Id + - "/resourceGroups/" + $vm_host.ResourceGroupName.ToLower() + - "/providers/Microsoft.Compute/hostGroups/" + $host_group.Name + - "/hosts/" + $vm_host.Name + + Uri = "https://management.azure.com/subscriptions/" + $sub.Id + + "/resourceGroups/" + $vm_host.ResourceGroupName.ToLower() + + "/providers/Microsoft.Compute/hostGroups/" + $host_group.Name + + "/hosts/" + $vm_host.Name + "/providers/Microsoft.SoftwarePlan/hybridUseBenefits/SQL_" + $host_group.Name + "_" + $vm_host.Name + "?api-version=2019-06-01-preview" Headers = @{ 'Authorization' = "Bearer $token" } Method = 'GET' ContentType = 'application/json' } - + try { $softwarePlan = Invoke-RestMethod @params - if ($softwarePlan.Sku.Name -like "SQL*"){ + if ($softwarePlan.Sku.Name -like "SQL*"){ $subtotal.ahb_ent += (GetVCores -type 'hosts' -name $vm_host.Sku.Name) } } - catch { + catch { $sub.Id $vm_host.ResourceGroupName.ToLower() $host_group.Name $vm_host.Name $params - } + } } } [system.gc]::Collect() # Add subtotals to the usage array - + #$subtotal.psobject.properties.name | Foreach-Object {$total.$_ += $subtotal.$_} - + $Date = Get-Date -Format "yyy-MM-dd" - + $Time = Get-Date -Format "HH:mm:ss" if ($ShowNC){ $ahb_nc = ($subtotal.ahb_std + $subtotal.ahb_ent*4) @@ -563,9 +563,9 @@ foreach ($sub in $subscriptions){ } if ($useDatabase){ - Write-Host ([Environment]::NewLine + "-- Added the usage data to $tableName table --") + Write-Host ([Environment]::NewLine + "-- Added the usage data to $tableName table --") }else{ - + # Write usage data to the .csv file (ConvertFrom-Csv ($usageTable | %{$_ -join ','})) | Export-Csv $FilePath -Append -NoType diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/App.config b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/App.config index 245fd17e..b0be0139 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/App.config +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/App.config @@ -5,7 +5,7 @@
    - + diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/LoadGeneratorConsole.csproj b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/LoadGeneratorConsole.csproj index 4ccc3aab..eabda220 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/LoadGeneratorConsole.csproj +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/LoadGeneratorConsole/LoadGeneratorConsole.csproj @@ -60,7 +60,7 @@ - @@ -50,9 +50,9 @@ - \ No newline at end of file diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Content/Site.css b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Content/Site.css index 6ea5d8f6..5e35f97d 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Content/Site.css +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Content/Site.css @@ -9,8 +9,8 @@ padding-right: 15px; } -/* Override the default bootstrap behavior where horizontal description lists - will truncate terms that are too long to fit in the left column +/* Override the default bootstrap behavior where horizontal description lists + will truncate terms that are too long to fit in the left column */ .dl-horizontal dt { white-space: normal; diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/AccountController.cs b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/AccountController.cs index 035b58ea..5340271c 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/AccountController.cs +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/AccountController.cs @@ -34,9 +34,9 @@ namespace MonitoringWebApp.Controllers { return _signInManager ?? HttpContext.GetOwinContext().Get(); } - private set - { - _signInManager = value; + private set + { + _signInManager = value; } } @@ -116,9 +116,9 @@ namespace MonitoringWebApp.Controllers return View(model); } - // The following code protects for brute force attacks against the two factor codes. - // If a user enters incorrect codes for a specified amount of time then the user account - // will be locked out for a specified amount of time. + // The following code protects for brute force attacks against the two factor codes. + // If a user enters incorrect codes for a specified amount of time then the user account + // will be locked out for a specified amount of time. // You can configure the account lockout settings in IdentityConfig var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, isPersistent: model.RememberMe, rememberBrowser: model.RememberBrowser); switch (result) @@ -156,7 +156,7 @@ namespace MonitoringWebApp.Controllers if (result.Succeeded) { await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); - + // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 // Send an email with this link // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/ManageController.cs b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/ManageController.cs index 29198f3a..8c1afbea 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/ManageController.cs +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Controllers/ManageController.cs @@ -32,9 +32,9 @@ namespace MonitoringWebApp.Controllers { return _signInManager ?? HttpContext.GetOwinContext().Get(); } - private set - { - _signInManager = value; + private set + { + _signInManager = value; } } diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/MyWebSocket.cs b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/MyWebSocket.cs index 92ca6529..8c2bf20c 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/MyWebSocket.cs +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/MyWebSocket.cs @@ -107,9 +107,9 @@ namespace MonitoringWebApp { conn.Open(); - string commandText = @"SELECT Top(1) - end_time, - (SELECT Max(v) FROM(VALUES(avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v)) AS [avg_DTU_percent], + string commandText = @"SELECT Top(1) + end_time, + (SELECT Max(v) FROM(VALUES(avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v)) AS [avg_DTU_percent], dtu_limit FROM sys.dm_db_resource_stats"; @@ -119,7 +119,7 @@ namespace MonitoringWebApp SqlDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { - + result = new EDtuMetric() { EndTime = reader.GetDateTime(0), @@ -154,18 +154,18 @@ namespace MonitoringWebApp { conn.Open(); - string commandText = @"SELECT r1.database_name, r1.end_time, - (SELECT Max(v) - FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS + string commandText = @"SELECT r1.database_name, r1.end_time, + (SELECT Max(v) + FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS value(v)) AS [avg_DTU_percent], - dtu_limit + dtu_limit FROM sys.resource_stats r1 JOIN (SELECT max(end_time) end_time, database_name FROM sys.resource_stats WHERE database_name in ( - SELECT d.name - FROM sys.databases d - JOIN sys.database_service_objectives slo + SELECT d.name + FROM sys.databases d + JOIN sys.database_service_objectives slo ON d.database_id = slo.database_id WHERE elastic_pool_name = @PoolName ) @@ -218,11 +218,11 @@ namespace MonitoringWebApp { conn.Open(); - string commandText = @"SELECT end_time, - (SELECT Max(v) - FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS - value(v)) AS [avg_DTU_percent], - elastic_pool_dtu_limit + string commandText = @"SELECT end_time, + (SELECT Max(v) + FROM (VALUES (avg_cpu_percent), (avg_data_io_percent), (avg_log_write_percent)) AS + value(v)) AS [avg_DTU_percent], + elastic_pool_dtu_limit FROM sys.elastic_pool_resource_stats WHERE elastic_pool_name = @PoolName ORDER BY end_time; "; @@ -279,7 +279,7 @@ namespace MonitoringWebApp public override void OnClose(WebSocketCloseStatus? closeStatus, string closeStatusDescription) { - + } } diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Properties/Settings.Designer.cs b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Properties/Settings.Designer.cs index 638e5533..b5eaea3b 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Properties/Settings.Designer.cs +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Properties/Settings.Designer.cs @@ -9,14 +9,14 @@ //------------------------------------------------------------------------------ namespace MonitoringWebApp.Properties { - - + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - + public static Settings Default { get { return defaultInstance; diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/jquery.validate-vsdoc.js b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/jquery.validate-vsdoc.js index fd912570..855a2855 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/jquery.validate-vsdoc.js +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/jquery.validate-vsdoc.js @@ -63,7 +63,7 @@ $.extend($.fn, { } validator = new $.validator( options, this[0] ); - $.data(this[0], 'validator', validator); + $.data(this[0], 'validator', validator); if ( validator.settings.onsubmit ) { @@ -247,7 +247,7 @@ $.validator.format = function(source, params) { /// /// - if ( arguments.length == 1 ) + if ( arguments.length == 1 ) return function() { var args = $.makeArray(arguments); args.unshift(source); @@ -409,7 +409,7 @@ $.extend($.validator, { for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) { this.check( elements[i] ); } - return this.valid(); + return this.valid(); }, // http://docs.jquery.com/Plugins/Validation/Validator/element @@ -1011,7 +1011,7 @@ $.extend($.validator, { // http://docs.jquery.com/Plugins/Validation/Validator/addMethod addMethod: function(name, method, message) { /// - /// Add a custom validation method. It must consist of a name (must be a legal javascript + /// Add a custom validation method. It must consist of a name (must be a legal javascript /// identifier), a javascript based function and a default string message. /// /// @@ -1022,8 +1022,8 @@ $.extend($.validator, { /// The actual method implementation, returning true if an element is valid /// /// - /// (Optional) The default message to display for this method. Can be a function created by - /// jQuery.validator.format(value). When undefined, an already existing message is used + /// (Optional) The default message to display for this method. Can be a function created by + /// jQuery.validator.format(value). When undefined, an already existing message is used /// (handy for localization), otherwise the field-specific messages have to be defined. /// @@ -1065,7 +1065,7 @@ $.extend($.validator, { previous.originalMessage = this.settings.messages[element.name].remote; this.settings.messages[element.name].remote = previous.message; - param = typeof param == "string" && {url:param} || param; + param = typeof param == "string" && {url:param} || param; if ( this.pending[element.name] ) { return "pending"; @@ -1149,7 +1149,7 @@ $.extend($.validator, { // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/ return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value); }, - + // http://docs.jquery.com/Plugins/Validation/Methods/date date: function(value, element) { return this.optional(element) || !/Invalid|NaN/.test(new Date(value)); @@ -1201,7 +1201,7 @@ $.extend($.validator, { // http://docs.jquery.com/Plugins/Validation/Methods/accept accept: function(value, element, param) { param = typeof param == "string" ? param.replace(/,/g, '|') : "png|jpe?g|gif"; - return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); + return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i")); }, // http://docs.jquery.com/Plugins/Validation/Methods/equalTo @@ -1225,7 +1225,7 @@ $.format = $.validator.format; // ajax mode: abort // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); -// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() +// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() ;(function($) { var pendingRequests = {}; // Use a prefilter if available (1.5+) @@ -1260,7 +1260,7 @@ $.format = $.validator.format; // IE has native support, in other browsers, use event caputuring (neither bubbles) // provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation -// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target +// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target ;(function($) { // only implement if not provided by jQuery core (since 1.4) // TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/respond.js b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/respond.js index 378d773d..73b9f971 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/respond.js +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Scripts/respond.js @@ -15,30 +15,30 @@ /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */ /*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */ window.matchMedia = window.matchMedia || (function(doc, undefined){ - + var bool, docElem = doc.documentElement, refNode = docElem.firstElementChild || docElem.firstChild, // fakeBody required for fakeBody = doc.createElement('body'), div = doc.createElement('div'); - + div.id = 'mq-test-1'; div.style.cssText = "position:absolute;top:-100em"; fakeBody.style.background = "none"; fakeBody.appendChild(div); - + return function(q){ - + div.innerHTML = '­'; - + docElem.insertBefore(fakeBody, refNode); - bool = div.offsetWidth == 42; + bool = div.offsetWidth == 42; docElem.removeChild(fakeBody); - + return { matches: bool, media: q }; }; - + })(document); @@ -163,11 +163,11 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ for( ; j < eql; j++ ){ thisq = eachq[ j ]; - mediastyles.push( { + mediastyles.push( { media : thisq.split( "(" )[ 0 ].match( /(only\s+)?([a-zA-Z]+)\s?/ ) && RegExp.$2 || "all", rules : rules.length - 1, hasquery: thisq.indexOf("(") > -1, - minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), + minw : thisq.match( /\(min\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ), maxw : thisq.match( /\(max\-width:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || "" ) } ); } @@ -213,7 +213,7 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ return ret; }, - //cached container for 1em value, populated the first time it's needed + //cached container for 1em value, populated the first time it's needed eminpx, //enable/disable styles @@ -278,13 +278,13 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ //this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one! head.insertBefore( ss, lastLink.nextSibling ); - if ( ss.styleSheet ){ + if ( ss.styleSheet ){ ss.styleSheet.cssText = css; - } + } else { ss.appendChild( doc.createTextNode( css ) ); } - + //push to appendedEls to track for later removal appendedEls.push( ss ); } @@ -307,7 +307,7 @@ window.matchMedia = window.matchMedia || (function(doc, undefined){ } req.send( null ); }, - //define ajax obj + //define ajax obj xmlHttp = (function() { var xmlhttpmethod = false; try { diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Home/Index.cshtml b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Home/Index.cshtml index 15360b3b..07e10695 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Home/Index.cshtml +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Home/Index.cshtml @@ -18,12 +18,12 @@
    Source: sys.elastic_pool_resource_stats
    Last Update:
    - +

    Latest Pool Metrics

    - +
    @@ -75,7 +75,7 @@
    Last Update:
    Source: sys.resource_stats
    - + diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Manage/Index.cshtml b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Manage/Index.cshtml index 2b6285d4..a7bc7af9 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Manage/Index.cshtml +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Manage/Index.cshtml @@ -30,13 +30,13 @@ @* Phone Numbers can used as a second factor of verification in a two-factor authentication system. - + See
    this article for details on setting up this ASP.NET application to support two-factor authentication using SMS. - + Uncomment the following block after you have set up two-factor authentication *@ - @* + @*
    Phone Number:
    @(Model.PhoneNumber ?? "None") [ diff --git a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Shared/_Layout.cshtml b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Shared/_Layout.cshtml index e569c67e..b91e92fc 100644 --- a/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Shared/_Layout.cshtml +++ b/samples/manage/azure-sql-db-elastic-pools-custom-dashboard/Contoso ShopKeeper/MonitoringWebApp/Views/Shared/_Layout.cshtml @@ -6,7 +6,7 @@ @ViewBag.Title - My ASP.NET Application @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") - +